@strapi/utils 5.37.0 → 5.38.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.
Files changed (146) hide show
  1. package/dist/async.js.map +1 -1
  2. package/dist/async.mjs.map +1 -1
  3. package/dist/content-api-constants.js.map +1 -1
  4. package/dist/content-api-constants.mjs.map +1 -1
  5. package/dist/content-api-route-params.js.map +1 -1
  6. package/dist/content-api-route-params.mjs.map +1 -1
  7. package/dist/content-api-router.js.map +1 -1
  8. package/dist/content-api-router.mjs.map +1 -1
  9. package/dist/content-types.js.map +1 -1
  10. package/dist/content-types.mjs +1 -1
  11. package/dist/content-types.mjs.map +1 -1
  12. package/dist/convert-query-params.js.map +1 -1
  13. package/dist/convert-query-params.mjs +2 -2
  14. package/dist/convert-query-params.mjs.map +1 -1
  15. package/dist/env-helper.js.map +1 -1
  16. package/dist/env-helper.mjs.map +1 -1
  17. package/dist/errors.js.map +1 -1
  18. package/dist/errors.mjs.map +1 -1
  19. package/dist/file.js.map +1 -1
  20. package/dist/file.mjs.map +1 -1
  21. package/dist/format-yup-error.js.map +1 -1
  22. package/dist/format-yup-error.mjs.map +1 -1
  23. package/dist/hooks.js.map +1 -1
  24. package/dist/hooks.mjs.map +1 -1
  25. package/dist/import-default.js.map +1 -1
  26. package/dist/import-default.mjs.map +1 -1
  27. package/dist/index.js +4 -4
  28. package/dist/index.mjs +4 -4
  29. package/dist/install-id.js.map +1 -1
  30. package/dist/install-id.mjs.map +1 -1
  31. package/dist/model-cache.js.map +1 -1
  32. package/dist/model-cache.mjs.map +1 -1
  33. package/dist/operators.js.map +1 -1
  34. package/dist/operators.mjs.map +1 -1
  35. package/dist/package-manager.js.map +1 -1
  36. package/dist/package-manager.mjs.map +1 -1
  37. package/dist/pagination.js.map +1 -1
  38. package/dist/pagination.mjs +1 -1
  39. package/dist/pagination.mjs.map +1 -1
  40. package/dist/parse-type.js.map +1 -1
  41. package/dist/parse-type.mjs.map +1 -1
  42. package/dist/policy.js.map +1 -1
  43. package/dist/policy.mjs.map +1 -1
  44. package/dist/primitives/arrays.js.map +1 -1
  45. package/dist/primitives/arrays.mjs.map +1 -1
  46. package/dist/primitives/dates.js.map +1 -1
  47. package/dist/primitives/dates.mjs.map +1 -1
  48. package/dist/primitives/objects.js.map +1 -1
  49. package/dist/primitives/objects.mjs.map +1 -1
  50. package/dist/primitives/strings.js.map +1 -1
  51. package/dist/primitives/strings.mjs.map +1 -1
  52. package/dist/print-value.js.map +1 -1
  53. package/dist/print-value.mjs.map +1 -1
  54. package/dist/provider-factory.js.map +1 -1
  55. package/dist/provider-factory.mjs +1 -1
  56. package/dist/provider-factory.mjs.map +1 -1
  57. package/dist/relations.js.map +1 -1
  58. package/dist/relations.mjs.map +1 -1
  59. package/dist/route-serialization.js.map +1 -1
  60. package/dist/route-serialization.mjs.map +1 -1
  61. package/dist/sanitize/index.js +1 -1
  62. package/dist/sanitize/index.js.map +1 -1
  63. package/dist/sanitize/index.mjs +4 -4
  64. package/dist/sanitize/index.mjs.map +1 -1
  65. package/dist/sanitize/sanitizers.js +1 -0
  66. package/dist/sanitize/sanitizers.js.map +1 -1
  67. package/dist/sanitize/sanitizers.mjs +2 -1
  68. package/dist/sanitize/sanitizers.mjs.map +1 -1
  69. package/dist/sanitize/visitors/expand-wildcard-populate.js.map +1 -1
  70. package/dist/sanitize/visitors/expand-wildcard-populate.mjs.map +1 -1
  71. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
  72. package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
  73. package/dist/sanitize/visitors/remove-dynamic-zones.js.map +1 -1
  74. package/dist/sanitize/visitors/remove-dynamic-zones.mjs.map +1 -1
  75. package/dist/sanitize/visitors/remove-morph-to-relations.js.map +1 -1
  76. package/dist/sanitize/visitors/remove-morph-to-relations.mjs.map +1 -1
  77. package/dist/sanitize/visitors/remove-password.js.map +1 -1
  78. package/dist/sanitize/visitors/remove-password.mjs.map +1 -1
  79. package/dist/sanitize/visitors/remove-private.js.map +1 -1
  80. package/dist/sanitize/visitors/remove-private.mjs.map +1 -1
  81. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
  82. package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
  83. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
  84. package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
  85. package/dist/sanitize/visitors/remove-unrecognized-fields.js.map +1 -1
  86. package/dist/sanitize/visitors/remove-unrecognized-fields.mjs.map +1 -1
  87. package/dist/security.js.map +1 -1
  88. package/dist/security.mjs.map +1 -1
  89. package/dist/set-creator-fields.js.map +1 -1
  90. package/dist/set-creator-fields.mjs.map +1 -1
  91. package/dist/template.js.map +1 -1
  92. package/dist/template.mjs.map +1 -1
  93. package/dist/traverse/factory.js.map +1 -1
  94. package/dist/traverse/factory.mjs.map +1 -1
  95. package/dist/traverse/query-fields.js.map +1 -1
  96. package/dist/traverse/query-fields.mjs.map +1 -1
  97. package/dist/traverse/query-filters.js.map +1 -1
  98. package/dist/traverse/query-filters.mjs.map +1 -1
  99. package/dist/traverse/query-populate.js.map +1 -1
  100. package/dist/traverse/query-populate.mjs +1 -1
  101. package/dist/traverse/query-populate.mjs.map +1 -1
  102. package/dist/traverse/query-sort.js.map +1 -1
  103. package/dist/traverse/query-sort.mjs +1 -1
  104. package/dist/traverse/query-sort.mjs.map +1 -1
  105. package/dist/traverse-entity.js.map +1 -1
  106. package/dist/traverse-entity.mjs +8 -8
  107. package/dist/traverse-entity.mjs.map +1 -1
  108. package/dist/validate/index.js +1 -1
  109. package/dist/validate/index.js.map +1 -1
  110. package/dist/validate/index.mjs +3 -3
  111. package/dist/validate/index.mjs.map +1 -1
  112. package/dist/validate/utils.js.map +1 -1
  113. package/dist/validate/utils.mjs.map +1 -1
  114. package/dist/validate/validators.js +2 -1
  115. package/dist/validate/validators.js.map +1 -1
  116. package/dist/validate/validators.mjs +3 -2
  117. package/dist/validate/validators.mjs.map +1 -1
  118. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
  119. package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
  120. package/dist/validate/visitors/throw-dynamic-zones.js.map +1 -1
  121. package/dist/validate/visitors/throw-dynamic-zones.mjs.map +1 -1
  122. package/dist/validate/visitors/throw-morph-to-relations.js.map +1 -1
  123. package/dist/validate/visitors/throw-morph-to-relations.mjs.map +1 -1
  124. package/dist/validate/visitors/throw-password.js.map +1 -1
  125. package/dist/validate/visitors/throw-password.mjs.map +1 -1
  126. package/dist/validate/visitors/throw-private.js.map +1 -1
  127. package/dist/validate/visitors/throw-private.mjs.map +1 -1
  128. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
  129. package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
  130. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
  131. package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
  132. package/dist/validate/visitors/throw-unrecognized-fields.js.map +1 -1
  133. package/dist/validate/visitors/throw-unrecognized-fields.mjs.map +1 -1
  134. package/dist/validation/route-validators/base.js.map +1 -1
  135. package/dist/validation/route-validators/base.mjs.map +1 -1
  136. package/dist/validation/route-validators/query-params.js.map +1 -1
  137. package/dist/validation/route-validators/query-params.mjs.map +1 -1
  138. package/dist/validation/utilities.js.map +1 -1
  139. package/dist/validation/utilities.mjs.map +1 -1
  140. package/dist/validators.js.map +1 -1
  141. package/dist/validators.mjs.map +1 -1
  142. package/dist/yup.js.map +1 -1
  143. package/dist/yup.mjs.map +1 -1
  144. package/dist/zod.js.map +1 -1
  145. package/dist/zod.mjs.map +1 -1
  146. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"validators.mjs","sources":["../../src/validate/validators.ts"],"sourcesContent":["import { isEmpty, isNil, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport { isScalarAttribute, constants } from '../content-types';\nimport {\n traverseQueryFilters,\n traverseQuerySort,\n traverseQueryFields,\n traverseQueryPopulate,\n} from '../traverse';\nimport { throwPassword, throwPrivate, throwDynamicZones, throwMorphToRelations } from './visitors';\nimport { isOperator } from '../operators';\nimport { asyncCurry, throwInvalidKey } from './utils';\nimport type { Model } from '../types';\nimport parseType from '../parse-type';\nimport type { Parent, Path } from '../traverse/factory';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\ninterface Context {\n schema: Model;\n getModel: (model: string) => Model;\n}\n\ninterface PopulateContext extends Context {\n path?: Path;\n parent?: Parent;\n}\n\ntype AnyFunc = (...args: any[]) => any;\n\nexport const FILTER_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n];\n\nexport const validateFilters = asyncCurry(\n async (ctx: Context, filters: unknown, include: (typeof FILTER_TRAVERSALS)[number][]) => {\n // TODO: schema checks should check that it is a valid schema with yup\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFilters');\n }\n\n // Build the list of functions conditionally\n const functionsToApply: Array<AnyFunc> = [];\n\n // keys that are not attributes or valid operators\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQueryFilters(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n const isAttribute = !!attribute;\n\n if (!isAttribute && !isOperator(key)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQueryFilters(throwDynamicZones, ctx));\n }\n\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQueryFilters(throwMorphToRelations, ctx));\n }\n\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQueryFilters(throwPassword, ctx));\n }\n\n if (include.includes('private')) {\n functionsToApply.push(traverseQueryFilters(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return filters;\n }\n\n return pipeAsync(...functionsToApply)(filters);\n }\n);\n\nexport const defaultValidateFilters = asyncCurry(async (ctx: Context, filters: unknown) => {\n return validateFilters(ctx, filters, FILTER_TRAVERSALS);\n});\n\nexport const SORT_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n 'nonScalarEmptyKeys',\n];\n\nexport const validateSort = asyncCurry(\n async (ctx: Context, sort: unknown, include: (typeof SORT_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateSort');\n }\n\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Validate non attribute keys\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!attribute) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Validate dynamic zones from sort\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQuerySort(throwDynamicZones, ctx));\n }\n\n // Validate morphTo relations from sort\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQuerySort(throwMorphToRelations, ctx));\n }\n\n // Validate passwords from sort\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQuerySort(throwPassword, ctx));\n }\n\n // Validate private from sort\n if (include.includes('private')) {\n functionsToApply.push(traverseQuerySort(throwPrivate, ctx));\n }\n\n // Validate non-scalar empty keys\n if (include.includes('nonScalarEmptyKeys')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, value, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return sort;\n }\n\n return pipeAsync(...functionsToApply)(sort);\n }\n);\n\nexport const defaultValidateSort = asyncCurry(async (ctx: Context, sort: unknown) => {\n return validateSort(ctx, sort, SORT_TRAVERSALS);\n});\n\nexport const FIELDS_TRAVERSALS = ['scalarAttributes', 'privateFields', 'passwordFields'];\n\nexport const validateFields = asyncCurry(\n async (ctx: Context, fields: unknown, include: (typeof FIELDS_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFields');\n }\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Only allow scalar attributes\n if (include.includes('scalarAttributes')) {\n functionsToApply.push(\n traverseQueryFields(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not throwing because of it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (isNil(attribute) || !isScalarAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Private fields\n if (include.includes('privateFields')) {\n functionsToApply.push(traverseQueryFields(throwPrivate, ctx));\n }\n\n // Password fields\n if (include.includes('passwordFields')) {\n functionsToApply.push(traverseQueryFields(throwPassword, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return fields;\n }\n\n return pipeAsync(...functionsToApply)(fields);\n }\n);\n\nexport const defaultValidateFields = asyncCurry(async (ctx: Context, fields: unknown) => {\n return validateFields(ctx, fields, FIELDS_TRAVERSALS);\n});\n\nexport const POPULATE_TRAVERSALS = ['nonAttributesOperators', 'private'];\n\nexport const validatePopulate = asyncCurry(\n async (\n ctx: PopulateContext,\n populate: unknown,\n includes: {\n fields?: (typeof FIELDS_TRAVERSALS)[number][];\n sort?: (typeof SORT_TRAVERSALS)[number][];\n filters?: (typeof FILTER_TRAVERSALS)[number][];\n populate?: (typeof POPULATE_TRAVERSALS)[number][];\n }\n ) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Always include the main traversal function\n functionsToApply.push(\n traverseQueryPopulate(\n async ({ key, path, value, schema, attribute, getModel, parent }, { set }) => {\n /**\n * NOTE: The parent check is done to support \"filters\" (and the rest of keys) as valid attribute names.\n *\n * The parent will not be an attribute when its a \"populate\" / \"filters\" / \"sort\" ... key.\n * Only in those scenarios the node will be an attribute.\n */\n if (!parent?.attribute && attribute) {\n const isPopulatableAttribute = [\n 'relation',\n 'dynamiczone',\n 'component',\n 'media',\n ].includes(attribute.type);\n\n // Throw on non-populate attributes\n if (!isPopulatableAttribute) {\n throwInvalidKey({ key, path: path.raw });\n }\n\n // Valid populatable attribute, so return\n return;\n }\n\n // If we're looking at a populate fragment, ensure its target is valid\n if (key === 'on') {\n // Populate fragment should always be an object\n if (!isObject(value)) {\n return throwInvalidKey({ key, path: path.raw });\n }\n\n const targets = Object.keys(value);\n\n for (const target of targets) {\n const model = getModel(target);\n\n // If a target is invalid (no matching model), then raise an error\n if (!model) {\n throwInvalidKey({ key: target, path: `${path.raw}.${target}` });\n }\n }\n\n // If the fragment's target is fine, then let it pass\n return;\n }\n\n // Ignore plain wildcards\n if (key === '' && value === '*') {\n return;\n }\n\n // Ensure count is a boolean\n if (key === 'count') {\n try {\n parseType({ type: 'boolean', value });\n return;\n } catch {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n\n // Allowed boolean-like keywords should be ignored\n try {\n parseType({ type: 'boolean', value: key });\n // Key is an allowed boolean-like keyword, skipping validation...\n return;\n } catch {\n // Continue, because it's not a boolean-like\n }\n\n // Handle nested `sort` validation with custom or default traversals\n if (key === 'sort') {\n set(\n key,\n await validateSort(\n {\n schema,\n getModel,\n },\n value, // pass the sort value\n includes?.sort || SORT_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `filters` validation with custom or default traversals\n if (key === 'filters') {\n set(\n key,\n await validateFilters(\n {\n schema,\n getModel,\n },\n value, // pass the filters value\n includes?.filters || FILTER_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `fields` validation with custom or default traversals\n if (key === 'fields') {\n set(\n key,\n await validateFields(\n {\n schema,\n getModel,\n },\n value, // pass the fields value\n includes?.fields || FIELDS_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle recursive nested `populate` validation with the same include object\n if (key === 'populate') {\n set(\n key,\n await validatePopulate(\n {\n schema,\n getModel,\n parent: { key, path, schema, attribute },\n path,\n },\n value, // pass the nested populate value\n includes // pass down the same includes object\n )\n );\n return;\n }\n\n // Throw an error if non-attribute operators are included in the populate array\n if (includes?.populate?.includes('nonAttributesOperators')) {\n throwInvalidKey({ key, path: path.attribute });\n }\n },\n ctx\n )\n );\n\n // Conditionally traverse for private fields only if 'private' is included\n if (includes?.populate?.includes('private')) {\n functionsToApply.push(traverseQueryPopulate(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return populate;\n }\n\n return pipeAsync(...functionsToApply)(populate);\n }\n);\n\nexport const defaultValidatePopulate = asyncCurry(async (ctx: Context, populate: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n\n // Call validatePopulate and include all validations by passing in full traversal arrays\n return validatePopulate(ctx, populate, {\n filters: FILTER_TRAVERSALS,\n sort: SORT_TRAVERSALS,\n fields: FIELDS_TRAVERSALS,\n populate: POPULATE_TRAVERSALS,\n });\n});\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","constants","FILTER_TRAVERSALS","validateFilters","asyncCurry","ctx","filters","include","schema","Error","functionsToApply","includes","push","traverseQueryFilters","key","attribute","path","isAttribute","isOperator","throwInvalidKey","throwDynamicZones","throwMorphToRelations","throwPassword","throwPrivate","length","pipeAsync","defaultValidateFilters","SORT_TRAVERSALS","validateSort","sort","traverseQuerySort","value","isScalarAttribute","isEmpty","defaultValidateSort","FIELDS_TRAVERSALS","validateFields","fields","traverseQueryFields","isNil","defaultValidateFields","POPULATE_TRAVERSALS","validatePopulate","populate","traverseQueryPopulate","getModel","parent","set","isPopulatableAttribute","type","raw","isObject","targets","Object","keys","target","model","parseType","defaultValidatePopulate"],"mappings":"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"}
