@strapi/utils 5.58.0 → 5.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async.js +2 -2
- package/dist/async.js.map +1 -1
- package/dist/async.mjs +1 -1
- package/dist/async.mjs.map +1 -1
- package/dist/content-types.d.ts.map +1 -1
- package/dist/content-types.js +3 -3
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +3 -3
- package/dist/content-types.mjs.map +1 -1
- package/dist/curry.d.ts +26 -0
- package/dist/curry.d.ts.map +1 -0
- package/dist/curry.js +26 -0
- package/dist/curry.js.map +1 -0
- package/dist/curry.mjs +24 -0
- package/dist/curry.mjs.map +1 -0
- package/dist/parse-type.js +7 -7
- package/dist/parse-type.js.map +1 -1
- package/dist/parse-type.mjs +7 -7
- package/dist/parse-type.mjs.map +1 -1
- package/dist/sanitize/sanitizers.d.ts.map +1 -1
- package/dist/sanitize/sanitizers.js +5 -4
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +2 -1
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/traverse/factory.d.ts.map +1 -1
- package/dist/traverse/factory.js +68 -31
- package/dist/traverse/factory.js.map +1 -1
- package/dist/traverse/factory.mjs +68 -31
- package/dist/traverse/factory.mjs.map +1 -1
- package/dist/traverse/query-fields.d.ts.map +1 -1
- package/dist/traverse/query-fields.js +2 -1
- package/dist/traverse/query-fields.js.map +1 -1
- package/dist/traverse/query-fields.mjs +2 -1
- package/dist/traverse/query-fields.mjs.map +1 -1
- package/dist/traverse/query-filters.d.ts.map +1 -1
- package/dist/traverse/query-filters.js +2 -1
- package/dist/traverse/query-filters.js.map +1 -1
- package/dist/traverse/query-filters.mjs +2 -1
- package/dist/traverse/query-filters.mjs.map +1 -1
- package/dist/traverse/query-populate.d.ts.map +1 -1
- package/dist/traverse/query-populate.js +2 -1
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +2 -1
- package/dist/traverse/query-populate.mjs.map +1 -1
- package/dist/traverse/query-sort.d.ts.map +1 -1
- package/dist/traverse/query-sort.js +2 -1
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +2 -1
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +2 -1
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +2 -1
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validate/index.js +3 -3
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/index.mjs +3 -3
- package/dist/validate/index.mjs.map +1 -1
- package/dist/validate/utils.d.ts.map +1 -1
- package/dist/validate/utils.js +2 -9
- package/dist/validate/utils.js.map +1 -1
- package/dist/validate/utils.mjs +2 -9
- package/dist/validate/utils.mjs.map +1 -1
- package/dist/validate/validators.mjs +17 -17
- package/dist/validate/validators.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.mjs","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import { curry, isString, isEmpty, isObject, constant, identity, cloneDeep } from 'lodash';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n return false;\n }\n\n const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n if (!hasConsecutiveNumericKeys) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n throw new ValidationError(\n `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n );\n};\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // Dot notation cannot represent polymorphic `on` fragments. Keep the object form\n // when a visitor adds one, rather than trying to serialize it as nested `populate`.\n return paths ? paths[0] : traversedPopulate;\n })\n // Array of strings ['foo', 'bar.baz'] => traverse as one object, then serialize when possible\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const populateObject = pathsToObjectPopulate(populate);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // A string array cannot hold polymorphic `on` fragments. Return the sanitized object\n // as a whole when one is present, so consumers receive a valid populate representation.\n return paths ?? traversedPopulate;\n })\n .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n throwQsArrayLimitPopulateError(Object.keys(populate).length);\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = (value: string) => value.split('.');\n const recompose = (parts: string[]) => parts.join('.');\n\n return {\n transform: (value) => value.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 value == null || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, { ...value, ...(newValue as Record<string, unknown>) });\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (value == null || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] | undefined => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string): boolean {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n const nestedPopulate = (value as { populate?: PopulateObject }).populate;\n\n if (!nestedPopulate || !traverse(nestedPopulate, currentPath)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n if (!traverse(input, '')) {\n return undefined;\n }\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","Array","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","paths","objectPopulateToPaths","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","parts","join","trim","root","isEmpty","v","rest","cloneDeep","ignored","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","nestedPopulate","result","object","first","forEach","clause"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-populate.mjs","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import { isString, isEmpty, isObject, constant, identity, cloneDeep } from 'lodash';\n\nimport { curry } from '../curry';\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n if (!isObject(value) || Array.isArray(value)) {\n return false;\n }\n\n const keys = Object.keys(value);\n\n if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n return false;\n }\n\n const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n if (!hasConsecutiveNumericKeys) {\n return false;\n }\n\n return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n throw new ValidationError(\n `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n 'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n );\n};\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // Dot notation cannot represent polymorphic `on` fragments. Keep the object form\n // when a visitor adds one, rather than trying to serialize it as nested `populate`.\n return paths ? paths[0] : traversedPopulate;\n })\n // Array of strings ['foo', 'bar.baz'] => traverse as one object, then serialize when possible\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const populateObject = pathsToObjectPopulate(populate);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const paths = objectPopulateToPaths(traversedPopulate);\n\n // A string array cannot hold polymorphic `on` fragments. Return the sanitized object\n // as a whole when one is present, so consumers receive a valid populate representation.\n return paths ?? traversedPopulate;\n })\n .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n throwQsArrayLimitPopulateError(Object.keys(populate).length);\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = (value: string) => value.split('.');\n const recompose = (parts: string[]) => parts.join('.');\n\n return {\n transform: (value) => value.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 value == null || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute, parent }) => {\n // We don't want to recurse using traversePopulate for query keywords.\n // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n //\n // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n // we still treat it as a keyword if we're inside a nested populate context\n // (parent is an attribute). This prevents the traverse from recursing into\n // component/relation attributes named 'filters' with query filter data,\n // which would cause \"Invalid key\" validation errors (issue #21338).\n //\n // The attribute can still be populated explicitly via `populate: { filters: true }`.\n return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, { ...value, ...(newValue as Record<string, unknown>) });\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (value == null) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (value == null || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] | undefined => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string): boolean {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n const nestedPopulate = (value as { populate?: PopulateObject }).populate;\n\n if (!nestedPopulate || !traverse(nestedPopulate, currentPath)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n if (!traverse(input, '')) {\n return undefined;\n }\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","Array","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","paths","objectPopulateToPaths","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","parts","join","trim","root","isEmpty","v","rest","cloneDeep","ignored","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","nestedPopulate","result","object","first","forEach","clause"],"mappings":"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"}
|
|
@@ -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":";AA0LA,wBAAoC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
|
+
var curry = require('../curry.js');
|
|
4
5
|
var sortQuery = require('../sort-query.js');
|
|
5
6
|
var factory = require('./factory.js');
|
|
6
7
|
|
|
@@ -140,7 +141,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
140
141
|
}, value);
|
|
141
142
|
set(key, newValue);
|
|
142
143
|
});
|
|
143
|
-
var traverseQuerySort =
|
|
144
|
+
var traverseQuerySort = curry.curry(sort.traverse);
|
|
144
145
|
|
|
145
146
|
module.exports = traverseQuerySort;
|
|
146
147
|
//# sourceMappingURL=query-sort.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import { curry, isString, isObject, isEmpty, cloneDeep } from 'lodash';\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((value) => value.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 = (value: string | undefined) =>\n (value ?? '').split('.').flatMap((part) => part.split(':'));\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: (value) => value.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 value == null ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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","flatMap","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","keys","v","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 { isString, isObject, isEmpty, cloneDeep } from 'lodash';\n\nimport { curry } from '../curry';\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((value) => value.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 = (value: string | undefined) =>\n (value ?? '').split('.').flatMap((part) => part.split(':'));\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: (value) => value.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 value == null ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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","flatMap","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","keys","v","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
|
-
import { isEmpty, isString, cloneDeep,
|
|
1
|
+
import { isEmpty, isString, cloneDeep, isObject } from 'lodash';
|
|
2
|
+
import { curry } from '../curry.mjs';
|
|
2
3
|
import { hasSort } from '../sort-query.mjs';
|
|
3
4
|
import traverseFactory from './factory.mjs';
|
|
4
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.mjs","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import { curry, isString, isObject, isEmpty, cloneDeep } from 'lodash';\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((value) => value.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 = (value: string | undefined) =>\n (value ?? '').split('.').flatMap((part) => part.split(':'));\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: (value) => value.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 value == null ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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","flatMap","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","keys","v","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 { isString, isObject, isEmpty, cloneDeep } from 'lodash';\n\nimport { curry } from '../curry';\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((value) => value.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 = (value: string | undefined) =>\n (value ?? '').split('.').flatMap((part) => part.split(':'));\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: (value) => value.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 value == null ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = tokenize(data)[0];\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","flatMap","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","keys","v","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAoBpE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;CACf;AAkPD,QAAA,MAAM,kBAAkB,GAAI,UAAU;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE;gBACtC,MAAM;aAIT,MAAM,SAAS,IAAI;CAG5B,CAAC;;AAEH,wBAAqC"}
|
package/dist/traverse-entity.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
|
+
var curry = require('./curry.js');
|
|
4
5
|
var contentTypes = require('./content-types.js');
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -228,7 +229,7 @@ const createVisitorUtils = ({ data })=>({
|
|
|
228
229
|
data[key] = value;
|
|
229
230
|
}
|
|
230
231
|
});
|
|
231
|
-
var traverseEntity$1 =
|
|
232
|
+
var traverseEntity$1 = curry.curry(traverseEntity);
|
|
232
233
|
|
|
233
234
|
module.exports = traverseEntity$1;
|
|
234
235
|
//# sourceMappingURL=traverse-entity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, curry } from 'lodash';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject } from 'lodash';\n\nimport { curry } from './curry';\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
package/dist/traverse-entity.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, curry } from 'lodash';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject } from 'lodash';\n\nimport { curry } from './curry';\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;CACzF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EACA,QAAQ,GACR,MAAM,GACN,UAAU,GACV,SAAS,GACT,YAAY,GACZ,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,GACN,UAAU,GACV,WAAW,GACX,aAAa,GACb,SAAS,GACT,MAAM,GACN,QAAQ,GACR,KAAK,GACL,UAAU,GACV,OAAO,GACP,OAAO,CAAC;CACb;AAED,MAAM,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;CACzF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EACA,QAAQ,GACR,MAAM,GACN,UAAU,GACV,SAAS,GACT,YAAY,GACZ,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,GACN,UAAU,GACV,WAAW,GACX,aAAa,GACb,SAAS,GACT,MAAM,GACN,QAAQ,GACR,KAAK,GACL,UAAU,GACV,OAAO,GACP,OAAO,CAAC;CACb;AAED,MAAM,MAAM,YAAY,GACtB,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAEpF,MAAM,MAAM,IAAI,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAEnD,MAAM,WAAW,KAAK;IACpB,SAAS,EAAE,aAAa,GAAG,WAAW,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC"}
|
package/dist/validate/index.js
CHANGED
|
@@ -119,12 +119,12 @@ const createAPIValidators = (opts)=>{
|
|
|
119
119
|
}
|
|
120
120
|
if (strictParams) {
|
|
121
121
|
const extraQueryKeys = contentApiRouteParams.getExtraQueryKeysFromRoute(route);
|
|
122
|
-
const allowedKeys = [
|
|
122
|
+
const allowedKeys = new Set([
|
|
123
123
|
...contentApiConstants.ALLOWED_QUERY_PARAM_KEYS,
|
|
124
124
|
...extraQueryKeys
|
|
125
|
-
];
|
|
125
|
+
]);
|
|
126
126
|
for (const key of Object.keys(query)){
|
|
127
|
-
if (!allowedKeys.
|
|
127
|
+
if (!allowedKeys.has(key)) {
|
|
128
128
|
try {
|
|
129
129
|
utils.throwInvalidKey({
|
|
130
130
|
key,
|