@strapi/utils 5.47.1 → 5.48.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/convert-query-params.d.ts +2 -4
- package/dist/convert-query-params.d.ts.map +1 -1
- package/dist/convert-query-params.js +54 -17
- package/dist/convert-query-params.js.map +1 -1
- package/dist/convert-query-params.mjs +53 -16
- package/dist/convert-query-params.mjs.map +1 -1
- package/dist/sort-query.d.ts +16 -0
- package/dist/sort-query.d.ts.map +1 -0
- package/dist/sort-query.js +68 -0
- package/dist/sort-query.js.map +1 -0
- package/dist/sort-query.mjs +65 -0
- package/dist/sort-query.mjs.map +1 -0
- package/dist/traverse/query-sort.d.ts.map +1 -1
- package/dist/traverse/query-sort.js +3 -1
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +3 -1
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import type { PublicationFilterMode } from './publication-filter';
|
|
2
|
+
import { type SortParams } from './sort-query';
|
|
2
3
|
import { Model } from './types';
|
|
4
|
+
export type { SortParams, SortParamsObject } from './sort-query';
|
|
3
5
|
type SortOrder = 'asc' | 'desc';
|
|
4
6
|
export interface SortMap {
|
|
5
7
|
[key: string]: SortOrder | SortMap;
|
|
6
8
|
}
|
|
7
|
-
export interface SortParamsObject {
|
|
8
|
-
[key: string]: SortOrder | SortParamsObject;
|
|
9
|
-
}
|
|
10
|
-
type SortParams = string | string[] | SortParamsObject | SortParamsObject[];
|
|
11
9
|
type FieldsParams = string | string[];
|
|
12
10
|
type FiltersParams = unknown;
|
|
13
11
|
export interface PopulateAttributesParams {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-query-params.d.ts","sourceRoot":"","sources":["../src/convert-query-params.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"convert-query-params.d.ts","sourceRoot":"","sources":["../src/convert-query-params.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,33 @@ var contentTypes = require('./content-types.js');
|
|
|
6
6
|
var errors = require('./errors.js');
|
|
7
7
|
var operators = require('./operators.js');
|
|
8
8
|
var parseType = require('./parse-type.js');
|
|
9
|
+
var sortQuery = require('./sort-query.js');
|
|
9
10
|
|
|
10
11
|
const { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;
|
|
12
|
+
const isPlainObject = (value)=>_.isPlainObject(value);
|
|
13
|
+
function isEmptySortMap(sortMap) {
|
|
14
|
+
const keys = Object.keys(sortMap);
|
|
15
|
+
if (keys.length === 0) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return keys.every((key)=>{
|
|
19
|
+
const value = sortMap[key];
|
|
20
|
+
if (typeof value === 'string') {
|
|
21
|
+
return value.trim().length === 0;
|
|
22
|
+
}
|
|
23
|
+
if (isPlainObject(value)) {
|
|
24
|
+
return isEmptySortMap(value);
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */ function normalizeOrderBy(orderBy) {
|
|
30
|
+
if (Array.isArray(orderBy)) {
|
|
31
|
+
const filtered = orderBy.filter((sortMap)=>!isEmptySortMap(sortMap));
|
|
32
|
+
return filtered.length > 0 ? filtered : undefined;
|
|
33
|
+
}
|
|
34
|
+
return isEmptySortMap(orderBy) ? undefined : orderBy;
|
|
35
|
+
}
|
|
11
36
|
class InvalidOrderError extends Error {
|
|
12
37
|
constructor(){
|
|
13
38
|
super();
|
|
@@ -37,7 +62,6 @@ const convertCountQueryParams = (countQuery)=>{
|
|
|
37
62
|
const convertOrderingQueryParams = (ordering)=>{
|
|
38
63
|
return ordering;
|
|
39
64
|
};
|
|
40
|
-
const isPlainObject = (value)=>_.isPlainObject(value);
|
|
41
65
|
const isStringArray = (value)=>fp.isArray(value) && value.every(fp.isString);
|
|
42
66
|
const createTransformer = ({ getModel })=>{
|
|
43
67
|
/**
|
|
@@ -57,24 +81,26 @@ const createTransformer = ({ getModel })=>{
|
|
|
57
81
|
}
|
|
58
82
|
throw new InvalidSortError();
|
|
59
83
|
};
|
|
60
|
-
const convertStringSortQueryParam = (sortQuery)=>{
|
|
61
|
-
return sortQuery.
|
|
84
|
+
const convertStringSortQueryParam = (sortQuery$1)=>{
|
|
85
|
+
return sortQuery.getMeaningfulSortSegments(sortQuery$1).map((segment)=>convertSingleSortQueryParam(segment));
|
|
62
86
|
};
|
|
63
87
|
const convertSingleSortQueryParam = (sortQuery)=>{
|
|
64
|
-
|
|
88
|
+
const trimmed = sortQuery.trim();
|
|
89
|
+
if (!trimmed) {
|
|
65
90
|
return {};
|
|
66
91
|
}
|
|
67
|
-
if (!fp.isString(
|
|
92
|
+
if (!fp.isString(trimmed)) {
|
|
68
93
|
throw new Error('Invalid sort query');
|
|
69
94
|
}
|
|
70
95
|
// split field and order param with default order to ascending
|
|
71
|
-
const [
|
|
96
|
+
const [rawField, order = 'asc'] = trimmed.split(':');
|
|
97
|
+
const field = rawField.trim();
|
|
72
98
|
if (field.length === 0) {
|
|
73
99
|
throw new Error('Field cannot be empty');
|
|
74
100
|
}
|
|
75
|
-
validateOrder(order);
|
|
101
|
+
validateOrder(order.trim());
|
|
76
102
|
// TODO: field should be a valid path on an object model
|
|
77
|
-
return _.set({}, field, order);
|
|
103
|
+
return _.set({}, field, order.trim());
|
|
78
104
|
};
|
|
79
105
|
const convertNestedSortQueryParam = (sortQuery)=>{
|
|
80
106
|
const transformedSort = {};
|
|
@@ -82,16 +108,31 @@ const createTransformer = ({ getModel })=>{
|
|
|
82
108
|
const order = sortQuery[field];
|
|
83
109
|
// this is a deep sort
|
|
84
110
|
if (isPlainObject(order)) {
|
|
85
|
-
|
|
111
|
+
const nested = convertNestedSortQueryParam(order);
|
|
112
|
+
if (!isEmptySortMap(nested)) {
|
|
113
|
+
transformedSort[field] = nested;
|
|
114
|
+
}
|
|
86
115
|
} else if (typeof order === 'string') {
|
|
87
|
-
|
|
88
|
-
|
|
116
|
+
const trimmedOrder = order.trim();
|
|
117
|
+
if (trimmedOrder.length > 0) {
|
|
118
|
+
validateOrder(trimmedOrder);
|
|
119
|
+
transformedSort[field] = trimmedOrder;
|
|
120
|
+
}
|
|
89
121
|
} else {
|
|
90
122
|
throw Error(`Invalid sort type expected object or string got ${typeof order}`);
|
|
91
123
|
}
|
|
92
124
|
}
|
|
93
125
|
return transformedSort;
|
|
94
126
|
};
|
|
127
|
+
const applySortToQuery = (query, sortParam)=>{
|
|
128
|
+
if (!sortQuery.hasSort(sortParam)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));
|
|
132
|
+
if (orderBy !== undefined) {
|
|
133
|
+
query.orderBy = orderBy;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
95
136
|
/**
|
|
96
137
|
* Start query parser
|
|
97
138
|
*/ const convertStartQueryParams = (startQuery)=>{
|
|
@@ -298,9 +339,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
298
339
|
}
|
|
299
340
|
const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } = subPopulate;
|
|
300
341
|
const query = {};
|
|
301
|
-
|
|
302
|
-
query.orderBy = convertSortQueryParams(sort);
|
|
303
|
-
}
|
|
342
|
+
applySortToQuery(query, sort);
|
|
304
343
|
if (filters) {
|
|
305
344
|
query.where = convertFiltersQueryParams(filters, schema);
|
|
306
345
|
}
|
|
@@ -468,9 +507,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
468
507
|
if (!fp.isNil(_q)) {
|
|
469
508
|
query._q = _q;
|
|
470
509
|
}
|
|
471
|
-
|
|
472
|
-
query.orderBy = convertSortQueryParams(sort);
|
|
473
|
-
}
|
|
510
|
+
applySortToQuery(query, sort);
|
|
474
511
|
if (!fp.isNil(filters)) {
|
|
475
512
|
query.where = convertFiltersQueryParams(filters, schema);
|
|
476
513
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-query-params.js","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport { Model } from './types';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\ntype SortParams = string | string[] | SortParamsObject | SortParamsObject[];\ntype FieldsParams = string | string[];\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n 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 Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return sortQuery.split(',').map((value) => convertSingleSortQueryParam(value));\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n if (!sortQuery) {\n return {};\n }\n\n if (!isString(sortQuery)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [field, order = 'asc'] = sortQuery.split(':');\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order);\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order);\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n transformedSort[field] = convertNestedSortQueryParam(order);\n } else if (typeof order === 'string') {\n validateOrder(order);\n transformedSort[field] = order;\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if ('populate' in subPopulate && subPopulate.populate !== '*') {\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) {\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 if (sort) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new 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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n if (!isNil(sort)) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","InvalidOrderError","Error","message","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","value","convertOrderingQueryParams","ordering","isPlainObject","_","isStringArray","isArray","every","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","Array","map","convertNestedSortQueryParam","split","convertSingleSortQueryParam","field","length","set","transformedSort","Object","keys","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","ValidationError","convertLimitQueryParams","limitQuery","limitAsANumber","undefined","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","convertPopulateQueryParams","populate","schema","depth","trim","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","key","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","query","orderBy","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","filter","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-query-params.js","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if ('populate' in subPopulate && subPopulate.populate !== '*') {\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) {\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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","Error","message","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","ValidationError","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
@@ -4,8 +4,33 @@ import { constants, hasDraftAndPublish, isDynamicZoneAttribute, isMorphToRelatio
|
|
|
4
4
|
import { ValidationError, PaginationError } from './errors.mjs';
|
|
5
5
|
import { isOperator } from './operators.mjs';
|
|
6
6
|
import parseType from './parse-type.mjs';
|
|
7
|
+
import { hasSort, getMeaningfulSortSegments } from './sort-query.mjs';
|
|
7
8
|
|
|
8
9
|
const { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;
|
|
10
|
+
const isPlainObject = (value)=>___default.isPlainObject(value);
|
|
11
|
+
function isEmptySortMap(sortMap) {
|
|
12
|
+
const keys = Object.keys(sortMap);
|
|
13
|
+
if (keys.length === 0) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return keys.every((key)=>{
|
|
17
|
+
const value = sortMap[key];
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
return value.trim().length === 0;
|
|
20
|
+
}
|
|
21
|
+
if (isPlainObject(value)) {
|
|
22
|
+
return isEmptySortMap(value);
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */ function normalizeOrderBy(orderBy) {
|
|
28
|
+
if (Array.isArray(orderBy)) {
|
|
29
|
+
const filtered = orderBy.filter((sortMap)=>!isEmptySortMap(sortMap));
|
|
30
|
+
return filtered.length > 0 ? filtered : undefined;
|
|
31
|
+
}
|
|
32
|
+
return isEmptySortMap(orderBy) ? undefined : orderBy;
|
|
33
|
+
}
|
|
9
34
|
class InvalidOrderError extends Error {
|
|
10
35
|
constructor(){
|
|
11
36
|
super();
|
|
@@ -35,7 +60,6 @@ const convertCountQueryParams = (countQuery)=>{
|
|
|
35
60
|
const convertOrderingQueryParams = (ordering)=>{
|
|
36
61
|
return ordering;
|
|
37
62
|
};
|
|
38
|
-
const isPlainObject = (value)=>___default.isPlainObject(value);
|
|
39
63
|
const isStringArray = (value)=>isArray(value) && value.every(isString);
|
|
40
64
|
const createTransformer = ({ getModel })=>{
|
|
41
65
|
/**
|
|
@@ -56,23 +80,25 @@ const createTransformer = ({ getModel })=>{
|
|
|
56
80
|
throw new InvalidSortError();
|
|
57
81
|
};
|
|
58
82
|
const convertStringSortQueryParam = (sortQuery)=>{
|
|
59
|
-
return sortQuery
|
|
83
|
+
return getMeaningfulSortSegments(sortQuery).map((segment)=>convertSingleSortQueryParam(segment));
|
|
60
84
|
};
|
|
61
85
|
const convertSingleSortQueryParam = (sortQuery)=>{
|
|
62
|
-
|
|
86
|
+
const trimmed = sortQuery.trim();
|
|
87
|
+
if (!trimmed) {
|
|
63
88
|
return {};
|
|
64
89
|
}
|
|
65
|
-
if (!isString(
|
|
90
|
+
if (!isString(trimmed)) {
|
|
66
91
|
throw new Error('Invalid sort query');
|
|
67
92
|
}
|
|
68
93
|
// split field and order param with default order to ascending
|
|
69
|
-
const [
|
|
94
|
+
const [rawField, order = 'asc'] = trimmed.split(':');
|
|
95
|
+
const field = rawField.trim();
|
|
70
96
|
if (field.length === 0) {
|
|
71
97
|
throw new Error('Field cannot be empty');
|
|
72
98
|
}
|
|
73
|
-
validateOrder(order);
|
|
99
|
+
validateOrder(order.trim());
|
|
74
100
|
// TODO: field should be a valid path on an object model
|
|
75
|
-
return ___default.set({}, field, order);
|
|
101
|
+
return ___default.set({}, field, order.trim());
|
|
76
102
|
};
|
|
77
103
|
const convertNestedSortQueryParam = (sortQuery)=>{
|
|
78
104
|
const transformedSort = {};
|
|
@@ -80,16 +106,31 @@ const createTransformer = ({ getModel })=>{
|
|
|
80
106
|
const order = sortQuery[field];
|
|
81
107
|
// this is a deep sort
|
|
82
108
|
if (isPlainObject(order)) {
|
|
83
|
-
|
|
109
|
+
const nested = convertNestedSortQueryParam(order);
|
|
110
|
+
if (!isEmptySortMap(nested)) {
|
|
111
|
+
transformedSort[field] = nested;
|
|
112
|
+
}
|
|
84
113
|
} else if (typeof order === 'string') {
|
|
85
|
-
|
|
86
|
-
|
|
114
|
+
const trimmedOrder = order.trim();
|
|
115
|
+
if (trimmedOrder.length > 0) {
|
|
116
|
+
validateOrder(trimmedOrder);
|
|
117
|
+
transformedSort[field] = trimmedOrder;
|
|
118
|
+
}
|
|
87
119
|
} else {
|
|
88
120
|
throw Error(`Invalid sort type expected object or string got ${typeof order}`);
|
|
89
121
|
}
|
|
90
122
|
}
|
|
91
123
|
return transformedSort;
|
|
92
124
|
};
|
|
125
|
+
const applySortToQuery = (query, sortParam)=>{
|
|
126
|
+
if (!hasSort(sortParam)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));
|
|
130
|
+
if (orderBy !== undefined) {
|
|
131
|
+
query.orderBy = orderBy;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
93
134
|
/**
|
|
94
135
|
* Start query parser
|
|
95
136
|
*/ const convertStartQueryParams = (startQuery)=>{
|
|
@@ -296,9 +337,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
296
337
|
}
|
|
297
338
|
const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } = subPopulate;
|
|
298
339
|
const query = {};
|
|
299
|
-
|
|
300
|
-
query.orderBy = convertSortQueryParams(sort);
|
|
301
|
-
}
|
|
340
|
+
applySortToQuery(query, sort);
|
|
302
341
|
if (filters) {
|
|
303
342
|
query.where = convertFiltersQueryParams(filters, schema);
|
|
304
343
|
}
|
|
@@ -466,9 +505,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
466
505
|
if (!isNil(_q)) {
|
|
467
506
|
query._q = _q;
|
|
468
507
|
}
|
|
469
|
-
|
|
470
|
-
query.orderBy = convertSortQueryParams(sort);
|
|
471
|
-
}
|
|
508
|
+
applySortToQuery(query, sort);
|
|
472
509
|
if (!isNil(filters)) {
|
|
473
510
|
query.where = convertFiltersQueryParams(filters, schema);
|
|
474
511
|
}
|
|
@@ -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 { Model } from './types';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\ntype SortParams = string | string[] | SortParamsObject | SortParamsObject[];\ntype FieldsParams = string | string[];\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n 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 Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return sortQuery.split(',').map((value) => convertSingleSortQueryParam(value));\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n if (!sortQuery) {\n return {};\n }\n\n if (!isString(sortQuery)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [field, order = 'asc'] = sortQuery.split(':');\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order);\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order);\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n transformedSort[field] = convertNestedSortQueryParam(order);\n } else if (typeof order === 'string') {\n validateOrder(order);\n transformedSort[field] = order;\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if ('populate' in subPopulate && subPopulate.populate !== '*') {\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) {\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 if (sort) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new 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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n if (!isNil(sort)) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","InvalidOrderError","Error","message","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","value","convertOrderingQueryParams","ordering","isPlainObject","_","isStringArray","isArray","every","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","Array","map","convertNestedSortQueryParam","split","convertSingleSortQueryParam","field","length","set","transformedSort","Object","keys","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","ValidationError","convertLimitQueryParams","limitQuery","limitAsANumber","undefined","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","convertPopulateQueryParams","populate","schema","depth","trim","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","key","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","query","orderBy","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","filter","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if ('populate' in subPopulate && subPopulate.populate !== '*') {\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) {\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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","Error","message","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","ValidationError","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type SortOrder = 'asc' | 'desc';
|
|
2
|
+
export interface SortParamsObject {
|
|
3
|
+
[key: string]: SortOrder | SortParamsObject;
|
|
4
|
+
}
|
|
5
|
+
export type SortParams = string | string[] | SortParamsObject | SortParamsObject[];
|
|
6
|
+
/**
|
|
7
|
+
* Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMeaningfulSortSegments(sort: string): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so
|
|
12
|
+
* populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs
|
|
13
|
+
* `sort[]` with strictNullHandling parses to `[null]`).
|
|
14
|
+
*/
|
|
15
|
+
export declare function hasSort(sort?: unknown): sort is SortParams;
|
|
16
|
+
//# sourceMappingURL=sort-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-query.d.ts","sourceRoot":"","sources":["../src/sort-query.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC;CAC7C;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;AAInF;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAYhE;AA2BD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,IAAI,UAAU,CAgC1D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = require('lodash');
|
|
4
|
+
|
|
5
|
+
const isPlainObject = (value)=>_.isPlainObject(value);
|
|
6
|
+
/**
|
|
7
|
+
* Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).
|
|
8
|
+
*/ function getMeaningfulSortSegments(sort) {
|
|
9
|
+
return sort.split(',').map((segment)=>segment.trim()).filter((segment)=>{
|
|
10
|
+
if (segment.length === 0) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const [field] = segment.split(':');
|
|
14
|
+
return field.trim().length > 0;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies
|
|
19
|
+
* at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.
|
|
20
|
+
*/ function hasMeaningfulSortObject(sort) {
|
|
21
|
+
return Object.keys(sort).some((key)=>{
|
|
22
|
+
const order = sort[key];
|
|
23
|
+
if (typeof order === 'string') {
|
|
24
|
+
return order.length > 0;
|
|
25
|
+
}
|
|
26
|
+
if (isPlainObject(order)) {
|
|
27
|
+
return hasMeaningfulSortObject(order);
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Whether a REST-style sort string contains at least one meaningful segment. */ function hasMeaningfulStringSort(sort) {
|
|
33
|
+
return getMeaningfulSortSegments(sort).length > 0;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so
|
|
37
|
+
* populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs
|
|
38
|
+
* `sort[]` with strictNullHandling parses to `[null]`).
|
|
39
|
+
*/ function hasSort(sort) {
|
|
40
|
+
if (sort === undefined || sort === null) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (typeof sort === 'string') {
|
|
44
|
+
return hasMeaningfulStringSort(sort);
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(sort)) {
|
|
47
|
+
if (sort.length === 0) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return sort.some((item)=>{
|
|
51
|
+
if (typeof item === 'string') {
|
|
52
|
+
return hasMeaningfulStringSort(item);
|
|
53
|
+
}
|
|
54
|
+
if (isPlainObject(item)) {
|
|
55
|
+
return hasMeaningfulSortObject(item);
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (isPlainObject(sort)) {
|
|
61
|
+
return hasMeaningfulSortObject(sort);
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
exports.getMeaningfulSortSegments = getMeaningfulSortSegments;
|
|
67
|
+
exports.hasSort = hasSort;
|
|
68
|
+
//# sourceMappingURL=sort-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-query.js","sources":["../src/sort-query.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\nexport type SortParams = string | string[] | SortParamsObject | SortParamsObject[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\n/**\n * Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).\n */\nexport function getMeaningfulSortSegments(sort: string): string[] {\n return sort\n .split(',')\n .map((segment) => segment.trim())\n .filter((segment) => {\n if (segment.length === 0) {\n return false;\n }\n\n const [field] = segment.split(':');\n return field.trim().length > 0;\n });\n}\n\n/**\n * Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies\n * at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.\n */\nfunction hasMeaningfulSortObject(sort: SortParamsObject): boolean {\n return Object.keys(sort).some((key) => {\n const order = sort[key];\n\n if (typeof order === 'string') {\n return order.length > 0;\n }\n\n if (isPlainObject(order)) {\n return hasMeaningfulSortObject(order as SortParamsObject);\n }\n\n return false;\n });\n}\n\n/** Whether a REST-style sort string contains at least one meaningful segment. */\nfunction hasMeaningfulStringSort(sort: string): boolean {\n return getMeaningfulSortSegments(sort).length > 0;\n}\n\n/**\n * Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so\n * populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs\n * `sort[]` with strictNullHandling parses to `[null]`).\n */\nexport function hasSort(sort?: unknown): sort is SortParams {\n if (sort === undefined || sort === null) {\n return false;\n }\n\n if (typeof sort === 'string') {\n return hasMeaningfulStringSort(sort);\n }\n\n if (Array.isArray(sort)) {\n if (sort.length === 0) {\n return false;\n }\n\n return sort.some((item) => {\n if (typeof item === 'string') {\n return hasMeaningfulStringSort(item);\n }\n\n if (isPlainObject(item)) {\n return hasMeaningfulSortObject(item as SortParamsObject);\n }\n\n return false;\n });\n }\n\n if (isPlainObject(sort)) {\n return hasMeaningfulSortObject(sort as SortParamsObject);\n }\n\n return false;\n}\n"],"names":["isPlainObject","value","_","getMeaningfulSortSegments","sort","split","map","segment","trim","filter","length","field","hasMeaningfulSortObject","Object","keys","some","key","order","hasMeaningfulStringSort","hasSort","undefined","Array","isArray","item"],"mappings":";;;;AAUA,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,CAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F;;IAGO,SAASE,yBAAAA,CAA0BC,IAAY,EAAA;AACpD,IAAA,OAAOA,IAAAA,CACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAAAA,GAAYA,OAAAA,CAAQC,IAAI,EAAA,CAAA,CAC7BC,MAAM,CAAC,CAACF,OAAAA,GAAAA;QACP,IAAIA,OAAAA,CAAQG,MAAM,KAAK,CAAA,EAAG;YACxB,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,MAAM,CAACC,KAAAA,CAAM,GAAGJ,OAAAA,CAAQF,KAAK,CAAC,GAAA,CAAA;AAC9B,QAAA,OAAOM,KAAAA,CAAMH,IAAI,EAAA,CAAGE,MAAM,GAAG,CAAA;AAC/B,IAAA,CAAA,CAAA;AACJ;AAEA;;;IAIA,SAASE,wBAAwBR,IAAsB,EAAA;AACrD,IAAA,OAAOS,OAAOC,IAAI,CAACV,IAAAA,CAAAA,CAAMW,IAAI,CAAC,CAACC,GAAAA,GAAAA;QAC7B,MAAMC,KAAAA,GAAQb,IAAI,CAACY,GAAAA,CAAI;QAEvB,IAAI,OAAOC,UAAU,QAAA,EAAU;YAC7B,OAAOA,KAAAA,CAAMP,MAAM,GAAG,CAAA;AACxB,QAAA;AAEA,QAAA,IAAIV,cAAciB,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOL,uBAAAA,CAAwBK,KAAAA,CAAAA;AACjC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,kFACA,SAASC,uBAAAA,CAAwBd,IAAY,EAAA;IAC3C,OAAOD,yBAAAA,CAA0BC,IAAAA,CAAAA,CAAMM,MAAM,GAAG,CAAA;AAClD;AAEA;;;;IAKO,SAASS,OAAAA,CAAQf,IAAc,EAAA;IACpC,IAAIA,IAAAA,KAASgB,SAAAA,IAAahB,IAAAA,KAAS,IAAA,EAAM;QACvC,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAOc,uBAAAA,CAAwBd,IAAAA,CAAAA;AACjC,IAAA;IAEA,IAAIiB,KAAAA,CAAMC,OAAO,CAAClB,IAAAA,CAAAA,EAAO;QACvB,IAAIA,IAAAA,CAAKM,MAAM,KAAK,CAAA,EAAG;YACrB,OAAO,KAAA;AACT,QAAA;QAEA,OAAON,IAAAA,CAAKW,IAAI,CAAC,CAACQ,IAAAA,GAAAA;YAChB,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,gBAAA,OAAOL,uBAAAA,CAAwBK,IAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIvB,cAAcuB,IAAAA,CAAAA,EAAO;AACvB,gBAAA,OAAOX,uBAAAA,CAAwBW,IAAAA,CAAAA;AACjC,YAAA;YAEA,OAAO,KAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,IAAIvB,cAAcI,IAAAA,CAAAA,EAAO;AACvB,QAAA,OAAOQ,uBAAAA,CAAwBR,IAAAA,CAAAA;AACjC,IAAA;IAEA,OAAO,KAAA;AACT;;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import ___default from 'lodash';
|
|
2
|
+
|
|
3
|
+
const isPlainObject = (value)=>___default.isPlainObject(value);
|
|
4
|
+
/**
|
|
5
|
+
* Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).
|
|
6
|
+
*/ function getMeaningfulSortSegments(sort) {
|
|
7
|
+
return sort.split(',').map((segment)=>segment.trim()).filter((segment)=>{
|
|
8
|
+
if (segment.length === 0) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const [field] = segment.split(':');
|
|
12
|
+
return field.trim().length > 0;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies
|
|
17
|
+
* at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.
|
|
18
|
+
*/ function hasMeaningfulSortObject(sort) {
|
|
19
|
+
return Object.keys(sort).some((key)=>{
|
|
20
|
+
const order = sort[key];
|
|
21
|
+
if (typeof order === 'string') {
|
|
22
|
+
return order.length > 0;
|
|
23
|
+
}
|
|
24
|
+
if (isPlainObject(order)) {
|
|
25
|
+
return hasMeaningfulSortObject(order);
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** Whether a REST-style sort string contains at least one meaningful segment. */ function hasMeaningfulStringSort(sort) {
|
|
31
|
+
return getMeaningfulSortSegments(sort).length > 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so
|
|
35
|
+
* populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs
|
|
36
|
+
* `sort[]` with strictNullHandling parses to `[null]`).
|
|
37
|
+
*/ function hasSort(sort) {
|
|
38
|
+
if (sort === undefined || sort === null) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (typeof sort === 'string') {
|
|
42
|
+
return hasMeaningfulStringSort(sort);
|
|
43
|
+
}
|
|
44
|
+
if (Array.isArray(sort)) {
|
|
45
|
+
if (sort.length === 0) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return sort.some((item)=>{
|
|
49
|
+
if (typeof item === 'string') {
|
|
50
|
+
return hasMeaningfulStringSort(item);
|
|
51
|
+
}
|
|
52
|
+
if (isPlainObject(item)) {
|
|
53
|
+
return hasMeaningfulSortObject(item);
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (isPlainObject(sort)) {
|
|
59
|
+
return hasMeaningfulSortObject(sort);
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { getMeaningfulSortSegments, hasSort };
|
|
65
|
+
//# sourceMappingURL=sort-query.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-query.mjs","sources":["../src/sort-query.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\nexport type SortParams = string | string[] | SortParamsObject | SortParamsObject[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\n/**\n * Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).\n */\nexport function getMeaningfulSortSegments(sort: string): string[] {\n return sort\n .split(',')\n .map((segment) => segment.trim())\n .filter((segment) => {\n if (segment.length === 0) {\n return false;\n }\n\n const [field] = segment.split(':');\n return field.trim().length > 0;\n });\n}\n\n/**\n * Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies\n * at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.\n */\nfunction hasMeaningfulSortObject(sort: SortParamsObject): boolean {\n return Object.keys(sort).some((key) => {\n const order = sort[key];\n\n if (typeof order === 'string') {\n return order.length > 0;\n }\n\n if (isPlainObject(order)) {\n return hasMeaningfulSortObject(order as SortParamsObject);\n }\n\n return false;\n });\n}\n\n/** Whether a REST-style sort string contains at least one meaningful segment. */\nfunction hasMeaningfulStringSort(sort: string): boolean {\n return getMeaningfulSortSegments(sort).length > 0;\n}\n\n/**\n * Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so\n * populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs\n * `sort[]` with strictNullHandling parses to `[null]`).\n */\nexport function hasSort(sort?: unknown): sort is SortParams {\n if (sort === undefined || sort === null) {\n return false;\n }\n\n if (typeof sort === 'string') {\n return hasMeaningfulStringSort(sort);\n }\n\n if (Array.isArray(sort)) {\n if (sort.length === 0) {\n return false;\n }\n\n return sort.some((item) => {\n if (typeof item === 'string') {\n return hasMeaningfulStringSort(item);\n }\n\n if (isPlainObject(item)) {\n return hasMeaningfulSortObject(item as SortParamsObject);\n }\n\n return false;\n });\n }\n\n if (isPlainObject(sort)) {\n return hasMeaningfulSortObject(sort as SortParamsObject);\n }\n\n return false;\n}\n"],"names":["isPlainObject","value","_","getMeaningfulSortSegments","sort","split","map","segment","trim","filter","length","field","hasMeaningfulSortObject","Object","keys","some","key","order","hasMeaningfulStringSort","hasSort","undefined","Array","isArray","item"],"mappings":";;AAUA,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,UAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F;;IAGO,SAASE,yBAAAA,CAA0BC,IAAY,EAAA;AACpD,IAAA,OAAOA,IAAAA,CACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAAAA,GAAYA,OAAAA,CAAQC,IAAI,EAAA,CAAA,CAC7BC,MAAM,CAAC,CAACF,OAAAA,GAAAA;QACP,IAAIA,OAAAA,CAAQG,MAAM,KAAK,CAAA,EAAG;YACxB,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,MAAM,CAACC,KAAAA,CAAM,GAAGJ,OAAAA,CAAQF,KAAK,CAAC,GAAA,CAAA;AAC9B,QAAA,OAAOM,KAAAA,CAAMH,IAAI,EAAA,CAAGE,MAAM,GAAG,CAAA;AAC/B,IAAA,CAAA,CAAA;AACJ;AAEA;;;IAIA,SAASE,wBAAwBR,IAAsB,EAAA;AACrD,IAAA,OAAOS,OAAOC,IAAI,CAACV,IAAAA,CAAAA,CAAMW,IAAI,CAAC,CAACC,GAAAA,GAAAA;QAC7B,MAAMC,KAAAA,GAAQb,IAAI,CAACY,GAAAA,CAAI;QAEvB,IAAI,OAAOC,UAAU,QAAA,EAAU;YAC7B,OAAOA,KAAAA,CAAMP,MAAM,GAAG,CAAA;AACxB,QAAA;AAEA,QAAA,IAAIV,cAAciB,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOL,uBAAAA,CAAwBK,KAAAA,CAAAA;AACjC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,kFACA,SAASC,uBAAAA,CAAwBd,IAAY,EAAA;IAC3C,OAAOD,yBAAAA,CAA0BC,IAAAA,CAAAA,CAAMM,MAAM,GAAG,CAAA;AAClD;AAEA;;;;IAKO,SAASS,OAAAA,CAAQf,IAAc,EAAA;IACpC,IAAIA,IAAAA,KAASgB,SAAAA,IAAahB,IAAAA,KAAS,IAAA,EAAM;QACvC,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAOc,uBAAAA,CAAwBd,IAAAA,CAAAA;AACjC,IAAA;IAEA,IAAIiB,KAAAA,CAAMC,OAAO,CAAClB,IAAAA,CAAAA,EAAO;QACvB,IAAIA,IAAAA,CAAKM,MAAM,KAAK,CAAA,EAAG;YACrB,OAAO,KAAA;AACT,QAAA;QAEA,OAAON,IAAAA,CAAKW,IAAI,CAAC,CAACQ,IAAAA,GAAAA;YAChB,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,gBAAA,OAAOL,uBAAAA,CAAwBK,IAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIvB,cAAcuB,IAAAA,CAAAA,EAAO;AACvB,gBAAA,OAAOX,uBAAAA,CAAwBW,IAAAA,CAAAA;AACjC,YAAA;YAEA,OAAO,KAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,IAAIvB,cAAcI,IAAAA,CAAAA,EAAO;AACvB,QAAA,OAAOQ,uBAAAA,CAAwBR,IAAAA,CAAAA;AACjC,IAAA;IAEA,OAAO,KAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.d.ts","sourceRoot":"","sources":["../../src/traverse/query-sort.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"query-sort.d.ts","sourceRoot":"","sources":["../../src/traverse/query-sort.ts"],"names":[],"mappings":";;AAqMA,wBAAoC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fp = require('lodash/fp');
|
|
4
|
+
var sortQuery = require('../sort-query.js');
|
|
4
5
|
var factory = require('./factory.js');
|
|
5
6
|
|
|
6
7
|
const ORDERS = {
|
|
@@ -13,7 +14,8 @@ const isStringArray = (value)=>Array.isArray(value) && value.every(fp.isString);
|
|
|
13
14
|
const isObjectArray = (value)=>Array.isArray(value) && value.every(fp.isObject);
|
|
14
15
|
const isNestedSorts = (value)=>fp.isString(value) && value.split(',').length > 1;
|
|
15
16
|
const isObj = (value)=>fp.isObject(value);
|
|
16
|
-
|
|
17
|
+
/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */ const isMeaninglessSortArray = (value)=>Array.isArray(value) && !sortQuery.hasSort(value);
|
|
18
|
+
const sort = factory().intercept(isMeaninglessSortArray, async (_visitor, _options, sort)=>sort).intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
|
|
17
19
|
isNestedSorts, async (visitor, options, sort, { recurse })=>{
|
|
18
20
|
return Promise.all(sort.split(',').map(fp.trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!fp.isEmpty(part)).join(','));
|
|
19
21
|
}).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","sort","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport { hasSort } from '../sort-query';\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */\nconst isMeaninglessSortArray = (value: unknown): value is unknown[] =>\n Array.isArray(value) && !hasSort(value);\n\nconst sort = traverseFactory()\n .intercept(isMeaninglessSortArray, async (_visitor, _options, sort) => sort)\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","isMeaninglessSortArray","hasSort","sort","traverseFactory","intercept","_visitor","_options","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { trim, isEmpty, isString, pipe, split, map, flatten, first, isNil, cloneDeep, curry, isObject } from 'lodash/fp';
|
|
2
|
+
import { hasSort } from '../sort-query.mjs';
|
|
2
3
|
import traverseFactory from './factory.mjs';
|
|
3
4
|
|
|
4
5
|
const ORDERS = {
|
|
@@ -11,7 +12,8 @@ const isStringArray = (value)=>Array.isArray(value) && value.every(isString);
|
|
|
11
12
|
const isObjectArray = (value)=>Array.isArray(value) && value.every(isObject);
|
|
12
13
|
const isNestedSorts = (value)=>isString(value) && value.split(',').length > 1;
|
|
13
14
|
const isObj = (value)=>isObject(value);
|
|
14
|
-
|
|
15
|
+
/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */ const isMeaninglessSortArray = (value)=>Array.isArray(value) && !hasSort(value);
|
|
16
|
+
const sort = traverseFactory().intercept(isMeaninglessSortArray, async (_visitor, _options, sort)=>sort).intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
|
|
15
17
|
isNestedSorts, async (visitor, options, sort, { recurse })=>{
|
|
16
18
|
return Promise.all(sort.split(',').map(trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!isEmpty(part)).join(','));
|
|
17
19
|
}).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.mjs","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","sort","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-sort.mjs","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport { hasSort } from '../sort-query';\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */\nconst isMeaninglessSortArray = (value: unknown): value is unknown[] =>\n Array.isArray(value) && !hasSort(value);\n\nconst sort = traverseFactory()\n .intercept(isMeaninglessSortArray, async (_visitor, _options, sort) => sort)\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","isMeaninglessSortArray","hasSort","sort","traverseFactory","intercept","_visitor","_options","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/utils",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.48.0",
|
|
4
4
|
"description": "Shared utilities for the Strapi packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
"@types/http-errors": "2.0.4",
|
|
63
63
|
"@types/koa": "2.13.4",
|
|
64
64
|
"@types/node": "24.10.0",
|
|
65
|
-
"eslint-config-custom": "5.
|
|
65
|
+
"eslint-config-custom": "5.48.0",
|
|
66
66
|
"koa": "2.16.4",
|
|
67
67
|
"koa-body": "6.0.1",
|
|
68
|
-
"tsconfig": "5.
|
|
68
|
+
"tsconfig": "5.48.0"
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|
|
71
71
|
"node": ">=20.0.0 <=24.x.x",
|