@strapi/utils 5.56.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/async.js +2 -2
  2. package/dist/async.js.map +1 -1
  3. package/dist/async.mjs +1 -1
  4. package/dist/async.mjs.map +1 -1
  5. package/dist/content-types.d.ts.map +1 -1
  6. package/dist/content-types.js +8 -9
  7. package/dist/content-types.js.map +1 -1
  8. package/dist/content-types.mjs +6 -7
  9. package/dist/content-types.mjs.map +1 -1
  10. package/dist/convert-query-params.d.ts.map +1 -1
  11. package/dist/convert-query-params.js +33 -34
  12. package/dist/convert-query-params.js.map +1 -1
  13. package/dist/convert-query-params.mjs +23 -24
  14. package/dist/convert-query-params.mjs.map +1 -1
  15. package/dist/format-yup-error.js +3 -3
  16. package/dist/format-yup-error.js.map +1 -1
  17. package/dist/format-yup-error.mjs +1 -1
  18. package/dist/format-yup-error.mjs.map +1 -1
  19. package/dist/hooks.js +3 -3
  20. package/dist/hooks.js.map +1 -1
  21. package/dist/hooks.mjs +2 -2
  22. package/dist/hooks.mjs.map +1 -1
  23. package/dist/pagination.d.ts.map +1 -1
  24. package/dist/pagination.js +15 -18
  25. package/dist/pagination.js.map +1 -1
  26. package/dist/pagination.mjs +15 -18
  27. package/dist/pagination.mjs.map +1 -1
  28. package/dist/policy.d.ts +1 -1
  29. package/dist/policy.d.ts.map +1 -1
  30. package/dist/policy.js +1 -3
  31. package/dist/policy.js.map +1 -1
  32. package/dist/policy.mjs +1 -3
  33. package/dist/policy.mjs.map +1 -1
  34. package/dist/primitives/objects.d.ts +7 -1
  35. package/dist/primitives/objects.d.ts.map +1 -1
  36. package/dist/primitives/objects.js +5 -0
  37. package/dist/primitives/objects.js.map +1 -1
  38. package/dist/primitives/objects.mjs +5 -1
  39. package/dist/primitives/objects.mjs.map +1 -1
  40. package/dist/primitives/strings.d.ts.map +1 -1
  41. package/dist/primitives/strings.js +3 -7
  42. package/dist/primitives/strings.js.map +1 -1
  43. package/dist/primitives/strings.mjs +3 -7
  44. package/dist/primitives/strings.mjs.map +1 -1
  45. package/dist/provider-factory.js +4 -4
  46. package/dist/provider-factory.js.map +1 -1
  47. package/dist/provider-factory.mjs +1 -1
  48. package/dist/provider-factory.mjs.map +1 -1
  49. package/dist/relations.js +2 -2
  50. package/dist/relations.js.map +1 -1
  51. package/dist/relations.mjs +1 -1
  52. package/dist/relations.mjs.map +1 -1
  53. package/dist/sanitize/index.d.ts.map +1 -1
  54. package/dist/sanitize/index.js +8 -8
  55. package/dist/sanitize/index.js.map +1 -1
  56. package/dist/sanitize/index.mjs +7 -7
  57. package/dist/sanitize/index.mjs.map +1 -1
  58. package/dist/sanitize/sanitizers.js +10 -10
  59. package/dist/sanitize/sanitizers.js.map +1 -1
  60. package/dist/sanitize/sanitizers.mjs +4 -4
  61. package/dist/sanitize/sanitizers.mjs.map +1 -1
  62. package/dist/sanitize/visitors/remove-disallowed-fields.js +4 -4
  63. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
  64. package/dist/sanitize/visitors/remove-disallowed-fields.mjs +3 -3
  65. package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
  66. package/dist/sanitize/visitors/remove-restricted-fields.js +2 -2
  67. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
  68. package/dist/sanitize/visitors/remove-restricted-fields.mjs +2 -2
  69. package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
  70. package/dist/sanitize/visitors/remove-restricted-relations.js +9 -9
  71. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
  72. package/dist/sanitize/visitors/remove-restricted-relations.mjs +4 -4
  73. package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
  74. package/dist/security.d.ts.map +1 -1
  75. package/dist/security.js +3 -3
  76. package/dist/security.js.map +1 -1
  77. package/dist/security.mjs +3 -3
  78. package/dist/security.mjs.map +1 -1
  79. package/dist/set-creator-fields.d.ts +4 -1
  80. package/dist/set-creator-fields.d.ts.map +1 -1
  81. package/dist/set-creator-fields.js +7 -4
  82. package/dist/set-creator-fields.js.map +1 -1
  83. package/dist/set-creator-fields.mjs +7 -4
  84. package/dist/set-creator-fields.mjs.map +1 -1
  85. package/dist/traverse/factory.js +8 -8
  86. package/dist/traverse/factory.js.map +1 -1
  87. package/dist/traverse/factory.mjs +8 -8
  88. package/dist/traverse/factory.mjs.map +1 -1
  89. package/dist/traverse/query-fields.js +7 -7
  90. package/dist/traverse/query-fields.js.map +1 -1
  91. package/dist/traverse/query-fields.mjs +3 -3
  92. package/dist/traverse/query-fields.mjs.map +1 -1
  93. package/dist/traverse/query-filters.js +12 -12
  94. package/dist/traverse/query-filters.js.map +1 -1
  95. package/dist/traverse/query-filters.mjs +7 -7
  96. package/dist/traverse/query-filters.mjs.map +1 -1
  97. package/dist/traverse/query-populate.d.ts.map +1 -1
  98. package/dist/traverse/query-populate.js +21 -21
  99. package/dist/traverse/query-populate.js.map +1 -1
  100. package/dist/traverse/query-populate.mjs +12 -12
  101. package/dist/traverse/query-populate.mjs.map +1 -1
  102. package/dist/traverse/query-sort.d.ts.map +1 -1
  103. package/dist/traverse/query-sort.js +16 -16
  104. package/dist/traverse/query-sort.js.map +1 -1
  105. package/dist/traverse/query-sort.mjs +6 -6
  106. package/dist/traverse/query-sort.mjs.map +1 -1
  107. package/dist/traverse-entity.d.ts.map +1 -1
  108. package/dist/traverse-entity.js +18 -18
  109. package/dist/traverse-entity.js.map +1 -1
  110. package/dist/traverse-entity.mjs +16 -16
  111. package/dist/traverse-entity.mjs.map +1 -1
  112. package/dist/validate/index.d.ts.map +1 -1
  113. package/dist/validate/index.js +5 -5
  114. package/dist/validate/index.js.map +1 -1
  115. package/dist/validate/index.mjs +3 -3
  116. package/dist/validate/index.mjs.map +1 -1
  117. package/dist/validate/utils.d.ts +2 -1
  118. package/dist/validate/utils.d.ts.map +1 -1
  119. package/dist/validate/utils.js +4 -4
  120. package/dist/validate/utils.js.map +1 -1
  121. package/dist/validate/utils.mjs +4 -4
  122. package/dist/validate/utils.mjs.map +1 -1
  123. package/dist/validate/validators.d.ts.map +1 -1
  124. package/dist/validate/validators.js +17 -9
  125. package/dist/validate/validators.js.map +1 -1
  126. package/dist/validate/validators.mjs +14 -6
  127. package/dist/validate/validators.mjs.map +1 -1
  128. package/dist/validate/visitors/throw-disallowed-fields.js +4 -4
  129. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
  130. package/dist/validate/visitors/throw-disallowed-fields.mjs +3 -3
  131. package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
  132. package/dist/validate/visitors/throw-restricted-fields.js +2 -2
  133. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
  134. package/dist/validate/visitors/throw-restricted-fields.mjs +2 -2
  135. package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
  136. package/dist/validate/visitors/throw-restricted-relations.js +6 -6
  137. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
  138. package/dist/validate/visitors/throw-restricted-relations.mjs +2 -2
  139. package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
  140. package/dist/validators.js +3 -3
  141. package/dist/validators.js.map +1 -1
  142. package/dist/validators.mjs +3 -3
  143. package/dist/validators.mjs.map +1 -1
  144. package/dist/yup.d.ts.map +1 -1
  145. package/dist/yup.js +2 -3
  146. package/dist/yup.js.map +1 -1
  147. package/dist/yup.mjs +3 -4
  148. package/dist/yup.mjs.map +1 -1
  149. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import { isEmpty, isNil, isObject, trim } from 'lodash/fp';