1
+ {"version":3,"file":"validators.mjs","sources":["../../src/validate/validators.ts"],"sourcesContent":["import { isEmpty, isNil, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport { isScalarAttribute, constants } from '../content-types';\nimport {\n traverseQueryFilters,\n traverseQuerySort,\n traverseQueryFields,\n traverseQueryPopulate,\n} from '../traverse';\nimport { throwPassword, throwPrivate, throwDynamicZones, throwMorphToRelations } from './visitors';\nimport { isOperator } from '../operators';\nimport { asyncCurry, throwInvalidKey } from './utils';\nimport type { Model } from '../types';\nimport parseType from '../parse-type';\nimport type { Parent, Path } from '../traverse/factory';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\ninterface Context {\n schema: Model;\n getModel: (model: string) => Model;\n}\n\ninterface PopulateContext extends Context {\n path?: Path;\n parent?: Parent;\n}\n\ntype AnyFunc = (...args: any[]) => any;\n\nexport const FILTER_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n];\n\nexport const validateFilters = asyncCurry(\n async (ctx: Context, filters: unknown, include: (typeof FILTER_TRAVERSALS)[number][]) => {\n // TODO: schema checks should check that it is a valid schema with yup\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFilters');\n }\n\n // Build the list of functions conditionally\n const functionsToApply: Array<AnyFunc> = [];\n\n // keys that are not attributes or valid operators\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQueryFilters(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n const isAttribute = !!attribute;\n\n if (!isAttribute && !isOperator(key)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQueryFilters(throwDynamicZones, ctx));\n }\n\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQueryFilters(throwMorphToRelations, ctx));\n }\n\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQueryFilters(throwPassword, ctx));\n }\n\n if (include.includes('private')) {\n functionsToApply.push(traverseQueryFilters(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return filters;\n }\n\n return pipeAsync(...functionsToApply)(filters);\n }\n);\n\nexport const defaultValidateFilters = asyncCurry(async (ctx: Context, filters: unknown) => {\n return validateFilters(ctx, filters, FILTER_TRAVERSALS);\n});\n\nexport const SORT_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n 'nonScalarEmptyKeys',\n];\n\nexport const validateSort = asyncCurry(\n async (ctx: Context, sort: unknown, include: (typeof SORT_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateSort');\n }\n\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Validate non attribute keys\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!attribute) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Validate dynamic zones from sort\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQuerySort(throwDynamicZones, ctx));\n }\n\n // Validate morphTo relations from sort\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQuerySort(throwMorphToRelations, ctx));\n }\n\n // Validate passwords from sort\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQuerySort(throwPassword, ctx));\n }\n\n // Validate private from sort\n if (include.includes('private')) {\n functionsToApply.push(traverseQuerySort(throwPrivate, ctx));\n }\n\n // Validate non-scalar empty keys\n if (include.includes('nonScalarEmptyKeys')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, value, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return sort;\n }\n\n return pipeAsync(...functionsToApply)(sort);\n }\n);\n\nexport const defaultValidateSort = asyncCurry(async (ctx: Context, sort: unknown) => {\n return validateSort(ctx, sort, SORT_TRAVERSALS);\n});\n\nexport const FIELDS_TRAVERSALS = ['scalarAttributes', 'privateFields', 'passwordFields'];\n\nexport const validateFields = asyncCurry(\n async (ctx: Context, fields: unknown, include: (typeof FIELDS_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFields');\n }\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Only allow scalar attributes\n if (include.includes('scalarAttributes')) {\n functionsToApply.push(\n traverseQueryFields(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not throwing because of it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (isNil(attribute) || !isScalarAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Private fields\n if (include.includes('privateFields')) {\n functionsToApply.push(traverseQueryFields(throwPrivate, ctx));\n }\n\n // Password fields\n if (include.includes('passwordFields')) {\n functionsToApply.push(traverseQueryFields(throwPassword, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return fields;\n }\n\n return pipeAsync(...functionsToApply)(fields);\n }\n);\n\nexport const defaultValidateFields = asyncCurry(async (ctx: Context, fields: unknown) => {\n return validateFields(ctx, fields, FIELDS_TRAVERSALS);\n});\n\nexport const POPULATE_TRAVERSALS = ['nonAttributesOperators', 'private'];\n\nexport const validatePopulate = asyncCurry(\n async (\n ctx: PopulateContext,\n populate: unknown,\n includes: {\n fields?: (typeof FIELDS_TRAVERSALS)[number][];\n sort?: (typeof SORT_TRAVERSALS)[number][];\n filters?: (typeof FILTER_TRAVERSALS)[number][];\n populate?: (typeof POPULATE_TRAVERSALS)[number][];\n }\n ) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Always include the main traversal function\n functionsToApply.push(\n traverseQueryPopulate(\n async ({ key, path, value, schema, attribute, getModel, parent }, { set }) => {\n /**\n * NOTE: The parent check is done to support \"filters\" (and the rest of keys) as valid attribute names.\n *\n * The parent will not be an attribute when its a \"populate\" / \"filters\" / \"sort\" ... key.\n * Only in those scenarios the node will be an attribute.\n */\n if (!parent?.attribute && attribute) {\n const isPopulatableAttribute = [\n 'relation',\n 'dynamiczone',\n 'component',\n 'media',\n ].includes(attribute.type);\n\n // Throw on non-populate attributes\n if (!isPopulatableAttribute) {\n throwInvalidKey({ key, path: path.raw });\n }\n\n // Valid populatable attribute, so return\n return;\n }\n\n // If we're looking at a populate fragment, ensure its target is valid\n if (key === 'on') {\n // Populate fragment should always be an object\n if (!isObject(value)) {\n return throwInvalidKey({ key, path: path.raw });\n }\n\n const targets = Object.keys(value);\n\n for (const target of targets) {\n const model = getModel(target);\n\n // If a target is invalid (no matching model), then raise an error\n if (!model) {\n throwInvalidKey({ key: target, path: `${path.raw}.${target}` });\n }\n }\n\n // If the fragment's target is fine, then let it pass\n return;\n }\n\n // Ignore plain wildcards\n if (key === '' && value === '*') {\n return;\n }\n\n // Ensure count is a boolean\n if (key === 'count') {\n try {\n parseType({ type: 'boolean', value });\n return;\n } catch {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n\n // Allowed boolean-like keywords should be ignored\n try {\n parseType({ type: 'boolean', value: key });\n // Key is an allowed boolean-like keyword, skipping validation...\n return;\n } catch {\n // Continue, because it's not a boolean-like\n }\n\n // Handle nested `sort` validation with custom or default traversals\n if (key === 'sort') {\n set(\n key,\n await validateSort(\n {\n schema,\n getModel,\n },\n value, // pass the sort value\n includes?.sort || SORT_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `filters` validation with custom or default traversals\n if (key === 'filters') {\n set(\n key,\n await validateFilters(\n {\n schema,\n getModel,\n },\n value, // pass the filters value\n includes?.filters || FILTER_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `fields` validation with custom or default traversals\n if (key === 'fields') {\n set(\n key,\n await validateFields(\n {\n schema,\n getModel,\n },\n value, // pass the fields value\n includes?.fields || FIELDS_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle recursive nested `populate` validation with the same include object\n if (key === 'populate') {\n set(\n key,\n await validatePopulate(\n {\n schema,\n getModel,\n parent: { key, path, schema, attribute },\n path,\n },\n value, // pass the nested populate value\n includes // pass down the same includes object\n )\n );\n return;\n }\n\n // Throw an error if non-attribute operators are included in the populate array\n if (includes?.populate?.includes('nonAttributesOperators')) {\n throwInvalidKey({ key, path: path.attribute });\n }\n },\n ctx\n )\n );\n\n // Conditionally traverse for private fields only if 'private' is included\n if (includes?.populate?.includes('private')) {\n functionsToApply.push(traverseQueryPopulate(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return populate;\n }\n\n return pipeAsync(...functionsToApply)(populate);\n }\n);\n\nexport const defaultValidatePopulate = asyncCurry(async (ctx: Context, populate: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n\n // Call validatePopulate and include all validations by passing in full traversal arrays\n return validatePopulate(ctx, populate, {\n filters: FILTER_TRAVERSALS,\n sort: SORT_TRAVERSALS,\n fields: FIELDS_TRAVERSALS,\n populate: POPULATE_TRAVERSALS,\n });\n});\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","constants","FILTER_TRAVERSALS","validateFilters","asyncCurry","ctx","filters","include","schema","Error","functionsToApply","includes","push","traverseQueryFilters","key","attribute","path","isAttribute","isOperator","throwInvalidKey","throwDynamicZones","throwMorphToRelations","throwPassword","throwPrivate","length","pipeAsync","defaultValidateFilters","SORT_TRAVERSALS","validateSort","sort","traverseQuerySort","value","isScalarAttribute","isEmpty","defaultValidateSort","FIELDS_TRAVERSALS","validateFields","fields","traverseQueryFields","isNil","defaultValidateFields","POPULATE_TRAVERSALS","validatePopulate","populate","traverseQueryPopulate","getModel","parent","set","isPopulatableAttribute","type","raw","isObject","targets","Object","keys","target","model","parseType","defaultValidatePopulate"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-disallowed-fields.js","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n"],"names":["allowedFields","key","path","attribute","isArray","every","isString","TypeError","isNil","containedPaths","getContainedPaths","isPathAllowed","some","p","includes","startsWith","throwInvalidKey","parts","toPath","reduce","acc","value","index","list","slice","join"],"mappings":";;;;;AAIA,4BAAe,CAAA,CAACA,aAAiC,GAAA,IAAI,GACnD,CAAC,EAAEC,GAAG,EAAEC,IAAM,EAAA,EAAEC,SAAWD,EAAAA,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,kBAAkB,IAAM,EAAA;AAC1B,YAAA;AACF;;QAGA,IAAI,EAAEI,UAAQJ,CAAAA,aAAAA,CAAAA,IAAkBA,cAAcK,KAAK,CAACC,YAAQ,CAAI,EAAA;YAC9D,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOP,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF;AAEA,QAAA,IAAIQ,SAAMN,IAAO,CAAA,EAAA;AACf,YAAA;AACF;AAEA,QAAA,MAAMO,iBAAiBC,iBAAkBR,CAAAA,IAAAA,CAAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCC,QACD,MAAMS,aAAgBX,GAAAA,aAAAA,CAAcY,IAAI,CACtC,CAACC,CAAMJ,GAAAA,cAAAA,CAAeK,QAAQ,CAACD,MAAMA,CAAEE,CAAAA,UAAU,CAAC,CAAGb,EAAAA,IAAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG9D,QAAA,IAAIS,aAAe,EAAA;AACjB,YAAA;AACF;;QAGAK,qBAAgB,CAAA;AAAEf,YAAAA,GAAAA;AAAKC,YAAAA;AAAK,SAAA,CAAA;AAC9B,KAAA;AAEF;;;;;;;;;;;;;;IAeA,MAAMQ,oBAAoB,CAACR,IAAAA,GAAAA;AACzB,IAAA,MAAMe,QAAQC,SAAOhB,CAAAA,IAAAA,CAAAA;AAErB,IAAA,OAAOe,MAAME,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAOC,KAAOC,EAAAA,IAAAA,GAAAA;QACtC,OAAO;AAAIH,YAAAA,GAAAA,GAAAA;AAAKG,YAAAA,IAAAA,CAAKC,KAAK,CAAC,CAAA,EAAGF,KAAQ,GAAA,CAAA,CAAA,CAAGG,IAAI,CAAC,GAAA;AAAK,SAAA;AACrD,KAAA,EAAG,EAAE,CAAA;AACP,CAAA;;;;"}
1
+ {"version":3,"file":"throw-disallowed-fields.js","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n"],"names":["allowedFields","key","path","attribute","isArray","every","isString","TypeError","isNil","containedPaths","getContainedPaths","isPathAllowed","some","p","includes","startsWith","throwInvalidKey","parts","toPath","reduce","acc","value","index","list","slice","join"],"mappings":";;;;;AAIA,4BAAe,CAAA,CAACA,aAAAA,GAAiC,IAAI,GACnD,CAAC,EAAEC,GAAG,EAAEC,IAAAA,EAAM,EAAEC,SAAAA,EAAWD,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,kBAAkB,IAAA,EAAM;AAC1B,YAAA;AACF,QAAA;;QAGA,IAAI,EAAEI,UAAAA,CAAQJ,aAAAA,CAAAA,IAAkBA,cAAcK,KAAK,CAACC,YAAQ,CAAA,EAAI;YAC9D,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOP,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF,QAAA;AAEA,QAAA,IAAIQ,SAAMN,IAAAA,CAAAA,EAAO;AACf,YAAA;AACF,QAAA;AAEA,QAAA,MAAMO,iBAAiBC,iBAAAA,CAAkBR,IAAAA,CAAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCC,QACD,MAAMS,aAAAA,GAAgBX,aAAAA,CAAcY,IAAI,CACtC,CAACC,CAAAA,GAAMJ,cAAAA,CAAeK,QAAQ,CAACD,MAAMA,CAAAA,CAAEE,UAAU,CAAC,CAAA,EAAGb,IAAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG9D,QAAA,IAAIS,aAAAA,EAAe;AACjB,YAAA;AACF,QAAA;;QAGAK,qBAAAA,CAAgB;AAAEf,YAAAA,GAAAA;AAAKC,YAAAA;AAAK,SAAA,CAAA;AAC9B,IAAA,CAAA;AAEF;;;;;;;;;;;;;;IAeA,MAAMQ,oBAAoB,CAACR,IAAAA,GAAAA;AACzB,IAAA,MAAMe,QAAQC,SAAAA,CAAOhB,IAAAA,CAAAA;AAErB,IAAA,OAAOe,MAAME,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAOC,KAAAA,EAAOC,IAAAA,GAAAA;QACtC,OAAO;AAAIH,YAAAA,GAAAA,GAAAA;AAAKG,YAAAA,IAAAA,CAAKC,KAAK,CAAC,CAAA,EAAGF,KAAAA,GAAQ,CAAA,CAAA,CAAGG,IAAI,CAAC,GAAA;AAAK,SAAA;AACrD,IAAA,CAAA,EAAG,EAAE,CAAA;AACP,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-disallowed-fields.mjs","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n"],"names":["allowedFields","key","path","attribute","isArray","every","isString","TypeError","isNil","containedPaths","getContainedPaths","isPathAllowed","some","p","includes","startsWith","throwInvalidKey","parts","toPath","reduce","acc","value","index","list","slice","join"],"mappings":";;;AAIA,4BAAe,CAAA,CAACA,aAAiC,GAAA,IAAI,GACnD,CAAC,EAAEC,GAAG,EAAEC,IAAM,EAAA,EAAEC,SAAWD,EAAAA,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,kBAAkB,IAAM,EAAA;AAC1B,YAAA;AACF;;QAGA,IAAI,EAAEI,OAAQJ,CAAAA,aAAAA,CAAAA,IAAkBA,cAAcK,KAAK,CAACC,SAAQ,CAAI,EAAA;YAC9D,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOP,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF;AAEA,QAAA,IAAIQ,MAAMN,IAAO,CAAA,EAAA;AACf,YAAA;AACF;AAEA,QAAA,MAAMO,iBAAiBC,iBAAkBR,CAAAA,IAAAA,CAAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCC,QACD,MAAMS,aAAgBX,GAAAA,aAAAA,CAAcY,IAAI,CACtC,CAACC,CAAMJ,GAAAA,cAAAA,CAAeK,QAAQ,CAACD,MAAMA,CAAEE,CAAAA,UAAU,CAAC,CAAGb,EAAAA,IAAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG9D,QAAA,IAAIS,aAAe,EAAA;AACjB,YAAA;AACF;;QAGAK,eAAgB,CAAA;AAAEf,YAAAA,GAAAA;AAAKC,YAAAA;AAAK,SAAA,CAAA;AAC9B,KAAA;AAEF;;;;;;;;;;;;;;IAeA,MAAMQ,oBAAoB,CAACR,IAAAA,GAAAA;AACzB,IAAA,MAAMe,QAAQC,MAAOhB,CAAAA,IAAAA,CAAAA;AAErB,IAAA,OAAOe,MAAME,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAOC,KAAOC,EAAAA,IAAAA,GAAAA;QACtC,OAAO;AAAIH,YAAAA,GAAAA,GAAAA;AAAKG,YAAAA,IAAAA,CAAKC,KAAK,CAAC,CAAA,EAAGF,KAAQ,GAAA,CAAA,CAAA,CAAGG,IAAI,CAAC,GAAA;AAAK,SAAA;AACrD,KAAA,EAAG,EAAE,CAAA;AACP,CAAA;;;;"}
1
+ {"version":3,"file":"throw-disallowed-fields.mjs","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n"],"names":["allowedFields","key","path","attribute","isArray","every","isString","TypeError","isNil","containedPaths","getContainedPaths","isPathAllowed","some","p","includes","startsWith","throwInvalidKey","parts","toPath","reduce","acc","value","index","list","slice","join"],"mappings":";;;AAIA,4BAAe,CAAA,CAACA,aAAAA,GAAiC,IAAI,GACnD,CAAC,EAAEC,GAAG,EAAEC,IAAAA,EAAM,EAAEC,SAAAA,EAAWD,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,kBAAkB,IAAA,EAAM;AAC1B,YAAA;AACF,QAAA;;QAGA,IAAI,EAAEI,OAAAA,CAAQJ,aAAAA,CAAAA,IAAkBA,cAAcK,KAAK,CAACC,SAAQ,CAAA,EAAI;YAC9D,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOP,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF,QAAA;AAEA,QAAA,IAAIQ,MAAMN,IAAAA,CAAAA,EAAO;AACf,YAAA;AACF,QAAA;AAEA,QAAA,MAAMO,iBAAiBC,iBAAAA,CAAkBR,IAAAA,CAAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCC,QACD,MAAMS,aAAAA,GAAgBX,aAAAA,CAAcY,IAAI,CACtC,CAACC,CAAAA,GAAMJ,cAAAA,CAAeK,QAAQ,CAACD,MAAMA,CAAAA,CAAEE,UAAU,CAAC,CAAA,EAAGb,IAAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG9D,QAAA,IAAIS,aAAAA,EAAe;AACjB,YAAA;AACF,QAAA;;QAGAK,eAAAA,CAAgB;AAAEf,YAAAA,GAAAA;AAAKC,YAAAA;AAAK,SAAA,CAAA;AAC9B,IAAA,CAAA;AAEF;;;;;;;;;;;;;;IAeA,MAAMQ,oBAAoB,CAACR,IAAAA,GAAAA;AACzB,IAAA,MAAMe,QAAQC,MAAAA,CAAOhB,IAAAA,CAAAA;AAErB,IAAA,OAAOe,MAAME,MAAM,CAAC,CAACC,GAAAA,EAAKC,OAAOC,KAAAA,EAAOC,IAAAA,GAAAA;QACtC,OAAO;AAAIH,YAAAA,GAAAA,GAAAA;AAAKG,YAAAA,IAAAA,CAAKC,KAAK,CAAC,CAAA,EAAGF,KAAAA,GAAQ,CAAA,CAAA,CAAGG,IAAI,CAAC,GAAA;AAAK,SAAA;AACrD,IAAA,CAAA,EAAG,EAAE,CAAA;AACP,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-dynamic-zones.js","sources":["../../../src/validate/visitors/throw-dynamic-zones.ts"],"sourcesContent":["import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isDynamicZoneAttribute","throwInvalidKey"],"mappings":";;;;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,oCAAuBF,SAAY,CAAA,EAAA;QACrCG,qBAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-dynamic-zones.js","sources":["../../../src/validate/visitors/throw-dynamic-zones.ts"],"sourcesContent":["import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isDynamicZoneAttribute","throwInvalidKey"],"mappings":";;;;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,oCAAuBF,SAAAA,CAAAA,EAAY;QACrCG,qBAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-dynamic-zones.mjs","sources":["../../../src/validate/visitors/throw-dynamic-zones.ts"],"sourcesContent":["import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isDynamicZoneAttribute","throwInvalidKey"],"mappings":";;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,uBAAuBF,SAAY,CAAA,EAAA;QACrCG,eAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-dynamic-zones.mjs","sources":["../../../src/validate/visitors/throw-dynamic-zones.ts"],"sourcesContent":["import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isDynamicZoneAttribute","throwInvalidKey"],"mappings":";;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,uBAAuBF,SAAAA,CAAAA,EAAY;QACrCG,eAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-morph-to-relations.js","sources":["../../../src/validate/visitors/throw-morph-to-relations.ts"],"sourcesContent":["import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isMorphToRelationalAttribute","throwInvalidKey"],"mappings":";;;;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,0CAA6BF,SAAY,CAAA,EAAA;QAC3CG,qBAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-morph-to-relations.js","sources":["../../../src/validate/visitors/throw-morph-to-relations.ts"],"sourcesContent":["import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isMorphToRelationalAttribute","throwInvalidKey"],"mappings":";;;;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,0CAA6BF,SAAAA,CAAAA,EAAY;QAC3CG,qBAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-morph-to-relations.mjs","sources":["../../../src/validate/visitors/throw-morph-to-relations.ts"],"sourcesContent":["import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isMorphToRelationalAttribute","throwInvalidKey"],"mappings":";;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,6BAA6BF,SAAY,CAAA,EAAA;QAC3CG,eAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-morph-to-relations.mjs","sources":["../../../src/validate/visitors/throw-morph-to-relations.ts"],"sourcesContent":["import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","isMorphToRelationalAttribute","throwInvalidKey"],"mappings":";;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AAChD,IAAA,IAAIC,6BAA6BF,SAAAA,CAAAA,EAAY;QAC3CG,eAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-password.js","sources":["../../../src/validate/visitors/throw-password.ts"],"sourcesContent":["import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","type","throwInvalidKey"],"mappings":";;;;AAGMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;IAChD,IAAID,SAAAA,EAAWE,SAAS,UAAY,EAAA;QAClCC,qBAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-password.js","sources":["../../../src/validate/visitors/throw-password.ts"],"sourcesContent":["import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","type","throwInvalidKey"],"mappings":";;;;AAGA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;IAChD,IAAID,SAAAA,EAAWE,SAAS,UAAA,EAAY;QAClCC,qBAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-password.mjs","sources":["../../../src/validate/visitors/throw-password.ts"],"sourcesContent":["import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","type","throwInvalidKey"],"mappings":";;AAGMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;IAChD,IAAID,SAAAA,EAAWE,SAAS,UAAY,EAAA;QAClCC,eAAgB,CAAA;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-password.mjs","sources":["../../../src/validate/visitors/throw-password.ts"],"sourcesContent":["import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","key","attribute","path","type","throwInvalidKey"],"mappings":";;AAGA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;IAChD,IAAID,SAAAA,EAAWE,SAAS,UAAA,EAAY;QAClCC,eAAAA,CAAgB;AAAEJ,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-private.js","sources":["../../../src/validate/visitors/throw-private.ts"],"sourcesContent":["import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","schema","key","attribute","path","isPrivate","private","isPrivateAttribute","throwInvalidKey"],"mappings":";;;;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AACxD,IAAA,IAAI,CAACD,SAAW,EAAA;AACd,QAAA;AACF;AAEA,IAAA,MAAME,YAAYF,SAAUG,CAAAA,OAAO,KAAK,IAAA,IAAQC,gCAAmBN,MAAQC,EAAAA,GAAAA,CAAAA;AAE3E,IAAA,IAAIG,SAAW,EAAA;QACbG,qBAAgB,CAAA;AAAEN,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-private.js","sources":["../../../src/validate/visitors/throw-private.ts"],"sourcesContent":["import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","schema","key","attribute","path","isPrivate","private","isPrivateAttribute","throwInvalidKey"],"mappings":";;;;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AACxD,IAAA,IAAI,CAACD,SAAAA,EAAW;AACd,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,YAAYF,SAAAA,CAAUG,OAAO,KAAK,IAAA,IAAQC,gCAAmBN,MAAAA,EAAQC,GAAAA,CAAAA;AAE3E,IAAA,IAAIG,SAAAA,EAAW;QACbG,qBAAAA,CAAgB;AAAEN,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-private.mjs","sources":["../../../src/validate/visitors/throw-private.ts"],"sourcesContent":["import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","schema","key","attribute","path","isPrivate","private","isPrivateAttribute","throwInvalidKey"],"mappings":";;;AAIMA,MAAAA,OAAAA,GAAmB,CAAC,EAAEC,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AACxD,IAAA,IAAI,CAACD,SAAW,EAAA;AACd,QAAA;AACF;AAEA,IAAA,MAAME,YAAYF,SAAUG,CAAAA,OAAO,KAAK,IAAA,IAAQC,mBAAmBN,MAAQC,EAAAA,GAAAA,CAAAA;AAE3E,IAAA,IAAIG,SAAW,EAAA;QACbG,eAAgB,CAAA;AAAEN,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C;AACF;;;;"}
1
+ {"version":3,"file":"throw-private.mjs","sources":["../../../src/validate/visitors/throw-private.ts"],"sourcesContent":["import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n"],"names":["visitor","schema","key","attribute","path","isPrivate","private","isPrivateAttribute","throwInvalidKey"],"mappings":";;;AAIA,MAAMA,OAAAA,GAAmB,CAAC,EAAEC,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAA;AACxD,IAAA,IAAI,CAACD,SAAAA,EAAW;AACd,QAAA;AACF,IAAA;AAEA,IAAA,MAAME,YAAYF,SAAAA,CAAUG,OAAO,KAAK,IAAA,IAAQC,mBAAmBN,MAAAA,EAAQC,GAAAA,CAAAA;AAE3E,IAAA,IAAIG,SAAAA,EAAW;QACbG,eAAAA,CAAgB;AAAEN,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AAC9C,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-restricted-fields.js","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n"],"names":["restrictedFields","key","path","attribute","throwInvalidKey","isArray","every","isString","TypeError","includes","isRestrictedNested","some","allowedPath","toString","startsWith"],"mappings":";;;;;AAIA,4BAAe,CAAA,CAACA,gBAAoC,GAAA,IAAI,GACtD,CAAC,EAAEC,GAAG,EAAEC,IAAM,EAAA,EAAEC,SAAWD,EAAAA,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,qBAAqB,IAAM,EAAA;YAC7BI,qBAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;;QAGA,IAAI,EAAEG,UAAQL,CAAAA,gBAAAA,CAAAA,IAAqBA,iBAAiBM,KAAK,CAACC,YAAQ,CAAI,EAAA;YACpE,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOR,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF;;QAGA,IAAIA,gBAAAA,CAAiBS,QAAQ,CAACP,IAAiB,CAAA,EAAA;YAC7CE,qBAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;;AAGA,QAAA,MAAMQ,kBAAqBV,GAAAA,gBAAAA,CAAiBW,IAAI,CAAC,CAACC,WAAAA,GAChDV,IAAMW,EAAAA,QAAAA,EAAAA,CAAWC,UAAW,CAAA,CAAA,EAAGF,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAoB,EAAA;YACtBN,qBAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;AACF,KAAA;;;;"}
1
+ {"version":3,"file":"throw-restricted-fields.js","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n"],"names":["restrictedFields","key","path","attribute","throwInvalidKey","isArray","every","isString","TypeError","includes","isRestrictedNested","some","allowedPath","toString","startsWith"],"mappings":";;;;;AAIA,4BAAe,CAAA,CAACA,gBAAAA,GAAoC,IAAI,GACtD,CAAC,EAAEC,GAAG,EAAEC,IAAAA,EAAM,EAAEC,SAAAA,EAAWD,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,qBAAqB,IAAA,EAAM;YAC7BI,qBAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;QAGA,IAAI,EAAEG,UAAAA,CAAQL,gBAAAA,CAAAA,IAAqBA,iBAAiBM,KAAK,CAACC,YAAQ,CAAA,EAAI;YACpE,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOR,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF,QAAA;;QAGA,IAAIA,gBAAAA,CAAiBS,QAAQ,CAACP,IAAAA,CAAAA,EAAiB;YAC7CE,qBAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;AAGA,QAAA,MAAMQ,kBAAAA,GAAqBV,gBAAAA,CAAiBW,IAAI,CAAC,CAACC,WAAAA,GAChDV,IAAAA,EAAMW,QAAAA,EAAAA,CAAWC,UAAAA,CAAW,CAAA,EAAGF,WAAAA,CAAY,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAAA,EAAoB;YACtBN,qBAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;AACF,IAAA,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-restricted-fields.mjs","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n"],"names":["restrictedFields","key","path","attribute","throwInvalidKey","isArray","every","isString","TypeError","includes","isRestrictedNested","some","allowedPath","toString","startsWith"],"mappings":";;;AAIA,4BAAe,CAAA,CAACA,gBAAoC,GAAA,IAAI,GACtD,CAAC,EAAEC,GAAG,EAAEC,IAAM,EAAA,EAAEC,SAAWD,EAAAA,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,qBAAqB,IAAM,EAAA;YAC7BI,eAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;;QAGA,IAAI,EAAEG,OAAQL,CAAAA,gBAAAA,CAAAA,IAAqBA,iBAAiBM,KAAK,CAACC,SAAQ,CAAI,EAAA;YACpE,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOR,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF;;QAGA,IAAIA,gBAAAA,CAAiBS,QAAQ,CAACP,IAAiB,CAAA,EAAA;YAC7CE,eAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;;AAGA,QAAA,MAAMQ,kBAAqBV,GAAAA,gBAAAA,CAAiBW,IAAI,CAAC,CAACC,WAAAA,GAChDV,IAAMW,EAAAA,QAAAA,EAAAA,CAAWC,UAAW,CAAA,CAAA,EAAGF,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAoB,EAAA;YACtBN,eAAgB,CAAA;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B;AACF,KAAA;;;;"}
1
+ {"version":3,"file":"throw-restricted-fields.mjs","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n"],"names":["restrictedFields","key","path","attribute","throwInvalidKey","isArray","every","isString","TypeError","includes","isRestrictedNested","some","allowedPath","toString","startsWith"],"mappings":";;;AAIA,4BAAe,CAAA,CAACA,gBAAAA,GAAoC,IAAI,GACtD,CAAC,EAAEC,GAAG,EAAEC,IAAAA,EAAM,EAAEC,SAAAA,EAAWD,IAAI,EAAE,EAAE,GAAA;;AAEjC,QAAA,IAAIF,qBAAqB,IAAA,EAAM;YAC7BI,eAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;QAGA,IAAI,EAAEG,OAAAA,CAAQL,gBAAAA,CAAAA,IAAqBA,iBAAiBM,KAAK,CAACC,SAAQ,CAAA,EAAI;YACpE,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOR,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF,QAAA;;QAGA,IAAIA,gBAAAA,CAAiBS,QAAQ,CAACP,IAAAA,CAAAA,EAAiB;YAC7CE,eAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;AAGA,QAAA,MAAMQ,kBAAAA,GAAqBV,gBAAAA,CAAiBW,IAAI,CAAC,CAACC,WAAAA,GAChDV,IAAAA,EAAMW,QAAAA,EAAAA,CAAWC,UAAAA,CAAW,CAAA,EAAGF,WAAAA,CAAY,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAAA,EAAoB;YACtBN,eAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;AACF,IAAA,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-restricted-relations.js","sources":["../../../src/validate/visitors/throw-restricted-relations.ts"],"sourcesContent":["import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n"],"names":["ACTIONS_TO_VERIFY","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypeUtils","auth","data","key","attribute","schema","path","isRelation","type","handleMorphRelation","elements","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","VALID_RELATION_ORDERING_KEYS","isArray","element","isObject","scopes","map","action","__type","isAllowed","hasAccessToSomeScopes","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
1
+ {"version":3,"file":"throw-restricted-relations.js","sources":["../../../src/validate/visitors/throw-restricted-relations.ts"],"sourcesContent":["import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n"],"names":["ACTIONS_TO_VERIFY","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypeUtils","auth","data","key","attribute","schema","path","isRelation","type","handleMorphRelation","elements","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","VALID_RELATION_ORDERING_KEYS","isArray","element","isObject","scopes","map","action","__type","isAllowed","hasAccessToSomeScopes","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-restricted-relations.mjs","sources":["../../../src/validate/visitors/throw-restricted-relations.ts"],"sourcesContent":["import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n"],"names":["ACTIONS_TO_VERIFY","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypeUtils","auth","data","key","attribute","schema","path","isRelation","type","handleMorphRelation","elements","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","VALID_RELATION_ORDERING_KEYS","isArray","element","isObject","scopes","map","action","__type","isAllowed","hasAccessToSomeScopes","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
1
+ {"version":3,"file":"throw-restricted-relations.mjs","sources":["../../../src/validate/visitors/throw-restricted-relations.ts"],"sourcesContent":["import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n"],"names":["ACTIONS_TO_VERIFY","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypeUtils","auth","data","key","attribute","schema","path","isRelation","type","handleMorphRelation","elements","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","VALID_RELATION_ORDERING_KEYS","isArray","element","isObject","scopes","map","action","__type","isAllowed","hasAccessToSomeScopes","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-unrecognized-fields.js","sources":["../../../src/validate/visitors/throw-unrecognized-fields.ts"],"sourcesContent":["import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n isComponentSchema,\n isMediaAttribute,\n isComponentAttribute,\n DYNAMIC_ZONE_KEYS,\n ID_FIELDS,\n MORPH_TO_KEYS,\n RELATION_OPERATION_KEYS,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\nconst throwUnrecognizedFields: Visitor = (\n { key, attribute, path, schema, parent, allowedExtraRootKeys },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Visitor type requires second param\n _visitorUtils\n) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept id-like fields\n if (path.attribute === null) {\n if (ID_FIELDS.includes(key)) {\n return;\n }\n if (allowedExtraRootKeys?.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: path.attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_KEYS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow relation operation keys (connect, disconnect, set, options) for relations and media\n if (\n (isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute)) &&\n RELATION_OPERATION_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow id fields for relations, media, and components\n const canUseID =\n isRelationalAttribute(parent?.attribute) ||\n isMediaAttribute(parent?.attribute) ||\n isComponentAttribute(parent?.attribute);\n if (canUseID && ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: path.attribute });\n};\n\nexport default throwUnrecognizedFields;\n"],"names":["throwUnrecognizedFields","key","attribute","path","schema","parent","allowedExtraRootKeys","_visitorUtils","ID_FIELDS","includes","throwInvalidKey","isMorphToRelationalAttribute","MORPH_TO_KEYS","isComponentSchema","isDynamicZoneAttribute","DYNAMIC_ZONE_KEYS","isRelationalAttribute","isMediaAttribute","RELATION_OPERATION_KEYS","canUseID","isComponentAttribute"],"mappings":";;;;;AAeA,MAAMA,0BAAmC,CACvC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,oBAAoB,EAAE;AAE9DC,aAAAA,GAAAA;;AAGA,IAAA,IAAIL,SAAW,EAAA;AACb,QAAA;AACF;;IAGA,IAAIC,IAAAA,CAAKD,SAAS,KAAK,IAAM,EAAA;QAC3B,IAAIM,sBAAAA,CAAUC,QAAQ,CAACR,GAAM,CAAA,EAAA;AAC3B,YAAA;AACF;QACA,IAAIK,oBAAAA,EAAsBG,SAASR,GAAM,CAAA,EAAA;AACvC,YAAA;AACF;AAEA,QAAA,OAAOS,qBAAgB,CAAA;AAAET,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AACrD;;AAGA,IAAA,IAAIS,0CAA6BN,MAAQH,EAAAA,SAAAA,CAAAA,IAAcU,0BAAcH,CAAAA,QAAQ,CAACR,GAAM,CAAA,EAAA;AAClF,QAAA;AACF;;IAGA,IACEY,8BAAAA,CAAkBT,WAClBU,mCAAuBT,CAAAA,MAAAA,EAAQH,cAC/Ba,8BAAkBN,CAAAA,QAAQ,CAACR,GAC3B,CAAA,EAAA;AACA,QAAA;AACF;;AAGA,IAAA,IACE,CAACe,kCAAsBX,CAAAA,MAAAA,EAAQH,SAAce,CAAAA,IAAAA,6BAAAA,CAAiBZ,MAAQH,EAAAA,SAAAA,CAAS,KAC/EgB,oCAAAA,CAAwBT,QAAQ,CAACR,GACjC,CAAA,EAAA;AACA,QAAA;AACF;;IAGA,MAAMkB,QAAAA,GACJH,mCAAsBX,MAAQH,EAAAA,SAAAA,CAAAA,IAC9Be,8BAAiBZ,MAAQH,EAAAA,SAAAA,CAAAA,IACzBkB,kCAAqBf,MAAQH,EAAAA,SAAAA,CAAAA;AAC/B,IAAA,IAAIiB,QAAYX,IAAAA,sBAAAA,CAAUC,QAAQ,CAACR,GAAM,CAAA,EAAA;AACvC,QAAA;AACF;;IAGAS,qBAAgB,CAAA;AAAET,QAAAA,GAAAA;AAAKE,QAAAA,IAAAA,EAAMA,KAAKD;AAAU,KAAA,CAAA;AAC9C;;;;"}
1
+ {"version":3,"file":"throw-unrecognized-fields.js","sources":["../../../src/validate/visitors/throw-unrecognized-fields.ts"],"sourcesContent":["import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n isComponentSchema,\n isMediaAttribute,\n isComponentAttribute,\n DYNAMIC_ZONE_KEYS,\n ID_FIELDS,\n MORPH_TO_KEYS,\n RELATION_OPERATION_KEYS,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\nconst throwUnrecognizedFields: Visitor = (\n { key, attribute, path, schema, parent, allowedExtraRootKeys },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Visitor type requires second param\n _visitorUtils\n) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept id-like fields\n if (path.attribute === null) {\n if (ID_FIELDS.includes(key)) {\n return;\n }\n if (allowedExtraRootKeys?.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: path.attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_KEYS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow relation operation keys (connect, disconnect, set, options) for relations and media\n if (\n (isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute)) &&\n RELATION_OPERATION_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow id fields for relations, media, and components\n const canUseID =\n isRelationalAttribute(parent?.attribute) ||\n isMediaAttribute(parent?.attribute) ||\n isComponentAttribute(parent?.attribute);\n if (canUseID && ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: path.attribute });\n};\n\nexport default throwUnrecognizedFields;\n"],"names":["throwUnrecognizedFields","key","attribute","path","schema","parent","allowedExtraRootKeys","_visitorUtils","ID_FIELDS","includes","throwInvalidKey","isMorphToRelationalAttribute","MORPH_TO_KEYS","isComponentSchema","isDynamicZoneAttribute","DYNAMIC_ZONE_KEYS","isRelationalAttribute","isMediaAttribute","RELATION_OPERATION_KEYS","canUseID","isComponentAttribute"],"mappings":";;;;;AAeA,MAAMA,0BAAmC,CACvC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,oBAAoB,EAAE;AAE9DC,aAAAA,GAAAA;;AAGA,IAAA,IAAIL,SAAAA,EAAW;AACb,QAAA;AACF,IAAA;;IAGA,IAAIC,IAAAA,CAAKD,SAAS,KAAK,IAAA,EAAM;QAC3B,IAAIM,sBAAAA,CAAUC,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AAC3B,YAAA;AACF,QAAA;QACA,IAAIK,oBAAAA,EAAsBG,SAASR,GAAAA,CAAAA,EAAM;AACvC,YAAA;AACF,QAAA;AAEA,QAAA,OAAOS,qBAAAA,CAAgB;AAAET,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AACrD,IAAA;;AAGA,IAAA,IAAIS,0CAA6BN,MAAAA,EAAQH,SAAAA,CAAAA,IAAcU,0BAAAA,CAAcH,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AAClF,QAAA;AACF,IAAA;;IAGA,IACEY,8BAAAA,CAAkBT,WAClBU,mCAAAA,CAAuBT,MAAAA,EAAQH,cAC/Ba,8BAAAA,CAAkBN,QAAQ,CAACR,GAAAA,CAAAA,EAC3B;AACA,QAAA;AACF,IAAA;;AAGA,IAAA,IACE,CAACe,kCAAAA,CAAsBX,MAAAA,EAAQH,SAAAA,CAAAA,IAAce,6BAAAA,CAAiBZ,MAAAA,EAAQH,SAAAA,CAAS,KAC/EgB,oCAAAA,CAAwBT,QAAQ,CAACR,GAAAA,CAAAA,EACjC;AACA,QAAA;AACF,IAAA;;IAGA,MAAMkB,QAAAA,GACJH,mCAAsBX,MAAAA,EAAQH,SAAAA,CAAAA,IAC9Be,8BAAiBZ,MAAAA,EAAQH,SAAAA,CAAAA,IACzBkB,kCAAqBf,MAAAA,EAAQH,SAAAA,CAAAA;AAC/B,IAAA,IAAIiB,QAAAA,IAAYX,sBAAAA,CAAUC,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AACvC,QAAA;AACF,IAAA;;IAGAS,qBAAAA,CAAgB;AAAET,QAAAA,GAAAA;AAAKE,QAAAA,IAAAA,EAAMA,KAAKD;AAAU,KAAA,CAAA;AAC9C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"throw-unrecognized-fields.mjs","sources":["../../../src/validate/visitors/throw-unrecognized-fields.ts"],"sourcesContent":["import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n isComponentSchema,\n isMediaAttribute,\n isComponentAttribute,\n DYNAMIC_ZONE_KEYS,\n ID_FIELDS,\n MORPH_TO_KEYS,\n RELATION_OPERATION_KEYS,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\nconst throwUnrecognizedFields: Visitor = (\n { key, attribute, path, schema, parent, allowedExtraRootKeys },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Visitor type requires second param\n _visitorUtils\n) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept id-like fields\n if (path.attribute === null) {\n if (ID_FIELDS.includes(key)) {\n return;\n }\n if (allowedExtraRootKeys?.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: path.attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_KEYS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow relation operation keys (connect, disconnect, set, options) for relations and media\n if (\n (isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute)) &&\n RELATION_OPERATION_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow id fields for relations, media, and components\n const canUseID =\n isRelationalAttribute(parent?.attribute) ||\n isMediaAttribute(parent?.attribute) ||\n isComponentAttribute(parent?.attribute);\n if (canUseID && ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: path.attribute });\n};\n\nexport default throwUnrecognizedFields;\n"],"names":["throwUnrecognizedFields","key","attribute","path","schema","parent","allowedExtraRootKeys","_visitorUtils","ID_FIELDS","includes","throwInvalidKey","isMorphToRelationalAttribute","MORPH_TO_KEYS","isComponentSchema","isDynamicZoneAttribute","DYNAMIC_ZONE_KEYS","isRelationalAttribute","isMediaAttribute","RELATION_OPERATION_KEYS","canUseID","isComponentAttribute"],"mappings":";;;AAeA,MAAMA,0BAAmC,CACvC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,oBAAoB,EAAE;AAE9DC,aAAAA,GAAAA;;AAGA,IAAA,IAAIL,SAAW,EAAA;AACb,QAAA;AACF;;IAGA,IAAIC,IAAAA,CAAKD,SAAS,KAAK,IAAM,EAAA;QAC3B,IAAIM,SAAAA,CAAUC,QAAQ,CAACR,GAAM,CAAA,EAAA;AAC3B,YAAA;AACF;QACA,IAAIK,oBAAAA,EAAsBG,SAASR,GAAM,CAAA,EAAA;AACvC,YAAA;AACF;AAEA,QAAA,OAAOS,eAAgB,CAAA;AAAET,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AACrD;;AAGA,IAAA,IAAIS,6BAA6BN,MAAQH,EAAAA,SAAAA,CAAAA,IAAcU,aAAcH,CAAAA,QAAQ,CAACR,GAAM,CAAA,EAAA;AAClF,QAAA;AACF;;IAGA,IACEY,iBAAAA,CAAkBT,WAClBU,sBAAuBT,CAAAA,MAAAA,EAAQH,cAC/Ba,iBAAkBN,CAAAA,QAAQ,CAACR,GAC3B,CAAA,EAAA;AACA,QAAA;AACF;;AAGA,IAAA,IACE,CAACe,qBAAsBX,CAAAA,MAAAA,EAAQH,SAAce,CAAAA,IAAAA,gBAAAA,CAAiBZ,MAAQH,EAAAA,SAAAA,CAAS,KAC/EgB,uBAAAA,CAAwBT,QAAQ,CAACR,GACjC,CAAA,EAAA;AACA,QAAA;AACF;;IAGA,MAAMkB,QAAAA,GACJH,sBAAsBX,MAAQH,EAAAA,SAAAA,CAAAA,IAC9Be,iBAAiBZ,MAAQH,EAAAA,SAAAA,CAAAA,IACzBkB,qBAAqBf,MAAQH,EAAAA,SAAAA,CAAAA;AAC/B,IAAA,IAAIiB,QAAYX,IAAAA,SAAAA,CAAUC,QAAQ,CAACR,GAAM,CAAA,EAAA;AACvC,QAAA;AACF;;IAGAS,eAAgB,CAAA;AAAET,QAAAA,GAAAA;AAAKE,QAAAA,IAAAA,EAAMA,KAAKD;AAAU,KAAA,CAAA;AAC9C;;;;"}
1
+ {"version":3,"file":"throw-unrecognized-fields.mjs","sources":["../../../src/validate/visitors/throw-unrecognized-fields.ts"],"sourcesContent":["import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n isComponentSchema,\n isMediaAttribute,\n isComponentAttribute,\n DYNAMIC_ZONE_KEYS,\n ID_FIELDS,\n MORPH_TO_KEYS,\n RELATION_OPERATION_KEYS,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\nconst throwUnrecognizedFields: Visitor = (\n { key, attribute, path, schema, parent, allowedExtraRootKeys },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Visitor type requires second param\n _visitorUtils\n) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept id-like fields\n if (path.attribute === null) {\n if (ID_FIELDS.includes(key)) {\n return;\n }\n if (allowedExtraRootKeys?.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: path.attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_KEYS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow relation operation keys (connect, disconnect, set, options) for relations and media\n if (\n (isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute)) &&\n RELATION_OPERATION_KEYS.includes(key)\n ) {\n return;\n }\n\n // allow id fields for relations, media, and components\n const canUseID =\n isRelationalAttribute(parent?.attribute) ||\n isMediaAttribute(parent?.attribute) ||\n isComponentAttribute(parent?.attribute);\n if (canUseID && ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: path.attribute });\n};\n\nexport default throwUnrecognizedFields;\n"],"names":["throwUnrecognizedFields","key","attribute","path","schema","parent","allowedExtraRootKeys","_visitorUtils","ID_FIELDS","includes","throwInvalidKey","isMorphToRelationalAttribute","MORPH_TO_KEYS","isComponentSchema","isDynamicZoneAttribute","DYNAMIC_ZONE_KEYS","isRelationalAttribute","isMediaAttribute","RELATION_OPERATION_KEYS","canUseID","isComponentAttribute"],"mappings":";;;AAeA,MAAMA,0BAAmC,CACvC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,MAAM,EAAEC,oBAAoB,EAAE;AAE9DC,aAAAA,GAAAA;;AAGA,IAAA,IAAIL,SAAAA,EAAW;AACb,QAAA;AACF,IAAA;;IAGA,IAAIC,IAAAA,CAAKD,SAAS,KAAK,IAAA,EAAM;QAC3B,IAAIM,SAAAA,CAAUC,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AAC3B,YAAA;AACF,QAAA;QACA,IAAIK,oBAAAA,EAAsBG,SAASR,GAAAA,CAAAA,EAAM;AACvC,YAAA;AACF,QAAA;AAEA,QAAA,OAAOS,eAAAA,CAAgB;AAAET,YAAAA,GAAAA;AAAKE,YAAAA,IAAAA,EAAMA,KAAKD;AAAU,SAAA,CAAA;AACrD,IAAA;;AAGA,IAAA,IAAIS,6BAA6BN,MAAAA,EAAQH,SAAAA,CAAAA,IAAcU,aAAAA,CAAcH,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AAClF,QAAA;AACF,IAAA;;IAGA,IACEY,iBAAAA,CAAkBT,WAClBU,sBAAAA,CAAuBT,MAAAA,EAAQH,cAC/Ba,iBAAAA,CAAkBN,QAAQ,CAACR,GAAAA,CAAAA,EAC3B;AACA,QAAA;AACF,IAAA;;AAGA,IAAA,IACE,CAACe,qBAAAA,CAAsBX,MAAAA,EAAQH,SAAAA,CAAAA,IAAce,gBAAAA,CAAiBZ,MAAAA,EAAQH,SAAAA,CAAS,KAC/EgB,uBAAAA,CAAwBT,QAAQ,CAACR,GAAAA,CAAAA,EACjC;AACA,QAAA;AACF,IAAA;;IAGA,MAAMkB,QAAAA,GACJH,sBAAsBX,MAAAA,EAAQH,SAAAA,CAAAA,IAC9Be,iBAAiBZ,MAAAA,EAAQH,SAAAA,CAAAA,IACzBkB,qBAAqBf,MAAAA,EAAQH,SAAAA,CAAAA;AAC/B,IAAA,IAAIiB,QAAAA,IAAYX,SAAAA,CAAUC,QAAQ,CAACR,GAAAA,CAAAA,EAAM;AACvC,QAAA;AACF,IAAA;;IAGAS,eAAAA,CAAgB;AAAET,QAAAA,GAAAA;AAAKE,QAAAA,IAAAA,EAAMA,KAAKD;AAAU,KAAA,CAAA;AAC9C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sources":["../../../src/validation/route-validators/base.ts"],"sourcesContent":["import * as z from 'zod/v4';\nimport { queryParameterSchemas, type QueryParam } from './query-params';\n\n/**\n * AbstractRouteValidator provides the foundation for validating routes.\n *\n * This abstract class provides common query parameter validators that can be reused\n * across different route validators in Strapi. It serves as a building block for\n * both generic validation (plugins, external packages) and schema-aware validation\n * (core content types).\n */\nexport abstract class AbstractRouteValidator {\n /**\n * Creates a fields query parameter validator\n * Validates field selection for API responses\n */\n get queryFields() {\n return queryParameterSchemas.fields;\n }\n\n /**\n * Creates a populate query parameter validator\n * Validates which relations to populate in the response\n */\n get queryPopulate() {\n return queryParameterSchemas.populate;\n }\n\n /**\n * Creates a sort query parameter validator\n * Validates sorting options for list endpoints\n */\n get querySort() {\n return queryParameterSchemas.sort;\n }\n\n /**\n * Creates a pagination query parameter validator\n * Supports both page-based and offset-based pagination\n */\n get pagination() {\n return queryParameterSchemas.pagination;\n }\n\n /**\n * Creates a filters query parameter validator\n * Validates filtering options for list endpoints\n */\n get filters() {\n return queryParameterSchemas.filters;\n }\n\n /**\n * Creates a locale query parameter validator\n * Used for internationalization\n */\n get locale() {\n return queryParameterSchemas.locale;\n }\n\n /**\n * Creates a status query parameter validator\n * Used for draft & publish functionality\n */\n get status() {\n return queryParameterSchemas.status;\n }\n\n /**\n * Creates a search query parameter validator\n * Used for text search functionality\n */\n get query() {\n return queryParameterSchemas._q;\n }\n\n /**\n * Provides access to all base query parameter validators\n */\n protected get baseQueryValidators() {\n return {\n fields: () => this.queryFields.optional(),\n populate: () => this.queryPopulate.optional(),\n sort: () => this.querySort.optional(),\n filters: () => this.filters.optional(),\n pagination: () => this.pagination.optional(),\n locale: () => this.locale.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n };\n }\n\n /**\n * Helper method to create a query parameters object with specified validators\n *\n * @param params - Array of query parameter names to include\n * @returns Object containing Zod schemas for the requested query parameters\n */\n queryParams(params: QueryParam[]): Record<string, z.ZodSchema> {\n const validators = this.baseQueryValidators;\n\n return params.reduce(\n (acc, param) => {\n if (param in validators) {\n acc[param] = validators[param]();\n }\n return acc;\n },\n {} as Record<string, z.ZodSchema>\n );\n }\n}\n"],"names":["AbstractRouteValidator","queryFields","queryParameterSchemas","fields","queryPopulate","populate","querySort","sort","pagination","filters","locale","status","query","_q","baseQueryValidators","optional","queryParams","params","validators","reduce","acc","param"],"mappings":";;;;AAGA;;;;;;;AAOC,IACM,MAAeA,sBAAAA,CAAAA;AACpB;;;AAGC,MACD,IAAIC,WAAc,GAAA;AAChB,QAAA,OAAOC,kCAAsBC,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,aAAgB,GAAA;AAClB,QAAA,OAAOF,kCAAsBG,QAAQ;AACvC;AAEA;;;AAGC,MACD,IAAIC,SAAY,GAAA;AACd,QAAA,OAAOJ,kCAAsBK,IAAI;AACnC;AAEA;;;AAGC,MACD,IAAIC,UAAa,GAAA;AACf,QAAA,OAAON,kCAAsBM,UAAU;AACzC;AAEA;;;AAGC,MACD,IAAIC,OAAU,GAAA;AACZ,QAAA,OAAOP,kCAAsBO,OAAO;AACtC;AAEA;;;AAGC,MACD,IAAIC,MAAS,GAAA;AACX,QAAA,OAAOR,kCAAsBQ,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,MAAS,GAAA;AACX,QAAA,OAAOT,kCAAsBS,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,KAAQ,GAAA;AACV,QAAA,OAAOV,kCAAsBW,EAAE;AACjC;AAEA;;AAEC,MACD,IAAcC,mBAAsB,GAAA;QAClC,OAAO;AACLX,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACF,WAAW,CAACc,QAAQ,EAAA;AACvCV,YAAAA,QAAAA,EAAU,IAAM,IAAI,CAACD,aAAa,CAACW,QAAQ,EAAA;AAC3CR,YAAAA,IAAAA,EAAM,IAAM,IAAI,CAACD,SAAS,CAACS,QAAQ,EAAA;AACnCN,YAAAA,OAAAA,EAAS,IAAM,IAAI,CAACA,OAAO,CAACM,QAAQ,EAAA;AACpCP,YAAAA,UAAAA,EAAY,IAAM,IAAI,CAACA,UAAU,CAACO,QAAQ,EAAA;AAC1CL,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACK,QAAQ,EAAA;AAClCJ,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACI,QAAQ,EAAA;AAClCF,YAAAA,EAAAA,EAAI,IAAM,IAAI,CAACD,KAAK,CAACG,QAAQ;AAC/B,SAAA;AACF;AAEA;;;;;MAMAC,WAAAA,CAAYC,MAAoB,EAA+B;QAC7D,MAAMC,UAAAA,GAAa,IAAI,CAACJ,mBAAmB;AAE3C,QAAA,OAAOG,MAAOE,CAAAA,MAAM,CAClB,CAACC,GAAKC,EAAAA,KAAAA,GAAAA;AACJ,YAAA,IAAIA,SAASH,UAAY,EAAA;AACvBE,gBAAAA,GAAG,CAACC,KAAAA,CAAM,GAAGH,UAAU,CAACG,KAAM,CAAA,EAAA;AAChC;YACA,OAAOD,GAAAA;AACT,SAAA,EACA,EAAC,CAAA;AAEL;AACF;;;;"}
1
+ {"version":3,"file":"base.js","sources":["../../../src/validation/route-validators/base.ts"],"sourcesContent":["import * as z from 'zod/v4';\nimport { queryParameterSchemas, type QueryParam } from './query-params';\n\n/**\n * AbstractRouteValidator provides the foundation for validating routes.\n *\n * This abstract class provides common query parameter validators that can be reused\n * across different route validators in Strapi. It serves as a building block for\n * both generic validation (plugins, external packages) and schema-aware validation\n * (core content types).\n */\nexport abstract class AbstractRouteValidator {\n /**\n * Creates a fields query parameter validator\n * Validates field selection for API responses\n */\n get queryFields() {\n return queryParameterSchemas.fields;\n }\n\n /**\n * Creates a populate query parameter validator\n * Validates which relations to populate in the response\n */\n get queryPopulate() {\n return queryParameterSchemas.populate;\n }\n\n /**\n * Creates a sort query parameter validator\n * Validates sorting options for list endpoints\n */\n get querySort() {\n return queryParameterSchemas.sort;\n }\n\n /**\n * Creates a pagination query parameter validator\n * Supports both page-based and offset-based pagination\n */\n get pagination() {\n return queryParameterSchemas.pagination;\n }\n\n /**\n * Creates a filters query parameter validator\n * Validates filtering options for list endpoints\n */\n get filters() {\n return queryParameterSchemas.filters;\n }\n\n /**\n * Creates a locale query parameter validator\n * Used for internationalization\n */\n get locale() {\n return queryParameterSchemas.locale;\n }\n\n /**\n * Creates a status query parameter validator\n * Used for draft & publish functionality\n */\n get status() {\n return queryParameterSchemas.status;\n }\n\n /**\n * Creates a search query parameter validator\n * Used for text search functionality\n */\n get query() {\n return queryParameterSchemas._q;\n }\n\n /**\n * Provides access to all base query parameter validators\n */\n protected get baseQueryValidators() {\n return {\n fields: () => this.queryFields.optional(),\n populate: () => this.queryPopulate.optional(),\n sort: () => this.querySort.optional(),\n filters: () => this.filters.optional(),\n pagination: () => this.pagination.optional(),\n locale: () => this.locale.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n };\n }\n\n /**\n * Helper method to create a query parameters object with specified validators\n *\n * @param params - Array of query parameter names to include\n * @returns Object containing Zod schemas for the requested query parameters\n */\n queryParams(params: QueryParam[]): Record<string, z.ZodSchema> {\n const validators = this.baseQueryValidators;\n\n return params.reduce(\n (acc, param) => {\n if (param in validators) {\n acc[param] = validators[param]();\n }\n return acc;\n },\n {} as Record<string, z.ZodSchema>\n );\n }\n}\n"],"names":["AbstractRouteValidator","queryFields","queryParameterSchemas","fields","queryPopulate","populate","querySort","sort","pagination","filters","locale","status","query","_q","baseQueryValidators","optional","queryParams","params","validators","reduce","acc","param"],"mappings":";;;;AAGA;;;;;;;AAOC,IACM,MAAeA,sBAAAA,CAAAA;AACpB;;;AAGC,MACD,IAAIC,WAAAA,GAAc;AAChB,QAAA,OAAOC,kCAAsBC,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,aAAAA,GAAgB;AAClB,QAAA,OAAOF,kCAAsBG,QAAQ;AACvC,IAAA;AAEA;;;AAGC,MACD,IAAIC,SAAAA,GAAY;AACd,QAAA,OAAOJ,kCAAsBK,IAAI;AACnC,IAAA;AAEA;;;AAGC,MACD,IAAIC,UAAAA,GAAa;AACf,QAAA,OAAON,kCAAsBM,UAAU;AACzC,IAAA;AAEA;;;AAGC,MACD,IAAIC,OAAAA,GAAU;AACZ,QAAA,OAAOP,kCAAsBO,OAAO;AACtC,IAAA;AAEA;;;AAGC,MACD,IAAIC,MAAAA,GAAS;AACX,QAAA,OAAOR,kCAAsBQ,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,MAAAA,GAAS;AACX,QAAA,OAAOT,kCAAsBS,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,KAAAA,GAAQ;AACV,QAAA,OAAOV,kCAAsBW,EAAE;AACjC,IAAA;AAEA;;AAEC,MACD,IAAcC,mBAAAA,GAAsB;QAClC,OAAO;AACLX,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACF,WAAW,CAACc,QAAQ,EAAA;AACvCV,YAAAA,QAAAA,EAAU,IAAM,IAAI,CAACD,aAAa,CAACW,QAAQ,EAAA;AAC3CR,YAAAA,IAAAA,EAAM,IAAM,IAAI,CAACD,SAAS,CAACS,QAAQ,EAAA;AACnCN,YAAAA,OAAAA,EAAS,IAAM,IAAI,CAACA,OAAO,CAACM,QAAQ,EAAA;AACpCP,YAAAA,UAAAA,EAAY,IAAM,IAAI,CAACA,UAAU,CAACO,QAAQ,EAAA;AAC1CL,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACK,QAAQ,EAAA;AAClCJ,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACI,QAAQ,EAAA;AAClCF,YAAAA,EAAAA,EAAI,IAAM,IAAI,CAACD,KAAK,CAACG,QAAQ;AAC/B,SAAA;AACF,IAAA;AAEA;;;;;MAMAC,WAAAA,CAAYC,MAAoB,EAA+B;QAC7D,MAAMC,UAAAA,GAAa,IAAI,CAACJ,mBAAmB;AAE3C,QAAA,OAAOG,MAAAA,CAAOE,MAAM,CAClB,CAACC,GAAAA,EAAKC,KAAAA,GAAAA;AACJ,YAAA,IAAIA,SAASH,UAAAA,EAAY;AACvBE,gBAAAA,GAAG,CAACC,KAAAA,CAAM,GAAGH,UAAU,CAACG,KAAAA,CAAM,EAAA;AAChC,YAAA;YACA,OAAOD,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAEL,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.mjs","sources":["../../../src/validation/route-validators/base.ts"],"sourcesContent":["import * as z from 'zod/v4';\nimport { queryParameterSchemas, type QueryParam } from './query-params';\n\n/**\n * AbstractRouteValidator provides the foundation for validating routes.\n *\n * This abstract class provides common query parameter validators that can be reused\n * across different route validators in Strapi. It serves as a building block for\n * both generic validation (plugins, external packages) and schema-aware validation\n * (core content types).\n */\nexport abstract class AbstractRouteValidator {\n /**\n * Creates a fields query parameter validator\n * Validates field selection for API responses\n */\n get queryFields() {\n return queryParameterSchemas.fields;\n }\n\n /**\n * Creates a populate query parameter validator\n * Validates which relations to populate in the response\n */\n get queryPopulate() {\n return queryParameterSchemas.populate;\n }\n\n /**\n * Creates a sort query parameter validator\n * Validates sorting options for list endpoints\n */\n get querySort() {\n return queryParameterSchemas.sort;\n }\n\n /**\n * Creates a pagination query parameter validator\n * Supports both page-based and offset-based pagination\n */\n get pagination() {\n return queryParameterSchemas.pagination;\n }\n\n /**\n * Creates a filters query parameter validator\n * Validates filtering options for list endpoints\n */\n get filters() {\n return queryParameterSchemas.filters;\n }\n\n /**\n * Creates a locale query parameter validator\n * Used for internationalization\n */\n get locale() {\n return queryParameterSchemas.locale;\n }\n\n /**\n * Creates a status query parameter validator\n * Used for draft & publish functionality\n */\n get status() {\n return queryParameterSchemas.status;\n }\n\n /**\n * Creates a search query parameter validator\n * Used for text search functionality\n */\n get query() {\n return queryParameterSchemas._q;\n }\n\n /**\n * Provides access to all base query parameter validators\n */\n protected get baseQueryValidators() {\n return {\n fields: () => this.queryFields.optional(),\n populate: () => this.queryPopulate.optional(),\n sort: () => this.querySort.optional(),\n filters: () => this.filters.optional(),\n pagination: () => this.pagination.optional(),\n locale: () => this.locale.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n };\n }\n\n /**\n * Helper method to create a query parameters object with specified validators\n *\n * @param params - Array of query parameter names to include\n * @returns Object containing Zod schemas for the requested query parameters\n */\n queryParams(params: QueryParam[]): Record<string, z.ZodSchema> {\n const validators = this.baseQueryValidators;\n\n return params.reduce(\n (acc, param) => {\n if (param in validators) {\n acc[param] = validators[param]();\n }\n return acc;\n },\n {} as Record<string, z.ZodSchema>\n );\n }\n}\n"],"names":["AbstractRouteValidator","queryFields","queryParameterSchemas","fields","queryPopulate","populate","querySort","sort","pagination","filters","locale","status","query","_q","baseQueryValidators","optional","queryParams","params","validators","reduce","acc","param"],"mappings":";;AAGA;;;;;;;AAOC,IACM,MAAeA,sBAAAA,CAAAA;AACpB;;;AAGC,MACD,IAAIC,WAAc,GAAA;AAChB,QAAA,OAAOC,sBAAsBC,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,aAAgB,GAAA;AAClB,QAAA,OAAOF,sBAAsBG,QAAQ;AACvC;AAEA;;;AAGC,MACD,IAAIC,SAAY,GAAA;AACd,QAAA,OAAOJ,sBAAsBK,IAAI;AACnC;AAEA;;;AAGC,MACD,IAAIC,UAAa,GAAA;AACf,QAAA,OAAON,sBAAsBM,UAAU;AACzC;AAEA;;;AAGC,MACD,IAAIC,OAAU,GAAA;AACZ,QAAA,OAAOP,sBAAsBO,OAAO;AACtC;AAEA;;;AAGC,MACD,IAAIC,MAAS,GAAA;AACX,QAAA,OAAOR,sBAAsBQ,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,MAAS,GAAA;AACX,QAAA,OAAOT,sBAAsBS,MAAM;AACrC;AAEA;;;AAGC,MACD,IAAIC,KAAQ,GAAA;AACV,QAAA,OAAOV,sBAAsBW,EAAE;AACjC;AAEA;;AAEC,MACD,IAAcC,mBAAsB,GAAA;QAClC,OAAO;AACLX,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACF,WAAW,CAACc,QAAQ,EAAA;AACvCV,YAAAA,QAAAA,EAAU,IAAM,IAAI,CAACD,aAAa,CAACW,QAAQ,EAAA;AAC3CR,YAAAA,IAAAA,EAAM,IAAM,IAAI,CAACD,SAAS,CAACS,QAAQ,EAAA;AACnCN,YAAAA,OAAAA,EAAS,IAAM,IAAI,CAACA,OAAO,CAACM,QAAQ,EAAA;AACpCP,YAAAA,UAAAA,EAAY,IAAM,IAAI,CAACA,UAAU,CAACO,QAAQ,EAAA;AAC1CL,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACK,QAAQ,EAAA;AAClCJ,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACI,QAAQ,EAAA;AAClCF,YAAAA,EAAAA,EAAI,IAAM,IAAI,CAACD,KAAK,CAACG,QAAQ;AAC/B,SAAA;AACF;AAEA;;;;;MAMAC,WAAAA,CAAYC,MAAoB,EAA+B;QAC7D,MAAMC,UAAAA,GAAa,IAAI,CAACJ,mBAAmB;AAE3C,QAAA,OAAOG,MAAOE,CAAAA,MAAM,CAClB,CAACC,GAAKC,EAAAA,KAAAA,GAAAA;AACJ,YAAA,IAAIA,SAASH,UAAY,EAAA;AACvBE,gBAAAA,GAAG,CAACC,KAAAA,CAAM,GAAGH,UAAU,CAACG,KAAM,CAAA,EAAA;AAChC;YACA,OAAOD,GAAAA;AACT,SAAA,EACA,EAAC,CAAA;AAEL;AACF;;;;"}
1
+ {"version":3,"file":"base.mjs","sources":["../../../src/validation/route-validators/base.ts"],"sourcesContent":["import * as z from 'zod/v4';\nimport { queryParameterSchemas, type QueryParam } from './query-params';\n\n/**\n * AbstractRouteValidator provides the foundation for validating routes.\n *\n * This abstract class provides common query parameter validators that can be reused\n * across different route validators in Strapi. It serves as a building block for\n * both generic validation (plugins, external packages) and schema-aware validation\n * (core content types).\n */\nexport abstract class AbstractRouteValidator {\n /**\n * Creates a fields query parameter validator\n * Validates field selection for API responses\n */\n get queryFields() {\n return queryParameterSchemas.fields;\n }\n\n /**\n * Creates a populate query parameter validator\n * Validates which relations to populate in the response\n */\n get queryPopulate() {\n return queryParameterSchemas.populate;\n }\n\n /**\n * Creates a sort query parameter validator\n * Validates sorting options for list endpoints\n */\n get querySort() {\n return queryParameterSchemas.sort;\n }\n\n /**\n * Creates a pagination query parameter validator\n * Supports both page-based and offset-based pagination\n */\n get pagination() {\n return queryParameterSchemas.pagination;\n }\n\n /**\n * Creates a filters query parameter validator\n * Validates filtering options for list endpoints\n */\n get filters() {\n return queryParameterSchemas.filters;\n }\n\n /**\n * Creates a locale query parameter validator\n * Used for internationalization\n */\n get locale() {\n return queryParameterSchemas.locale;\n }\n\n /**\n * Creates a status query parameter validator\n * Used for draft & publish functionality\n */\n get status() {\n return queryParameterSchemas.status;\n }\n\n /**\n * Creates a search query parameter validator\n * Used for text search functionality\n */\n get query() {\n return queryParameterSchemas._q;\n }\n\n /**\n * Provides access to all base query parameter validators\n */\n protected get baseQueryValidators() {\n return {\n fields: () => this.queryFields.optional(),\n populate: () => this.queryPopulate.optional(),\n sort: () => this.querySort.optional(),\n filters: () => this.filters.optional(),\n pagination: () => this.pagination.optional(),\n locale: () => this.locale.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n };\n }\n\n /**\n * Helper method to create a query parameters object with specified validators\n *\n * @param params - Array of query parameter names to include\n * @returns Object containing Zod schemas for the requested query parameters\n */\n queryParams(params: QueryParam[]): Record<string, z.ZodSchema> {\n const validators = this.baseQueryValidators;\n\n return params.reduce(\n (acc, param) => {\n if (param in validators) {\n acc[param] = validators[param]();\n }\n return acc;\n },\n {} as Record<string, z.ZodSchema>\n );\n }\n}\n"],"names":["AbstractRouteValidator","queryFields","queryParameterSchemas","fields","queryPopulate","populate","querySort","sort","pagination","filters","locale","status","query","_q","baseQueryValidators","optional","queryParams","params","validators","reduce","acc","param"],"mappings":";;AAGA;;;;;;;AAOC,IACM,MAAeA,sBAAAA,CAAAA;AACpB;;;AAGC,MACD,IAAIC,WAAAA,GAAc;AAChB,QAAA,OAAOC,sBAAsBC,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,aAAAA,GAAgB;AAClB,QAAA,OAAOF,sBAAsBG,QAAQ;AACvC,IAAA;AAEA;;;AAGC,MACD,IAAIC,SAAAA,GAAY;AACd,QAAA,OAAOJ,sBAAsBK,IAAI;AACnC,IAAA;AAEA;;;AAGC,MACD,IAAIC,UAAAA,GAAa;AACf,QAAA,OAAON,sBAAsBM,UAAU;AACzC,IAAA;AAEA;;;AAGC,MACD,IAAIC,OAAAA,GAAU;AACZ,QAAA,OAAOP,sBAAsBO,OAAO;AACtC,IAAA;AAEA;;;AAGC,MACD,IAAIC,MAAAA,GAAS;AACX,QAAA,OAAOR,sBAAsBQ,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,MAAAA,GAAS;AACX,QAAA,OAAOT,sBAAsBS,MAAM;AACrC,IAAA;AAEA;;;AAGC,MACD,IAAIC,KAAAA,GAAQ;AACV,QAAA,OAAOV,sBAAsBW,EAAE;AACjC,IAAA;AAEA;;AAEC,MACD,IAAcC,mBAAAA,GAAsB;QAClC,OAAO;AACLX,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACF,WAAW,CAACc,QAAQ,EAAA;AACvCV,YAAAA,QAAAA,EAAU,IAAM,IAAI,CAACD,aAAa,CAACW,QAAQ,EAAA;AAC3CR,YAAAA,IAAAA,EAAM,IAAM,IAAI,CAACD,SAAS,CAACS,QAAQ,EAAA;AACnCN,YAAAA,OAAAA,EAAS,IAAM,IAAI,CAACA,OAAO,CAACM,QAAQ,EAAA;AACpCP,YAAAA,UAAAA,EAAY,IAAM,IAAI,CAACA,UAAU,CAACO,QAAQ,EAAA;AAC1CL,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACK,QAAQ,EAAA;AAClCJ,YAAAA,MAAAA,EAAQ,IAAM,IAAI,CAACA,MAAM,CAACI,QAAQ,EAAA;AAClCF,YAAAA,EAAAA,EAAI,IAAM,IAAI,CAACD,KAAK,CAACG,QAAQ;AAC/B,SAAA;AACF,IAAA;AAEA;;;;;MAMAC,WAAAA,CAAYC,MAAoB,EAA+B;QAC7D,MAAMC,UAAAA,GAAa,IAAI,CAACJ,mBAAmB;AAE3C,QAAA,OAAOG,MAAAA,CAAOE,MAAM,CAClB,CAACC,GAAAA,EAAKC,KAAAA,GAAAA;AACJ,YAAA,IAAIA,SAASH,UAAAA,EAAY;AACvBE,gBAAAA,GAAG,CAACC,KAAAA,CAAM,GAAGH,UAAU,CAACG,KAAAA,CAAM,EAAA;AAChC,YAAA;YACA,OAAOD,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAEL,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-params.js","sources":["../../../src/validation/route-validators/query-params.ts"],"sourcesContent":["import * as z from 'zod/v4';\n\n/**\n * Standard query parameter validators that can be reused across different route validators\n *\n * These schemas provide the basic structure validation for common Strapi API query parameters.\n * They can be used as building blocks for both generic validation and schema-aware validation.\n */\n\n/**\n * Fields parameter validation\n * Supports: 'title', ['title', 'name'], or '*'\n */\nexport const queryFieldsSchema = z\n .union([z.string(), z.array(z.string())])\n .describe('Select specific fields to return in the response');\n\n/**\n * Populate parameter validation\n * Supports: '*', 'relation', ['relation1', 'relation2'], or complex objects\n */\nexport const queryPopulateSchema = z\n .union([z.literal('*'), z.string(), z.array(z.string()), z.record(z.string(), z.any())])\n .describe('Specify which relations to populate in the response');\n\n/**\n * Sort parameter validation\n * Supports: 'name', ['name', 'title'], { name: 'asc' }, or [{ name: 'desc' }]\n */\nexport const querySortSchema = z\n .union([\n z.string(),\n z.array(z.string()),\n z.record(z.string(), z.enum(['asc', 'desc'])),\n z.array(z.record(z.string(), z.enum(['asc', 'desc']))),\n ])\n .describe('Sort the results by specified fields');\n\n/**\n * Pagination parameter validation\n * Supports both page-based and offset-based pagination\n */\nexport const paginationSchema = z\n .intersection(\n z.object({\n withCount: z.boolean().optional().describe('Include total count in response'),\n }),\n z.union([\n z\n .object({\n page: z.number().int().positive().describe('Page number (1-based)'),\n pageSize: z.number().int().positive().describe('Number of entries per page'),\n })\n .describe('Page-based pagination'),\n z\n .object({\n start: z.number().int().min(0).describe('Number of entries to skip'),\n limit: z.number().int().positive().describe('Maximum number of entries to return'),\n })\n .describe('Offset-based pagination'),\n ])\n )\n .describe('Pagination parameters');\n\n/**\n * Filters parameter validation\n * Supports any object structure for filtering\n */\nexport const filtersSchema = z.record(z.string(), z.any()).describe('Apply filters to the query');\n\n/**\n * Locale parameter validation\n * Used for internationalization\n */\nexport const localeSchema = z.string().describe('Specify the locale for localized content');\n\n/**\n * Status parameter validation\n * Used for draft & publish functionality\n */\nexport const statusSchema = z.enum(['draft', 'published']).describe('Filter by publication status');\n\n/**\n * Search query parameter validation\n * Used for text search functionality\n */\nexport const searchQuerySchema = z.string().describe('Search query string');\n\n/**\n * Complete collection of all standard query parameter schemas\n * This object provides easy access to all available query parameter validators\n */\nexport const queryParameterSchemas = {\n fields: queryFieldsSchema,\n populate: queryPopulateSchema,\n sort: querySortSchema,\n pagination: paginationSchema,\n filters: filtersSchema,\n locale: localeSchema,\n status: statusSchema,\n _q: searchQuerySchema,\n} as const;\n\n/**\n * Query parameter names supported by Strapi's API\n */\nexport type QueryParam = keyof typeof queryParameterSchemas;\n"],"names":["queryFieldsSchema","z","union","string","array","describe","queryPopulateSchema","literal","record","any","querySortSchema","enum","paginationSchema","intersection","object","withCount","boolean","optional","page","number","int","positive","pageSize","start","min","limit","filtersSchema","localeSchema","statusSchema","searchQuerySchema","queryParameterSchemas","fields","populate","sort","pagination","filters","locale","status","_q"],"mappings":"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"}
1
+ {"version":3,"file":"query-params.js","sources":["../../../src/validation/route-validators/query-params.ts"],"sourcesContent":["import * as z from 'zod/v4';\n\n/**\n * Standard query parameter validators that can be reused across different route validators\n *\n * These schemas provide the basic structure validation for common Strapi API query parameters.\n * They can be used as building blocks for both generic validation and schema-aware validation.\n */\n\n/**\n * Fields parameter validation\n * Supports: 'title', ['title', 'name'], or '*'\n */\nexport const queryFieldsSchema = z\n .union([z.string(), z.array(z.string())])\n .describe('Select specific fields to return in the response');\n\n/**\n * Populate parameter validation\n * Supports: '*', 'relation', ['relation1', 'relation2'], or complex objects\n */\nexport const queryPopulateSchema = z\n .union([z.literal('*'), z.string(), z.array(z.string()), z.record(z.string(), z.any())])\n .describe('Specify which relations to populate in the response');\n\n/**\n * Sort parameter validation\n * Supports: 'name', ['name', 'title'], { name: 'asc' }, or [{ name: 'desc' }]\n */\nexport const querySortSchema = z\n .union([\n z.string(),\n z.array(z.string()),\n z.record(z.string(), z.enum(['asc', 'desc'])),\n z.array(z.record(z.string(), z.enum(['asc', 'desc']))),\n ])\n .describe('Sort the results by specified fields');\n\n/**\n * Pagination parameter validation\n * Supports both page-based and offset-based pagination\n */\nexport const paginationSchema = z\n .intersection(\n z.object({\n withCount: z.boolean().optional().describe('Include total count in response'),\n }),\n z.union([\n z\n .object({\n page: z.number().int().positive().describe('Page number (1-based)'),\n pageSize: z.number().int().positive().describe('Number of entries per page'),\n })\n .describe('Page-based pagination'),\n z\n .object({\n start: z.number().int().min(0).describe('Number of entries to skip'),\n limit: z.number().int().positive().describe('Maximum number of entries to return'),\n })\n .describe('Offset-based pagination'),\n ])\n )\n .describe('Pagination parameters');\n\n/**\n * Filters parameter validation\n * Supports any object structure for filtering\n */\nexport const filtersSchema = z.record(z.string(), z.any()).describe('Apply filters to the query');\n\n/**\n * Locale parameter validation\n * Used for internationalization\n */\nexport const localeSchema = z.string().describe('Specify the locale for localized content');\n\n/**\n * Status parameter validation\n * Used for draft & publish functionality\n */\nexport const statusSchema = z.enum(['draft', 'published']).describe('Filter by publication status');\n\n/**\n * Search query parameter validation\n * Used for text search functionality\n */\nexport const searchQuerySchema = z.string().describe('Search query string');\n\n/**\n * Complete collection of all standard query parameter schemas\n * This object provides easy access to all available query parameter validators\n */\nexport const queryParameterSchemas = {\n fields: queryFieldsSchema,\n populate: queryPopulateSchema,\n sort: querySortSchema,\n pagination: paginationSchema,\n filters: filtersSchema,\n locale: localeSchema,\n status: statusSchema,\n _q: searchQuerySchema,\n} as const;\n\n/**\n * Query parameter names supported by Strapi's API\n */\nexport type QueryParam = keyof typeof queryParameterSchemas;\n"],"names":["queryFieldsSchema","z","union","string","array","describe","queryPopulateSchema","literal","record","any","querySortSchema","enum","paginationSchema","intersection","object","withCount","boolean","optional","page","number","int","positive","pageSize","start","min","limit","filtersSchema","localeSchema","statusSchema","searchQuerySchema","queryParameterSchemas","fields","populate","sort","pagination","filters","locale","status","_q"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-params.mjs","sources":["../../../src/validation/route-validators/query-params.ts"],"sourcesContent":["import * as z from 'zod/v4';\n\n/**\n * Standard query parameter validators that can be reused across different route validators\n *\n * These schemas provide the basic structure validation for common Strapi API query parameters.\n * They can be used as building blocks for both generic validation and schema-aware validation.\n */\n\n/**\n * Fields parameter validation\n * Supports: 'title', ['title', 'name'], or '*'\n */\nexport const queryFieldsSchema = z\n .union([z.string(), z.array(z.string())])\n .describe('Select specific fields to return in the response');\n\n/**\n * Populate parameter validation\n * Supports: '*', 'relation', ['relation1', 'relation2'], or complex objects\n */\nexport const queryPopulateSchema = z\n .union([z.literal('*'), z.string(), z.array(z.string()), z.record(z.string(), z.any())])\n .describe('Specify which relations to populate in the response');\n\n/**\n * Sort parameter validation\n * Supports: 'name', ['name', 'title'], { name: 'asc' }, or [{ name: 'desc' }]\n */\nexport const querySortSchema = z\n .union([\n z.string(),\n z.array(z.string()),\n z.record(z.string(), z.enum(['asc', 'desc'])),\n z.array(z.record(z.string(), z.enum(['asc', 'desc']))),\n ])\n .describe('Sort the results by specified fields');\n\n/**\n * Pagination parameter validation\n * Supports both page-based and offset-based pagination\n */\nexport const paginationSchema = z\n .intersection(\n z.object({\n withCount: z.boolean().optional().describe('Include total count in response'),\n }),\n z.union([\n z\n .object({\n page: z.number().int().positive().describe('Page number (1-based)'),\n pageSize: z.number().int().positive().describe('Number of entries per page'),\n })\n .describe('Page-based pagination'),\n z\n .object({\n start: z.number().int().min(0).describe('Number of entries to skip'),\n limit: z.number().int().positive().describe('Maximum number of entries to return'),\n })\n .describe('Offset-based pagination'),\n ])\n )\n .describe('Pagination parameters');\n\n/**\n * Filters parameter validation\n * Supports any object structure for filtering\n */\nexport const filtersSchema = z.record(z.string(), z.any()).describe('Apply filters to the query');\n\n/**\n * Locale parameter validation\n * Used for internationalization\n */\nexport const localeSchema = z.string().describe('Specify the locale for localized content');\n\n/**\n * Status parameter validation\n * Used for draft & publish functionality\n */\nexport const statusSchema = z.enum(['draft', 'published']).describe('Filter by publication status');\n\n/**\n * Search query parameter validation\n * Used for text search functionality\n */\nexport const searchQuerySchema = z.string().describe('Search query string');\n\n/**\n * Complete collection of all standard query parameter schemas\n * This object provides easy access to all available query parameter validators\n */\nexport const queryParameterSchemas = {\n fields: queryFieldsSchema,\n populate: queryPopulateSchema,\n sort: querySortSchema,\n pagination: paginationSchema,\n filters: filtersSchema,\n locale: localeSchema,\n status: statusSchema,\n _q: searchQuerySchema,\n} as const;\n\n/**\n * Query parameter names supported by Strapi's API\n */\nexport type QueryParam = keyof typeof queryParameterSchemas;\n"],"names":["queryFieldsSchema","z","union","string","array","describe","queryPopulateSchema","literal","record","any","querySortSchema","enum","paginationSchema","intersection","object","withCount","boolean","optional","page","number","int","positive","pageSize","start","min","limit","filtersSchema","localeSchema","statusSchema","searchQuerySchema","queryParameterSchemas","fields","populate","sort","pagination","filters","locale","status","_q"],"mappings":"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"}
1
+ {"version":3,"file":"query-params.mjs","sources":["../../../src/validation/route-validators/query-params.ts"],"sourcesContent":["import * as z from 'zod/v4';\n\n/**\n * Standard query parameter validators that can be reused across different route validators\n *\n * These schemas provide the basic structure validation for common Strapi API query parameters.\n * They can be used as building blocks for both generic validation and schema-aware validation.\n */\n\n/**\n * Fields parameter validation\n * Supports: 'title', ['title', 'name'], or '*'\n */\nexport const queryFieldsSchema = z\n .union([z.string(), z.array(z.string())])\n .describe('Select specific fields to return in the response');\n\n/**\n * Populate parameter validation\n * Supports: '*', 'relation', ['relation1', 'relation2'], or complex objects\n */\nexport const queryPopulateSchema = z\n .union([z.literal('*'), z.string(), z.array(z.string()), z.record(z.string(), z.any())])\n .describe('Specify which relations to populate in the response');\n\n/**\n * Sort parameter validation\n * Supports: 'name', ['name', 'title'], { name: 'asc' }, or [{ name: 'desc' }]\n */\nexport const querySortSchema = z\n .union([\n z.string(),\n z.array(z.string()),\n z.record(z.string(), z.enum(['asc', 'desc'])),\n z.array(z.record(z.string(), z.enum(['asc', 'desc']))),\n ])\n .describe('Sort the results by specified fields');\n\n/**\n * Pagination parameter validation\n * Supports both page-based and offset-based pagination\n */\nexport const paginationSchema = z\n .intersection(\n z.object({\n withCount: z.boolean().optional().describe('Include total count in response'),\n }),\n z.union([\n z\n .object({\n page: z.number().int().positive().describe('Page number (1-based)'),\n pageSize: z.number().int().positive().describe('Number of entries per page'),\n })\n .describe('Page-based pagination'),\n z\n .object({\n start: z.number().int().min(0).describe('Number of entries to skip'),\n limit: z.number().int().positive().describe('Maximum number of entries to return'),\n })\n .describe('Offset-based pagination'),\n ])\n )\n .describe('Pagination parameters');\n\n/**\n * Filters parameter validation\n * Supports any object structure for filtering\n */\nexport const filtersSchema = z.record(z.string(), z.any()).describe('Apply filters to the query');\n\n/**\n * Locale parameter validation\n * Used for internationalization\n */\nexport const localeSchema = z.string().describe('Specify the locale for localized content');\n\n/**\n * Status parameter validation\n * Used for draft & publish functionality\n */\nexport const statusSchema = z.enum(['draft', 'published']).describe('Filter by publication status');\n\n/**\n * Search query parameter validation\n * Used for text search functionality\n */\nexport const searchQuerySchema = z.string().describe('Search query string');\n\n/**\n * Complete collection of all standard query parameter schemas\n * This object provides easy access to all available query parameter validators\n */\nexport const queryParameterSchemas = {\n fields: queryFieldsSchema,\n populate: queryPopulateSchema,\n sort: querySortSchema,\n pagination: paginationSchema,\n filters: filtersSchema,\n locale: localeSchema,\n status: statusSchema,\n _q: searchQuerySchema,\n} as const;\n\n/**\n * Query parameter names supported by Strapi's API\n */\nexport type QueryParam = keyof typeof queryParameterSchemas;\n"],"names":["queryFieldsSchema","z","union","string","array","describe","queryPopulateSchema","literal","record","any","querySortSchema","enum","paginationSchema","intersection","object","withCount","boolean","optional","page","number","int","positive","pageSize","start","min","limit","filtersSchema","localeSchema","statusSchema","searchQuerySchema","queryParameterSchemas","fields","populate","sort","pagination","filters","locale","status","_q"],"mappings":"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"}