1
+ import { isEmpty, isObject } from 'lodash';
2
2
  import { pipe } from '../async.mjs';
3
3
  import { constants, isScalarAttribute, isDynamicZoneAttribute, isMorphToRelationalAttribute } from '../content-types.mjs';
4
4
  import traverseQueryFilters from '../traverse/query-filters.mjs';
@@ -173,7 +173,7 @@ const validateFields = asyncCurry(async (ctx, fields, include)=>{
173
173
  ].includes(key)) {
174
174
  return;
175
175
  }
176
- if (isNil(attribute) || !isScalarAttribute(attribute)) {
176
+ if (attribute == null || !isScalarAttribute(attribute)) {
177
177
  throwInvalidKey({
178
178
  key,
179
179
  path: path.attribute
@@ -218,7 +218,7 @@ const flattenDotPopulatePaths = (populate)=>{
218
218
  const items = Array.isArray(populate) ? populate : [
219
219
  populate
220
220
  ];
221
- return items.flatMap((item)=>item.split(',').map((segment)=>trim(segment)).filter(Boolean));
221
+ return items.flatMap((item)=>item.split(',').map((segment)=>segment.trim()).filter(Boolean));
222
222
  };
223
223
  const validatePopulateDotPathSegments = ({ schema, getModel }, segments, pathPrefix)=>{
224
224
  if (!segments.length) {
@@ -322,13 +322,13 @@ const validatePopulateDotPathSegments = ({ schema, getModel }, segments, pathPre
322
322
  };
323
323
  const validatePopulateDotPaths = (ctx, populate)=>{
324
324
  for (const path of flattenDotPopulatePaths(populate)){
325
- const segments = path.split('.').map((segment)=>trim(segment)).filter(Boolean);
325
+ const segments = path.split('.').map((segment)=>segment.trim()).filter(Boolean);
326
326
  validatePopulateDotPathSegments(ctx, segments, '');
327
327
  }
328
328
  };
329
329
  const validateMorphLikeNestedPopulate = (populateValue, { path })=>{
330
330
  // Keep in sync with convert-query-params polymorphic nested populate handling.
331
- if (!isNil(populateValue) && populateValue !== '*') {
331
+ if (populateValue != null && populateValue !== '*') {
332
332
  throwInvalidKey({
333
333
  key: 'populate',
334
334
  path
@@ -339,6 +339,13 @@ const POPULATE_TRAVERSALS = [
339
339
  'nonAttributesOperators',
340
340
  'private'
341
341
  ];
342
+ // Query params that only apply at the root of a query. They are inherited by populated
343
+ // relations, so they are rejected inside `populate` with an explanation (see #21911).
344
+ const ROOT_ONLY_QUERY_PARAMS = [
345
+ 'status',
346
+ 'publicationFilter',
347
+ 'hasPublishedVersion'
348
+ ];
342
349
  const validatePopulate = asyncCurry(async (ctx, populate, includes)=>{
343
350
  if (!ctx.schema) {
344
351
  throw new Error('Missing schema in defaultValidatePopulate');
@@ -474,7 +481,8 @@ const validatePopulate = asyncCurry(async (ctx, populate, includes)=>{
474
481
  if (includes?.populate?.includes('nonAttributesOperators')) {
475
482
  throwInvalidKey({
476
483
  key,
477
- path: path.attribute
484
+ path: path.attribute,
485
+ reason: ROOT_ONLY_QUERY_PARAMS.some((param)=>param === key) ? `${key} is only accepted at the root of the query, and it also applies to populated relations` : undefined
478
486
  });
479
487
  }
480
488
  }, ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"validators.mjs","sources":["../../src/validate/validators.ts"],"sourcesContent":["import { isEmpty, isNil, isObject, trim } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport {\n isScalarAttribute,\n constants,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} 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 { Attribute, Model } from '../types';\nimport { isBooleanLike } 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 // status is a virtual sort key for D&P-enabled content types\n if (key === 'status' && ctx.schema?.options?.draftAndPublish) {\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\nconst isMorphLikeAttribute = (attribute?: Attribute) =>\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\nconst isPopulatableAttribute = (attribute?: Attribute) =>\n !!attribute && ['relation', 'dynamiczone', 'component', 'media'].includes(attribute.type);\n\nconst isDotNotationPopulate = (populate: unknown): populate is string | string[] => {\n if (populate === '*') {\n return false;\n }\n\n if (typeof populate === 'string') {\n return true;\n }\n\n return (\n Array.isArray(populate) && populate.length > 0 && populate.every((p) => typeof p === 'string')\n );\n};\n\nconst flattenDotPopulatePaths = (populate: string | string[]) => {\n const items = Array.isArray(populate) ? populate : [populate];\n\n return items.flatMap((item) =>\n item\n .split(',')\n .map((segment) => trim(segment))\n .filter(Boolean)\n );\n};\n\nconst validatePopulateDotPathSegments = (\n { schema, getModel }: { schema: Model; getModel: (uid: string) => Model },\n segments: string[],\n pathPrefix: string\n) => {\n if (!segments.length) {\n return;\n }\n\n const [head, ...tail] = segments;\n const fullPath = pathPrefix ? `${pathPrefix}.${head}` : head;\n const attribute = schema.attributes[head];\n\n if (!attribute || !isPopulatableAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!tail.length) {\n return;\n }\n\n if (attribute.type === 'component') {\n if (!attribute.component) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.component), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'relation') {\n if (isMorphLikeAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!attribute.target) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.target!), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'media') {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (attribute.type === 'dynamiczone') {\n const [nextSegment, ...rest] = tail;\n const nextPath = `${fullPath}.${nextSegment}`;\n const candidates = (attribute.components ?? [])\n .map((uid) => getModel(uid))\n .filter((model) => model?.attributes?.[nextSegment]);\n\n if (!candidates.length) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n\n let validated = false;\n\n for (const componentSchema of candidates) {\n const nestedAttribute = componentSchema.attributes[nextSegment];\n\n try {\n if (!rest.length) {\n if (nestedAttribute) {\n validated = true;\n break;\n }\n } else if (nestedAttribute?.type === 'component' && nestedAttribute.component) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.component), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n } else if (\n nestedAttribute?.type === 'relation' &&\n !isMorphLikeAttribute(nestedAttribute) &&\n nestedAttribute.target\n ) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.target), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n }\n } catch {\n // Try the next dynamic-zone component type.\n }\n }\n\n if (!validated) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n }\n};\n\nconst validatePopulateDotPaths = (\n ctx: { schema: Model; getModel: (uid: string) => Model },\n populate: string | string[]\n) => {\n for (const path of flattenDotPopulatePaths(populate)) {\n const segments = path\n .split('.')\n .map((segment) => trim(segment))\n .filter(Boolean);\n\n validatePopulateDotPathSegments(ctx, segments, '');\n }\n};\n\nconst validateMorphLikeNestedPopulate = (\n populateValue: unknown,\n { path }: { path: string | null }\n) => {\n // Keep in sync with convert-query-params polymorphic nested populate handling.\n if (!isNil(populateValue) && populateValue !== '*') {\n throwInvalidKey({ key: 'populate', path });\n }\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\n if (isDotNotationPopulate(populate)) {\n validatePopulateDotPaths({ schema: ctx.schema, getModel: ctx.getModel }, populate);\n\n if (includes?.populate?.includes('private')) {\n return traverseQueryPopulate(throwPrivate, ctx)(populate);\n }\n\n return populate;\n }\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 if (isMorphLikeAttribute(attribute) && isObject(value) && 'populate' in value) {\n validateMorphLikeNestedPopulate((value as Record<string, unknown>).populate, {\n path: path.raw,\n });\n }\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 if (isBooleanLike(value)) {\n return;\n }\n\n throwInvalidKey({ key, path: path.attribute });\n }\n\n // Allowed boolean-like keywords should be ignored.\n //\n // Asked as a predicate rather than by catching `parseType`'s error: this runs\n // once per populate key, and almost no key is boolean-like, so the previous\n // try/catch built and threw away an Error — including a stack capture — on\n // essentially every key of every populate tree of every request.\n if (isBooleanLike(key)) {\n return;\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","options","draftAndPublish","value","isScalarAttribute","isEmpty","defaultValidateSort","FIELDS_TRAVERSALS","validateFields","fields","traverseQueryFields","isNil","defaultValidateFields","isMorphLikeAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","isPopulatableAttribute","type","isDotNotationPopulate","populate","Array","isArray","every","p","flattenDotPopulatePaths","items","flatMap","item","split","map","segment","trim","filter","Boolean","validatePopulateDotPathSegments","getModel","segments","pathPrefix","head","tail","fullPath","attributes","component","target","nextSegment","rest","nextPath","candidates","components","uid","model","validated","componentSchema","nestedAttribute","validatePopulateDotPaths","validateMorphLikeNestedPopulate","populateValue","POPULATE_TRAVERSALS","validatePopulate","traverseQueryPopulate","parent","set","isObject","raw","targets","Object","keys","isBooleanLike","defaultValidatePopulate"],"mappings":"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"}
1
+ {"version":3,"file":"validators.mjs","sources":["../../src/validate/validators.ts"],"sourcesContent":["import { isEmpty, isObject } from 'lodash';\n\nimport { pipe as pipeAsync } from '../async';\nimport {\n isScalarAttribute,\n constants,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} 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 { Attribute, Model } from '../types';\nimport { isBooleanLike } from '../parse-type';\nimport type { SHARED_QUERY_PARAM_KEYS } from '../content-api-constants';\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 // status is a virtual sort key for D&P-enabled content types\n if (key === 'status' && ctx.schema?.options?.draftAndPublish) {\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 (attribute == null || !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\nconst isMorphLikeAttribute = (attribute?: Attribute) =>\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\nconst isPopulatableAttribute = (attribute?: Attribute) =>\n !!attribute && ['relation', 'dynamiczone', 'component', 'media'].includes(attribute.type);\n\nconst isDotNotationPopulate = (populate: unknown): populate is string | string[] => {\n if (populate === '*') {\n return false;\n }\n\n if (typeof populate === 'string') {\n return true;\n }\n\n return (\n Array.isArray(populate) && populate.length > 0 && populate.every((p) => typeof p === 'string')\n );\n};\n\nconst flattenDotPopulatePaths = (populate: string | string[]) => {\n const items = Array.isArray(populate) ? populate : [populate];\n\n return items.flatMap((item) =>\n item\n .split(',')\n .map((segment) => segment.trim())\n .filter(Boolean)\n );\n};\n\nconst validatePopulateDotPathSegments = (\n { schema, getModel }: { schema: Model; getModel: (uid: string) => Model },\n segments: string[],\n pathPrefix: string\n) => {\n if (!segments.length) {\n return;\n }\n\n const [head, ...tail] = segments;\n const fullPath = pathPrefix ? `${pathPrefix}.${head}` : head;\n const attribute = schema.attributes[head];\n\n if (!attribute || !isPopulatableAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!tail.length) {\n return;\n }\n\n if (attribute.type === 'component') {\n if (!attribute.component) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.component), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'relation') {\n if (isMorphLikeAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!attribute.target) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.target!), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'media') {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (attribute.type === 'dynamiczone') {\n const [nextSegment, ...rest] = tail;\n const nextPath = `${fullPath}.${nextSegment}`;\n const candidates = (attribute.components ?? [])\n .map((uid) => getModel(uid))\n .filter((model) => model?.attributes?.[nextSegment]);\n\n if (!candidates.length) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n\n let validated = false;\n\n for (const componentSchema of candidates) {\n const nestedAttribute = componentSchema.attributes[nextSegment];\n\n try {\n if (!rest.length) {\n if (nestedAttribute) {\n validated = true;\n break;\n }\n } else if (nestedAttribute?.type === 'component' && nestedAttribute.component) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.component), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n } else if (\n nestedAttribute?.type === 'relation' &&\n !isMorphLikeAttribute(nestedAttribute) &&\n nestedAttribute.target\n ) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.target), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n }\n } catch {\n // Try the next dynamic-zone component type.\n }\n }\n\n if (!validated) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n }\n};\n\nconst validatePopulateDotPaths = (\n ctx: { schema: Model; getModel: (uid: string) => Model },\n populate: string | string[]\n) => {\n for (const path of flattenDotPopulatePaths(populate)) {\n const segments = path\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\n validatePopulateDotPathSegments(ctx, segments, '');\n }\n};\n\nconst validateMorphLikeNestedPopulate = (\n populateValue: unknown,\n { path }: { path: string | null }\n) => {\n // Keep in sync with convert-query-params polymorphic nested populate handling.\n if (populateValue != null && populateValue !== '*') {\n throwInvalidKey({ key: 'populate', path });\n }\n};\n\nexport const POPULATE_TRAVERSALS = ['nonAttributesOperators', 'private'];\n\n// Query params that only apply at the root of a query. They are inherited by populated\n// relations, so they are rejected inside `populate` with an explanation (see #21911).\nconst ROOT_ONLY_QUERY_PARAMS: ReadonlyArray<(typeof SHARED_QUERY_PARAM_KEYS)[number]> = [\n 'status',\n 'publicationFilter',\n 'hasPublishedVersion',\n];\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\n if (isDotNotationPopulate(populate)) {\n validatePopulateDotPaths({ schema: ctx.schema, getModel: ctx.getModel }, populate);\n\n if (includes?.populate?.includes('private')) {\n return traverseQueryPopulate(throwPrivate, ctx)(populate);\n }\n\n return populate;\n }\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 if (isMorphLikeAttribute(attribute) && isObject(value) && 'populate' in value) {\n validateMorphLikeNestedPopulate((value as Record<string, unknown>).populate, {\n path: path.raw,\n });\n }\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 if (isBooleanLike(value)) {\n return;\n }\n\n throwInvalidKey({ key, path: path.attribute });\n }\n\n // Allowed boolean-like keywords should be ignored.\n //\n // Asked as a predicate rather than by catching `parseType`'s error: this runs\n // once per populate key, and almost no key is boolean-like, so the previous\n // try/catch built and threw away an Error — including a stack capture — on\n // essentially every key of every populate tree of every request.\n if (isBooleanLike(key)) {\n return;\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({\n key,\n path: path.attribute,\n reason: ROOT_ONLY_QUERY_PARAMS.some((param) => param === key)\n ? `${key} is only accepted at the root of the query, and it also applies to populated relations`\n : undefined,\n });\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","options","draftAndPublish","value","isScalarAttribute","isEmpty","defaultValidateSort","FIELDS_TRAVERSALS","validateFields","fields","traverseQueryFields","defaultValidateFields","isMorphLikeAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","isPopulatableAttribute","type","isDotNotationPopulate","populate","Array","isArray","every","p","flattenDotPopulatePaths","items","flatMap","item","split","map","segment","trim","filter","Boolean","validatePopulateDotPathSegments","getModel","segments","pathPrefix","head","tail","fullPath","attributes","component","target","nextSegment","rest","nextPath","candidates","components","uid","model","validated","componentSchema","nestedAttribute","validatePopulateDotPaths","validateMorphLikeNestedPopulate","populateValue","POPULATE_TRAVERSALS","ROOT_ONLY_QUERY_PARAMS","validatePopulate","traverseQueryPopulate","parent","set","isObject","raw","targets","Object","keys","isBooleanLike","reason","some","param","undefined","defaultValidatePopulate"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var utils = require('../utils.js');
5
5
 
6
6
  var throwDisallowedFields = ((allowedFields = null)=>({ key, path: { attribute: path } })=>{
@@ -9,10 +9,10 @@ var throwDisallowedFields = ((allowedFields = null)=>({ key, path: { attribute:
9
9
  return;
10
10
  }
11
11
  // Throw on invalid formats
12
- if (!(fp.isArray(allowedFields) && allowedFields.every(fp.isString))) {
12
+ if (!(Array.isArray(allowedFields) && allowedFields.every(_.isString))) {
13
13
  throw new TypeError(`Expected array of strings for allowedFields but got "${typeof allowedFields}"`);
14
14
  }
15
- if (fp.isNil(path)) {
15
+ if (path == null) {
16
16
  return;
17
17
  }
18
18
  const containedPaths = getContainedPaths(path);
@@ -78,7 +78,7 @@ var throwDisallowedFields = ((allowedFields = null)=>({ key, path: { attribute:
78
78
  * // ['foo', 'foo.bar', 'foo.bar.field']
79
79
  * ```
80
80
  */ const getContainedPaths = (path)=>{
81
- const parts = fp.toPath(path);
81
+ const parts = _.toPath(path);
82
82
  return parts.reduce((acc, value, index, list)=>{
83
83
  return [
84
84
  ...acc,
@@ -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,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
+ {"version":3,"file":"throw-disallowed-fields.js","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isString, toPath } from 'lodash';\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 (!(Array.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 (path == null) {\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","Array","isArray","every","isString","TypeError","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,KAAAA,CAAMC,OAAO,CAACL,kBAAkBA,aAAAA,CAAcM,KAAK,CAACC,UAAAA,CAAQ,CAAA,EAAI;YACpE,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOR,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF,QAAA;AAEA,QAAA,IAAIE,QAAQ,IAAA,EAAM;AAChB,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,QAAAA,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,4 +1,4 @@
1
- import { isArray, isString, isNil, toPath } from 'lodash/fp';
1
+ import { isString, toPath } from 'lodash';
2
2
  import { throwInvalidKey } from '../utils.mjs';
3
3
 
4
4
  var throwDisallowedFields = ((allowedFields = null)=>({ key, path: { attribute: path } })=>{
@@ -7,10 +7,10 @@ var throwDisallowedFields = ((allowedFields = null)=>({ key, path: { attribute:
7
7
  return;
8
8
  }
9
9
  // Throw on invalid formats
10
- if (!(isArray(allowedFields) && allowedFields.every(isString))) {
10
+ if (!(Array.isArray(allowedFields) && allowedFields.every(isString))) {
11
11
  throw new TypeError(`Expected array of strings for allowedFields but got "${typeof allowedFields}"`);
12
12
  }
13
- if (isNil(path)) {
13
+ if (path == null) {
14
14
  return;
15
15
  }
16
16
  const containedPaths = getContainedPaths(path);
@@ -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,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
+ {"version":3,"file":"throw-disallowed-fields.mjs","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"sourcesContent":["import { isString, toPath } from 'lodash';\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 (!(Array.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 (path == null) {\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","Array","isArray","every","isString","TypeError","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,KAAAA,CAAMC,OAAO,CAACL,kBAAkBA,aAAAA,CAAcM,KAAK,CAACC,QAAAA,CAAQ,CAAA,EAAI;YACpE,MAAM,IAAIC,UACR,CAAC,qDAAqD,EAAE,OAAOR,aAAAA,CAAc,CAAC,CAAC,CAAA;AAEnF,QAAA;AAEA,QAAA,IAAIE,QAAQ,IAAA,EAAM;AAChB,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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var utils = require('../utils.js');
5
5
 
6
6
  var throwRestrictedFields = ((restrictedFields = null)=>({ key, path: { attribute: path } })=>{
@@ -12,7 +12,7 @@ var throwRestrictedFields = ((restrictedFields = null)=>({ key, path: { attribut
12
12
  });
13
13
  }
14
14
  // Throw on invalid formats
15
- if (!(fp.isArray(restrictedFields) && restrictedFields.every(fp.isString))) {
15
+ if (!(Array.isArray(restrictedFields) && restrictedFields.every(_.isString))) {
16
16
  throw new TypeError(`Expected array of strings for restrictedFields but got "${typeof restrictedFields}"`);
17
17
  }
18
18
  // if an exact match was found
@@ -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,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
+ {"version":3,"file":"throw-restricted-fields.js","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isString } from 'lodash';\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 (!(Array.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","Array","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,KAAAA,CAAMC,OAAO,CAACN,qBAAqBA,gBAAAA,CAAiBO,KAAK,CAACC,UAAAA,CAAQ,CAAA,EAAI;YAC1E,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOT,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF,QAAA;;QAGA,IAAIA,gBAAAA,CAAiBU,QAAQ,CAACR,IAAAA,CAAAA,EAAiB;YAC7CE,qBAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;AAGA,QAAA,MAAMS,kBAAAA,GAAqBX,gBAAAA,CAAiBY,IAAI,CAAC,CAACC,WAAAA,GAChDX,IAAAA,EAAMY,QAAAA,EAAAA,CAAWC,UAAAA,CAAW,CAAA,EAAGF,WAAAA,CAAY,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAAA,EAAoB;YACtBP,qBAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;AACF,IAAA,CAAA;;;;"}
@@ -1,4 +1,4 @@
1
- import { isArray, isString } from 'lodash/fp';
1
+ import { isString } from 'lodash';
2
2
  import { throwInvalidKey } from '../utils.mjs';
3
3
 
4
4
  var throwRestrictedFields = ((restrictedFields = null)=>({ key, path: { attribute: path } })=>{
@@ -10,7 +10,7 @@ var throwRestrictedFields = ((restrictedFields = null)=>({ key, path: { attribut
10
10
  });
11
11
  }
12
12
  // Throw on invalid formats
13
- if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {
13
+ if (!(Array.isArray(restrictedFields) && restrictedFields.every(isString))) {
14
14
  throw new TypeError(`Expected array of strings for restrictedFields but got "${typeof restrictedFields}"`);
15
15
  }
16
16
  // if an exact match was found
@@ -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,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
+ {"version":3,"file":"throw-restricted-fields.mjs","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"sourcesContent":["import { isString } from 'lodash';\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 (!(Array.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","Array","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,KAAAA,CAAMC,OAAO,CAACN,qBAAqBA,gBAAAA,CAAiBO,KAAK,CAACC,QAAAA,CAAQ,CAAA,EAAI;YAC1E,MAAM,IAAIC,UACR,CAAC,wDAAwD,EAAE,OAAOT,gBAAAA,CAAiB,CAAC,CAAC,CAAA;AAEzF,QAAA;;QAGA,IAAIA,gBAAAA,CAAiBU,QAAQ,CAACR,IAAAA,CAAAA,EAAiB;YAC7CE,eAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;;AAGA,QAAA,MAAMS,kBAAAA,GAAqBX,gBAAAA,CAAiBY,IAAI,CAAC,CAACC,WAAAA,GAChDX,IAAAA,EAAMY,QAAAA,EAAAA,CAAWC,UAAAA,CAAW,CAAA,EAAGF,WAAAA,CAAY,CAAC,CAAC,CAAA,CAAA;AAE/C,QAAA,IAAIF,kBAAAA,EAAoB;YACtBP,eAAAA,CAAgB;AAAEH,gBAAAA,GAAAA;AAAKC,gBAAAA;AAAK,aAAA,CAAA;AAC9B,QAAA;AACF,IAAA,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var contentTypes = require('../../content-types.js');
5
5
  var utils = require('../utils.js');
6
6
  var relations = require('../../relations.js');
@@ -69,16 +69,16 @@ var throwRestrictedRelations = ((auth)=>async ({ data, key, attribute, schema, p
69
69
  }
70
70
  };
71
71
  const isMorphMutationPayload = (value)=>{
72
- return fp.isObject(value) && ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value);
72
+ return _.isObject(value) && ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value);
73
73
  };
74
74
  const isMorphPopulatePayload = (value)=>{
75
- return fp.isObject(value) && !('__type' in value) && 'on' in value && fp.isObject(value.on);
75
+ return _.isObject(value) && !('__type' in value) && 'on' in value && _.isObject(value.on);
76
76
  };
77
77
  const isMorphPopulateAllOrCount = (value)=>{
78
- return value === true || fp.isObject(value) && 'count' in value && value.count === true;
78
+ return value === true || _.isObject(value) && 'count' in value && value.count === true;
79
79
  };
80
80
  const handleMorphElements = async (elements)=>{
81
- if (!fp.isArray(elements)) {
81
+ if (!Array.isArray(elements)) {
82
82
  utils.throwInvalidKey({
83
83
  key,
84
84
  path: path.attribute
@@ -86,7 +86,7 @@ var throwRestrictedRelations = ((auth)=>async ({ data, key, attribute, schema, p
86
86
  }
87
87
  const morphElements = elements;
88
88
  for (const element of morphElements){
89
- if (!fp.isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {
89
+ if (!_.isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {
90
90
  utils.throwInvalidKey({
91
91
  key,
92
92
  path: path.attribute
@@ -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 MorphMutationPayload = {\n connect?: unknown[];\n set?: unknown[];\n disconnect?: unknown[];\n options?: Record<string, unknown> | null;\n};\ntype MorphPopulatePayload = {\n on: Record<string, unknown>;\n};\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 = (data as Record<string, unknown>)[key];\n\n if (isMorphMutationPayload(elements)) {\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 const optionKey = key as keyof typeof VALID_RELATION_ORDERING_KEYS;\n const validator = VALID_RELATION_ORDERING_KEYS[optionKey];\n\n if (!validator) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!validator(elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else if (isMorphPopulatePayload(elements)) {\n for (const uid of Object.keys(elements.on)) {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${uid}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const isMorphMutationPayload = (value: unknown): value is MorphMutationPayload => {\n return (\n isObject(value) &&\n ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value)\n );\n };\n\n const isMorphPopulatePayload = (value: unknown): value is MorphPopulatePayload => {\n return isObject(value) && !('__type' in value) && 'on' in value && isObject(value.on);\n };\n\n const isMorphPopulateAllOrCount = (value: unknown): value is true | { count: true } => {\n return value === true || (isObject(value) && 'count' in value && value.count === true);\n };\n\n const handleMorphElements = async (elements: unknown) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const morphElements = elements as unknown[];\n\n for (const element of morphElements) {\n if (!isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const type = (element as { __type: string }).__type;\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${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 const value = (data as Record<string, unknown>)[key];\n if (isMorphPopulateAllOrCount(value)) {\n return;\n }\n\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","isMorphMutationPayload","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","optionKey","validator","VALID_RELATION_ORDERING_KEYS","isMorphPopulatePayload","uid","on","scopes","map","action","isAllowed","hasAccessToSomeScopes","value","isObject","isMorphPopulateAllOrCount","count","isArray","morphElements","element","__type","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 { isObject } from 'lodash';\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 MorphMutationPayload = {\n connect?: unknown[];\n set?: unknown[];\n disconnect?: unknown[];\n options?: Record<string, unknown> | null;\n};\ntype MorphPopulatePayload = {\n on: Record<string, unknown>;\n};\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 = (data as Record<string, unknown>)[key];\n\n if (isMorphMutationPayload(elements)) {\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 const optionKey = key as keyof typeof VALID_RELATION_ORDERING_KEYS;\n const validator = VALID_RELATION_ORDERING_KEYS[optionKey];\n\n if (!validator) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!validator(elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else if (isMorphPopulatePayload(elements)) {\n for (const uid of Object.keys(elements.on)) {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${uid}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const isMorphMutationPayload = (value: unknown): value is MorphMutationPayload => {\n return (\n isObject(value) &&\n ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value)\n );\n };\n\n const isMorphPopulatePayload = (value: unknown): value is MorphPopulatePayload => {\n return isObject(value) && !('__type' in value) && 'on' in value && isObject(value.on);\n };\n\n const isMorphPopulateAllOrCount = (value: unknown): value is true | { count: true } => {\n return value === true || (isObject(value) && 'count' in value && value.count === true);\n };\n\n const handleMorphElements = async (elements: unknown) => {\n if (!Array.isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const morphElements = elements as unknown[];\n\n for (const element of morphElements) {\n if (!isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const type = (element as { __type: string }).__type;\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${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 const value = (data as Record<string, unknown>)[key];\n if (isMorphPopulateAllOrCount(value)) {\n return;\n }\n\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","isMorphMutationPayload","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","optionKey","validator","VALID_RELATION_ORDERING_KEYS","isMorphPopulatePayload","uid","on","scopes","map","action","isAllowed","hasAccessToSomeScopes","value","isObject","isMorphPopulateAllOrCount","count","Array","isArray","morphElements","element","__type","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isObject, isArray } from 'lodash/fp';
1
+ import { isObject } from 'lodash';
2
2
  import { isMorphToRelationalAttribute, constants } from '../../content-types.mjs';
3
3
  import { throwInvalidKey } from '../utils.mjs';
4
4
  import { VALID_RELATION_ORDERING_KEYS } from '../../relations.mjs';
@@ -76,7 +76,7 @@ var throwRestrictedRelations = ((auth)=>async ({ data, key, attribute, schema, p
76
76
  return value === true || isObject(value) && 'count' in value && value.count === true;
77
77
  };
78
78
  const handleMorphElements = async (elements)=>{
79
- if (!isArray(elements)) {
79
+ if (!Array.isArray(elements)) {
80
80
  throwInvalidKey({
81
81
  key,
82
82
  path: path.attribute
@@ -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 MorphMutationPayload = {\n connect?: unknown[];\n set?: unknown[];\n disconnect?: unknown[];\n options?: Record<string, unknown> | null;\n};\ntype MorphPopulatePayload = {\n on: Record<string, unknown>;\n};\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 = (data as Record<string, unknown>)[key];\n\n if (isMorphMutationPayload(elements)) {\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 const optionKey = key as keyof typeof VALID_RELATION_ORDERING_KEYS;\n const validator = VALID_RELATION_ORDERING_KEYS[optionKey];\n\n if (!validator) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!validator(elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else if (isMorphPopulatePayload(elements)) {\n for (const uid of Object.keys(elements.on)) {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${uid}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const isMorphMutationPayload = (value: unknown): value is MorphMutationPayload => {\n return (\n isObject(value) &&\n ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value)\n );\n };\n\n const isMorphPopulatePayload = (value: unknown): value is MorphPopulatePayload => {\n return isObject(value) && !('__type' in value) && 'on' in value && isObject(value.on);\n };\n\n const isMorphPopulateAllOrCount = (value: unknown): value is true | { count: true } => {\n return value === true || (isObject(value) && 'count' in value && value.count === true);\n };\n\n const handleMorphElements = async (elements: unknown) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const morphElements = elements as unknown[];\n\n for (const element of morphElements) {\n if (!isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const type = (element as { __type: string }).__type;\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${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 const value = (data as Record<string, unknown>)[key];\n if (isMorphPopulateAllOrCount(value)) {\n return;\n }\n\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","isMorphMutationPayload","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","optionKey","validator","VALID_RELATION_ORDERING_KEYS","isMorphPopulatePayload","uid","on","scopes","map","action","isAllowed","hasAccessToSomeScopes","value","isObject","isMorphPopulateAllOrCount","count","isArray","morphElements","element","__type","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 { isObject } from 'lodash';\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 MorphMutationPayload = {\n connect?: unknown[];\n set?: unknown[];\n disconnect?: unknown[];\n options?: Record<string, unknown> | null;\n};\ntype MorphPopulatePayload = {\n on: Record<string, unknown>;\n};\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 = (data as Record<string, unknown>)[key];\n\n if (isMorphMutationPayload(elements)) {\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 const optionKey = key as keyof typeof VALID_RELATION_ORDERING_KEYS;\n const validator = VALID_RELATION_ORDERING_KEYS[optionKey];\n\n if (!validator) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!validator(elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else if (isMorphPopulatePayload(elements)) {\n for (const uid of Object.keys(elements.on)) {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${uid}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const isMorphMutationPayload = (value: unknown): value is MorphMutationPayload => {\n return (\n isObject(value) &&\n ('connect' in value || 'set' in value || 'disconnect' in value || 'options' in value)\n );\n };\n\n const isMorphPopulatePayload = (value: unknown): value is MorphPopulatePayload => {\n return isObject(value) && !('__type' in value) && 'on' in value && isObject(value.on);\n };\n\n const isMorphPopulateAllOrCount = (value: unknown): value is true | { count: true } => {\n return value === true || (isObject(value) && 'count' in value && value.count === true);\n };\n\n const handleMorphElements = async (elements: unknown) => {\n if (!Array.isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const morphElements = elements as unknown[];\n\n for (const element of morphElements) {\n if (!isObject(element) || !('__type' in element) || typeof element.__type !== 'string') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const type = (element as { __type: string }).__type;\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${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 const value = (data as Record<string, unknown>)[key];\n if (isMorphPopulateAllOrCount(value)) {\n return;\n }\n\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","isMorphMutationPayload","handleMorphElements","connect","set","disconnect","options","undefined","throwInvalidKey","optionKeys","Object","keys","optionKey","validator","VALID_RELATION_ORDERING_KEYS","isMorphPopulatePayload","uid","on","scopes","map","action","isAllowed","hasAccessToSomeScopes","value","isObject","isMorphPopulateAllOrCount","count","Array","isArray","morphElements","element","__type","handleRegularRelation","target","isCreatorRelation","includes","populateCreatorFields","scope","strapi","verify"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var yup = require('yup');
4
- var fp = require('lodash/fp');
4
+ var _ = require('lodash');
5
5
  var errors = require('./errors.js');
6
6
 
7
7
  function _interopNamespace(e) {
@@ -33,7 +33,7 @@ const defaultValidationParam = {
33
33
  };
34
34
  const validateYupSchema = (schema, options = {})=>async (body, errorMessage)=>{
35
35
  try {
36
- const optionsWithDefaults = fp.defaults(defaultValidationParam, options);
36
+ const optionsWithDefaults = _.defaults({}, options, defaultValidationParam);
37
37
  const result = await schema.validate(body, optionsWithDefaults);
38
38
  return result;
39
39
  } catch (e) {
@@ -45,7 +45,7 @@ const validateYupSchema = (schema, options = {})=>async (body, errorMessage)=>{
45
45
  };
46
46
  const validateYupSchemaSync = (schema, options = {})=>(body, errorMessage)=>{
47
47
  try {
48
- const optionsWithDefaults = fp.defaults(defaultValidationParam, options);
48
+ const optionsWithDefaults = _.defaults({}, options, defaultValidationParam);
49
49
  return schema.validateSync(body, optionsWithDefaults);
50
50
  } catch (e) {
51
51
  if (e instanceof yup__namespace.ValidationError) {