@strapi/content-manager 5.51.1 → 5.51.2

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 (106) hide show
  1. package/dist/admin/components/ConfigurationForm/Form.js +14 -16
  2. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Form.mjs +14 -16
  4. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  5. package/dist/admin/history/components/VersionHeader.js +1 -1
  6. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  7. package/dist/admin/history/components/VersionHeader.mjs +1 -1
  8. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionsList.js +1 -1
  10. package/dist/admin/history/components/VersionsList.js.map +1 -1
  11. package/dist/admin/history/components/VersionsList.mjs +1 -1
  12. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocument.js.map +1 -1
  14. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  15. package/dist/admin/layout.js +77 -7
  16. package/dist/admin/layout.js.map +1 -1
  17. package/dist/admin/layout.mjs +58 -8
  18. package/dist/admin/layout.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/DocumentActions.js +109 -81
  20. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/DocumentActions.mjs +108 -76
  22. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +2 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +2 -2
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +1 -1
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +1 -1
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +102 -7
  32. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +84 -8
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +2 -1
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +14 -5
  40. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +14 -5
  42. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +17 -16
  44. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +17 -13
  46. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -2
  48. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -2
  50. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +2 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +2 -1
  54. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -1
  55. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +7 -0
  56. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  57. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +7 -0
  58. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  59. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +3 -1
  60. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +2 -0
  61. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +4 -0
  62. package/dist/admin/src/utils/previewImage.d.ts +3 -0
  63. package/dist/admin/translations/en.json.js +1 -0
  64. package/dist/admin/translations/en.json.js.map +1 -1
  65. package/dist/admin/translations/en.json.mjs +1 -0
  66. package/dist/admin/translations/en.json.mjs.map +1 -1
  67. package/dist/admin/utils/objects.js +3 -1
  68. package/dist/admin/utils/objects.js.map +1 -1
  69. package/dist/admin/utils/objects.mjs +3 -1
  70. package/dist/admin/utils/objects.mjs.map +1 -1
  71. package/dist/admin/utils/previewImage.js +14 -0
  72. package/dist/admin/utils/previewImage.js.map +1 -0
  73. package/dist/admin/utils/previewImage.mjs +12 -0
  74. package/dist/admin/utils/previewImage.mjs.map +1 -0
  75. package/dist/admin/utils/validation.js +2 -2
  76. package/dist/admin/utils/validation.js.map +1 -1
  77. package/dist/admin/utils/validation.mjs +2 -2
  78. package/dist/admin/utils/validation.mjs.map +1 -1
  79. package/dist/server/controllers/utils/clone.js +1 -5
  80. package/dist/server/controllers/utils/clone.js.map +1 -1
  81. package/dist/server/controllers/utils/clone.mjs +2 -2
  82. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  83. package/dist/server/controllers/validation/index.js +1 -1
  84. package/dist/server/controllers/validation/index.js.map +1 -1
  85. package/dist/server/controllers/validation/index.mjs +1 -1
  86. package/dist/server/controllers/validation/index.mjs.map +1 -1
  87. package/dist/server/services/document-manager.js +1 -1
  88. package/dist/server/services/document-manager.js.map +1 -1
  89. package/dist/server/services/document-manager.mjs +1 -1
  90. package/dist/server/services/document-manager.mjs.map +1 -1
  91. package/dist/server/services/document-metadata.js +24 -2
  92. package/dist/server/services/document-metadata.js.map +1 -1
  93. package/dist/server/services/document-metadata.mjs +24 -2
  94. package/dist/server/services/document-metadata.mjs.map +1 -1
  95. package/dist/server/services/utils/draft.js +19 -3
  96. package/dist/server/services/utils/draft.js.map +1 -1
  97. package/dist/server/services/utils/draft.mjs +1 -1
  98. package/dist/server/services/utils/draft.mjs.map +1 -1
  99. package/dist/server/services/utils/populate.js +22 -6
  100. package/dist/server/services/utils/populate.js.map +1 -1
  101. package/dist/server/services/utils/populate.mjs +1 -1
  102. package/dist/server/services/utils/populate.mjs.map +1 -1
  103. package/dist/server/src/index.d.ts.map +1 -1
  104. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  105. package/dist/server/src/services/index.d.ts.map +1 -1
  106. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<yup.AnySchema>\n | yup.ObjectSchema<ObjectShape>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n removedAttributes?: string[];\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\nconst escapeRegex = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<ObjectShape> => {\n const createModelSchema = (\n attributes: Schema['attributes'],\n removedAttributes: string[] = []\n ): yup.ObjectSchema<ObjectShape> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n const getNestedPathsForAttribute = (removed: string[], attrName: string): string[] => {\n const prefix = `${attrName}.`;\n // Match both numeric indices [0] and __temp_key__ values [some_key]\n const bracketRegex = new RegExp(`^${escapeRegex(attrName)}\\\\[[^\\\\]]+\\\\]\\\\.`);\n\n return removed\n .filter((p) => p.startsWith(prefix) || bracketRegex.test(p))\n .map((p) =>\n p.startsWith(prefix) ? p.slice(prefix.length) : p.replace(bracketRegex, '')\n );\n };\n\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n if (removedAttributes?.includes(name)) {\n // If the attribute is not visible, we don't want to validate it\n return acc;\n }\n\n const nestedRemoved = getNestedPathsForAttribute(removedAttributes, name);\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes, nestedRemoved).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes, nestedRemoved).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes, nestedRemoved));\n }\n ) as unknown as yup.ObjectSchema<ObjectShape>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes, options.removedAttributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean().nullable();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n return yup.string().nullable();\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required || attribute.type === 'password') {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min !== undefined) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max !== undefined) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","escapeRegex","str","replace","createYupSchema","attributes","components","createModelSchema","removedAttributes","yup","object","shape","Object","entries","reduce","acc","name","getNestedPathsForAttribute","removed","attrName","prefix","bracketRegex","RegExp","filter","p","startsWith","map","slice","DOCUMENT_META_FIELDS","includes","nestedRemoved","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","regex","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","undefined","val","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<yup.AnySchema>\n | yup.ObjectSchema<ObjectShape>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n removedAttributes?: string[];\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\nconst escapeRegex = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<ObjectShape> => {\n const createModelSchema = (\n attributes: Schema['attributes'],\n removedAttributes: string[] = []\n ): yup.ObjectSchema<ObjectShape> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n const getNestedPathsForAttribute = (removed: string[], attrName: string): string[] => {\n const prefix = `${attrName}.`;\n // Match both numeric indices [0] and __temp_key__ values [some_key]\n const bracketRegex = new RegExp(`^${escapeRegex(attrName)}\\\\[[^\\\\]]+\\\\]\\\\.`);\n\n return removed\n .filter((p) => p.startsWith(prefix) || bracketRegex.test(p))\n .map((p) =>\n p.startsWith(prefix) ? p.slice(prefix.length) : p.replace(bracketRegex, '')\n );\n };\n\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n if (removedAttributes?.includes(name)) {\n // If the attribute is not visible, we don't want to validate it\n return acc;\n }\n\n const nestedRemoved = getNestedPathsForAttribute(removedAttributes, name);\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes, nestedRemoved).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes, nestedRemoved).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes, nestedRemoved));\n }\n ) as unknown as yup.ObjectSchema<ObjectShape>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes, options.removedAttributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean().nullable();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch {\n return false;\n }\n });\n case 'password':\n return yup.string().nullable();\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required || attribute.type === 'password') {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min !== undefined) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max !== undefined) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","escapeRegex","str","replace","createYupSchema","attributes","components","createModelSchema","removedAttributes","yup","object","shape","Object","entries","reduce","acc","name","getNestedPathsForAttribute","removed","attrName","prefix","bracketRegex","RegExp","filter","p","startsWith","map","slice","DOCUMENT_META_FIELDS","includes","nestedRemoved","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","parse","regex","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","undefined","val","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}
@@ -156,14 +156,14 @@ const createAttributeSchema = (attribute)=>{
156
156
  try {
157
157
  JSON.stringify(value);
158
158
  return true;
159
- } catch (err) {
159
+ } catch {
160
160
  return false;
161
161
  }
162
162
  }
163
163
  try {
164
164
  JSON.parse(value);
165
165
  return true;
166
- } catch (err) {
166
+ } catch {
167
167
  return false;
168
168
  }
169
169
  });
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<yup.AnySchema>\n | yup.ObjectSchema<ObjectShape>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n removedAttributes?: string[];\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\nconst escapeRegex = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<ObjectShape> => {\n const createModelSchema = (\n attributes: Schema['attributes'],\n removedAttributes: string[] = []\n ): yup.ObjectSchema<ObjectShape> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n const getNestedPathsForAttribute = (removed: string[], attrName: string): string[] => {\n const prefix = `${attrName}.`;\n // Match both numeric indices [0] and __temp_key__ values [some_key]\n const bracketRegex = new RegExp(`^${escapeRegex(attrName)}\\\\[[^\\\\]]+\\\\]\\\\.`);\n\n return removed\n .filter((p) => p.startsWith(prefix) || bracketRegex.test(p))\n .map((p) =>\n p.startsWith(prefix) ? p.slice(prefix.length) : p.replace(bracketRegex, '')\n );\n };\n\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n if (removedAttributes?.includes(name)) {\n // If the attribute is not visible, we don't want to validate it\n return acc;\n }\n\n const nestedRemoved = getNestedPathsForAttribute(removedAttributes, name);\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes, nestedRemoved).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes, nestedRemoved).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes, nestedRemoved));\n }\n ) as unknown as yup.ObjectSchema<ObjectShape>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes, options.removedAttributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean().nullable();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n return yup.string().nullable();\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required || attribute.type === 'password') {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min !== undefined) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max !== undefined) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","escapeRegex","str","replace","createYupSchema","attributes","components","createModelSchema","removedAttributes","yup","object","shape","Object","entries","reduce","acc","name","getNestedPathsForAttribute","removed","attrName","prefix","bracketRegex","RegExp","filter","p","startsWith","map","slice","DOCUMENT_META_FIELDS","includes","nestedRemoved","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","regex","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","undefined","val","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}
1
+ {"version":3,"file":"validation.mjs","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<yup.AnySchema>\n | yup.ObjectSchema<ObjectShape>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n removedAttributes?: string[];\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\nconst escapeRegex = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<ObjectShape> => {\n const createModelSchema = (\n attributes: Schema['attributes'],\n removedAttributes: string[] = []\n ): yup.ObjectSchema<ObjectShape> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n const getNestedPathsForAttribute = (removed: string[], attrName: string): string[] => {\n const prefix = `${attrName}.`;\n // Match both numeric indices [0] and __temp_key__ values [some_key]\n const bracketRegex = new RegExp(`^${escapeRegex(attrName)}\\\\[[^\\\\]]+\\\\]\\\\.`);\n\n return removed\n .filter((p) => p.startsWith(prefix) || bracketRegex.test(p))\n .map((p) =>\n p.startsWith(prefix) ? p.slice(prefix.length) : p.replace(bracketRegex, '')\n );\n };\n\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n if (removedAttributes?.includes(name)) {\n // If the attribute is not visible, we don't want to validate it\n return acc;\n }\n\n const nestedRemoved = getNestedPathsForAttribute(removedAttributes, name);\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes, nestedRemoved).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes, nestedRemoved).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes, nestedRemoved));\n }\n ) as unknown as yup.ObjectSchema<ObjectShape>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes, options.removedAttributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean().nullable();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch {\n return false;\n }\n });\n case 'password':\n return yup.string().nullable();\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required || attribute.type === 'password') {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min !== undefined) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max !== undefined) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","escapeRegex","str","replace","createYupSchema","attributes","components","createModelSchema","removedAttributes","yup","object","shape","Object","entries","reduce","acc","name","getNestedPathsForAttribute","removed","attrName","prefix","bracketRegex","RegExp","filter","p","startsWith","map","slice","DOCUMENT_META_FIELDS","includes","nestedRemoved","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","parse","regex","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","undefined","val","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}
@@ -3,11 +3,7 @@
3
3
  var fp = require('lodash/fp');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
 
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var strapiUtils__default = /*#__PURE__*/_interopDefault(strapiUtils);
9
-
10
- const { isVisibleAttribute } = strapiUtils__default.default.contentTypes;
6
+ const { isVisibleAttribute } = strapiUtils.contentTypes;
11
7
  /**
12
8
  * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin
13
9
  * We can't use special characters as delimiters, because the path includes display names
@@ -1 +1 @@
1
- {"version":3,"file":"clone.js","sources":["../../../../server/src/controllers/utils/clone.ts"],"sourcesContent":["import { set } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport { ProhibitedCloningField } from '../../../../shared/contracts/collection-types';\n\nconst { isVisibleAttribute } = strapiUtils.contentTypes;\n\n/**\n * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin\n * We can't use special characters as delimiters, because the path includes display names\n * for dynamic zone components, which can contain any character.\n */\n\nfunction checkRelation(model: any, attributeName: any, path: string[]): ProhibitedCloningField[] {\n // we don't care about createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n // Return empty array and not null so we can always spread the result\n return [];\n }\n\n /**\n * Only one-to-many and one-to-one (when they're reversed, not one-way) are dangerous,\n * because the other relations don't \"steal\" the relation from the entry we're cloning\n */\n const { relation, inversedBy, mappedBy } = model.attributes[attributeName];\n\n if (\n ['oneToOne', 'oneToMany'].includes(relation) &&\n [mappedBy, inversedBy].some((key) => key != null)\n ) {\n return [[[...path, attributeName], 'relation']];\n }\n\n return [];\n}\n\nconst getProhibitedCloningFields = (\n uid: any,\n pathPrefix: string[] = []\n): ProhibitedCloningField[] => {\n const model = strapi.getModel(uid);\n\n const prohibitedFields = Object.keys(model.attributes).reduce<ProhibitedCloningField[]>(\n (acc, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const attributePath = [...pathPrefix, attributeName];\n\n switch (attribute.type) {\n case 'relation':\n return [...acc, ...checkRelation(model, attributeName, pathPrefix)];\n case 'component':\n return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];\n case 'dynamiczone':\n return [\n ...acc,\n ...(attribute.components || []).flatMap((componentUID: any) =>\n getProhibitedCloningFields(componentUID, [\n ...attributePath,\n strapi.getModel(componentUID).info.displayName,\n ])\n ),\n ];\n case 'uid':\n return [...acc, [attributePath, 'unique']];\n default:\n if (attribute?.unique) {\n return [...acc, [attributePath, 'unique']];\n }\n return acc;\n }\n },\n []\n );\n\n return prohibitedFields;\n};\n\n/**\n * Iterates all attributes of the content type, and removes the ones that are not creatable.\n * - If it's a relation, it sets the value to [] or null.\n * - If it's a regular attribute, it sets the value to null.\n * When cloning, if you don't set a field it will be copied from the original entry. So we need to\n * remove the fields that the user can't create.\n */\nconst excludeNotCreatableFields =\n (uid: any, permissionChecker: any): ((body: any, path?: any[]) => any) =>\n (body: any, path = []): any => {\n const model = strapi.getModel(uid);\n const canCreate = (path: any) => permissionChecker.can.create(null, path);\n\n return Object.keys(model.attributes).reduce((body, attributeName) => {\n const attribute = model.attributes[attributeName];\n const attributePath = [...path, attributeName].join('.');\n\n // Ignore the attribute if it's not visible\n if (!isVisibleAttribute(model, attributeName)) {\n return body;\n }\n\n switch (attribute.type) {\n // Relation should be empty if the user can't create it\n case 'relation': {\n if (canCreate(attributePath)) return body;\n return set(attributePath, { set: [] }, body);\n }\n // Go deeper into the component\n case 'component': {\n return excludeNotCreatableFields(attribute.component, permissionChecker)(body, [\n ...path,\n attributeName,\n ] as any);\n }\n // Attribute should be null if the user can't create it\n default: {\n if (canCreate(attributePath)) return body;\n return set(attributePath, null, body);\n }\n }\n }, body);\n };\n\nexport { getProhibitedCloningFields, excludeNotCreatableFields };\n"],"names":["isVisibleAttribute","strapiUtils","contentTypes","checkRelation","model","attributeName","path","relation","inversedBy","mappedBy","attributes","includes","some","key","getProhibitedCloningFields","uid","pathPrefix","strapi","getModel","prohibitedFields","Object","keys","reduce","acc","attribute","attributePath","type","component","components","flatMap","componentUID","info","displayName","unique","excludeNotCreatableFields","permissionChecker","body","canCreate","can","create","join","set"],"mappings":"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"}
1
+ {"version":3,"file":"clone.js","sources":["../../../../server/src/controllers/utils/clone.ts"],"sourcesContent":["import { set } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport { ProhibitedCloningField } from '../../../../shared/contracts/collection-types';\n\nconst { isVisibleAttribute } = contentTypes;\n\n/**\n * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin\n * We can't use special characters as delimiters, because the path includes display names\n * for dynamic zone components, which can contain any character.\n */\n\nfunction checkRelation(model: any, attributeName: any, path: string[]): ProhibitedCloningField[] {\n // we don't care about createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n // Return empty array and not null so we can always spread the result\n return [];\n }\n\n /**\n * Only one-to-many and one-to-one (when they're reversed, not one-way) are dangerous,\n * because the other relations don't \"steal\" the relation from the entry we're cloning\n */\n const { relation, inversedBy, mappedBy } = model.attributes[attributeName];\n\n if (\n ['oneToOne', 'oneToMany'].includes(relation) &&\n [mappedBy, inversedBy].some((key) => key != null)\n ) {\n return [[[...path, attributeName], 'relation']];\n }\n\n return [];\n}\n\nconst getProhibitedCloningFields = (\n uid: any,\n pathPrefix: string[] = []\n): ProhibitedCloningField[] => {\n const model = strapi.getModel(uid);\n\n const prohibitedFields = Object.keys(model.attributes).reduce<ProhibitedCloningField[]>(\n (acc, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const attributePath = [...pathPrefix, attributeName];\n\n switch (attribute.type) {\n case 'relation':\n return [...acc, ...checkRelation(model, attributeName, pathPrefix)];\n case 'component':\n return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];\n case 'dynamiczone':\n return [\n ...acc,\n ...(attribute.components || []).flatMap((componentUID: any) =>\n getProhibitedCloningFields(componentUID, [\n ...attributePath,\n strapi.getModel(componentUID).info.displayName,\n ])\n ),\n ];\n case 'uid':\n return [...acc, [attributePath, 'unique']];\n default:\n if (attribute?.unique) {\n return [...acc, [attributePath, 'unique']];\n }\n return acc;\n }\n },\n []\n );\n\n return prohibitedFields;\n};\n\n/**\n * Iterates all attributes of the content type, and removes the ones that are not creatable.\n * - If it's a relation, it sets the value to [] or null.\n * - If it's a regular attribute, it sets the value to null.\n * When cloning, if you don't set a field it will be copied from the original entry. So we need to\n * remove the fields that the user can't create.\n */\nconst excludeNotCreatableFields =\n (uid: any, permissionChecker: any): ((body: any, path?: any[]) => any) =>\n (body: any, path = []): any => {\n const model = strapi.getModel(uid);\n const canCreate = (path: any) => permissionChecker.can.create(null, path);\n\n return Object.keys(model.attributes).reduce((body, attributeName) => {\n const attribute = model.attributes[attributeName];\n const attributePath = [...path, attributeName].join('.');\n\n // Ignore the attribute if it's not visible\n if (!isVisibleAttribute(model, attributeName)) {\n return body;\n }\n\n switch (attribute.type) {\n // Relation should be empty if the user can't create it\n case 'relation': {\n if (canCreate(attributePath)) return body;\n return set(attributePath, { set: [] }, body);\n }\n // Go deeper into the component\n case 'component': {\n return excludeNotCreatableFields(attribute.component, permissionChecker)(body, [\n ...path,\n attributeName,\n ] as any);\n }\n // Attribute should be null if the user can't create it\n default: {\n if (canCreate(attributePath)) return body;\n return set(attributePath, null, body);\n }\n }\n }, body);\n };\n\nexport { getProhibitedCloningFields, excludeNotCreatableFields };\n"],"names":["isVisibleAttribute","contentTypes","checkRelation","model","attributeName","path","relation","inversedBy","mappedBy","attributes","includes","some","key","getProhibitedCloningFields","uid","pathPrefix","strapi","getModel","prohibitedFields","Object","keys","reduce","acc","attribute","attributePath","type","component","components","flatMap","componentUID","info","displayName","unique","excludeNotCreatableFields","permissionChecker","body","canCreate","can","create","join","set"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { set } from 'lodash/fp';
2
- import strapiUtils from '@strapi/utils';
2
+ import { contentTypes } from '@strapi/utils';
3
3
 
4
- const { isVisibleAttribute } = strapiUtils.contentTypes;
4
+ const { isVisibleAttribute } = contentTypes;
5
5
  /**
6
6
  * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin
7
7
  * We can't use special characters as delimiters, because the path includes display names
@@ -1 +1 @@
1
- {"version":3,"file":"clone.mjs","sources":["../../../../server/src/controllers/utils/clone.ts"],"sourcesContent":["import { set } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport { ProhibitedCloningField } from '../../../../shared/contracts/collection-types';\n\nconst { isVisibleAttribute } = strapiUtils.contentTypes;\n\n/**\n * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin\n * We can't use special characters as delimiters, because the path includes display names\n * for dynamic zone components, which can contain any character.\n */\n\nfunction checkRelation(model: any, attributeName: any, path: string[]): ProhibitedCloningField[] {\n // we don't care about createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n // Return empty array and not null so we can always spread the result\n return [];\n }\n\n /**\n * Only one-to-many and one-to-one (when they're reversed, not one-way) are dangerous,\n * because the other relations don't \"steal\" the relation from the entry we're cloning\n */\n const { relation, inversedBy, mappedBy } = model.attributes[attributeName];\n\n if (\n ['oneToOne', 'oneToMany'].includes(relation) &&\n [mappedBy, inversedBy].some((key) => key != null)\n ) {\n return [[[...path, attributeName], 'relation']];\n }\n\n return [];\n}\n\nconst getProhibitedCloningFields = (\n uid: any,\n pathPrefix: string[] = []\n): ProhibitedCloningField[] => {\n const model = strapi.getModel(uid);\n\n const prohibitedFields = Object.keys(model.attributes).reduce<ProhibitedCloningField[]>(\n (acc, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const attributePath = [...pathPrefix, attributeName];\n\n switch (attribute.type) {\n case 'relation':\n return [...acc, ...checkRelation(model, attributeName, pathPrefix)];\n case 'component':\n return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];\n case 'dynamiczone':\n return [\n ...acc,\n ...(attribute.components || []).flatMap((componentUID: any) =>\n getProhibitedCloningFields(componentUID, [\n ...attributePath,\n strapi.getModel(componentUID).info.displayName,\n ])\n ),\n ];\n case 'uid':\n return [...acc, [attributePath, 'unique']];\n default:\n if (attribute?.unique) {\n return [...acc, [attributePath, 'unique']];\n }\n return acc;\n }\n },\n []\n );\n\n return prohibitedFields;\n};\n\n/**\n * Iterates all attributes of the content type, and removes the ones that are not creatable.\n * - If it's a relation, it sets the value to [] or null.\n * - If it's a regular attribute, it sets the value to null.\n * When cloning, if you don't set a field it will be copied from the original entry. So we need to\n * remove the fields that the user can't create.\n */\nconst excludeNotCreatableFields =\n (uid: any, permissionChecker: any): ((body: any, path?: any[]) => any) =>\n (body: any, path = []): any => {\n const model = strapi.getModel(uid);\n const canCreate = (path: any) => permissionChecker.can.create(null, path);\n\n return Object.keys(model.attributes).reduce((body, attributeName) => {\n const attribute = model.attributes[attributeName];\n const attributePath = [...path, attributeName].join('.');\n\n // Ignore the attribute if it's not visible\n if (!isVisibleAttribute(model, attributeName)) {\n return body;\n }\n\n switch (attribute.type) {\n // Relation should be empty if the user can't create it\n case 'relation': {\n if (canCreate(attributePath)) return body;\n return set(attributePath, { set: [] }, body);\n }\n // Go deeper into the component\n case 'component': {\n return excludeNotCreatableFields(attribute.component, permissionChecker)(body, [\n ...path,\n attributeName,\n ] as any);\n }\n // Attribute should be null if the user can't create it\n default: {\n if (canCreate(attributePath)) return body;\n return set(attributePath, null, body);\n }\n }\n }, body);\n };\n\nexport { getProhibitedCloningFields, excludeNotCreatableFields };\n"],"names":["isVisibleAttribute","strapiUtils","contentTypes","checkRelation","model","attributeName","path","relation","inversedBy","mappedBy","attributes","includes","some","key","getProhibitedCloningFields","uid","pathPrefix","strapi","getModel","prohibitedFields","Object","keys","reduce","acc","attribute","attributePath","type","component","components","flatMap","componentUID","info","displayName","unique","excludeNotCreatableFields","permissionChecker","body","canCreate","can","create","join","set"],"mappings":"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"}
1
+ {"version":3,"file":"clone.mjs","sources":["../../../../server/src/controllers/utils/clone.ts"],"sourcesContent":["import { set } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport { ProhibitedCloningField } from '../../../../shared/contracts/collection-types';\n\nconst { isVisibleAttribute } = contentTypes;\n\n/**\n * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin\n * We can't use special characters as delimiters, because the path includes display names\n * for dynamic zone components, which can contain any character.\n */\n\nfunction checkRelation(model: any, attributeName: any, path: string[]): ProhibitedCloningField[] {\n // we don't care about createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n // Return empty array and not null so we can always spread the result\n return [];\n }\n\n /**\n * Only one-to-many and one-to-one (when they're reversed, not one-way) are dangerous,\n * because the other relations don't \"steal\" the relation from the entry we're cloning\n */\n const { relation, inversedBy, mappedBy } = model.attributes[attributeName];\n\n if (\n ['oneToOne', 'oneToMany'].includes(relation) &&\n [mappedBy, inversedBy].some((key) => key != null)\n ) {\n return [[[...path, attributeName], 'relation']];\n }\n\n return [];\n}\n\nconst getProhibitedCloningFields = (\n uid: any,\n pathPrefix: string[] = []\n): ProhibitedCloningField[] => {\n const model = strapi.getModel(uid);\n\n const prohibitedFields = Object.keys(model.attributes).reduce<ProhibitedCloningField[]>(\n (acc, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const attributePath = [...pathPrefix, attributeName];\n\n switch (attribute.type) {\n case 'relation':\n return [...acc, ...checkRelation(model, attributeName, pathPrefix)];\n case 'component':\n return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];\n case 'dynamiczone':\n return [\n ...acc,\n ...(attribute.components || []).flatMap((componentUID: any) =>\n getProhibitedCloningFields(componentUID, [\n ...attributePath,\n strapi.getModel(componentUID).info.displayName,\n ])\n ),\n ];\n case 'uid':\n return [...acc, [attributePath, 'unique']];\n default:\n if (attribute?.unique) {\n return [...acc, [attributePath, 'unique']];\n }\n return acc;\n }\n },\n []\n );\n\n return prohibitedFields;\n};\n\n/**\n * Iterates all attributes of the content type, and removes the ones that are not creatable.\n * - If it's a relation, it sets the value to [] or null.\n * - If it's a regular attribute, it sets the value to null.\n * When cloning, if you don't set a field it will be copied from the original entry. So we need to\n * remove the fields that the user can't create.\n */\nconst excludeNotCreatableFields =\n (uid: any, permissionChecker: any): ((body: any, path?: any[]) => any) =>\n (body: any, path = []): any => {\n const model = strapi.getModel(uid);\n const canCreate = (path: any) => permissionChecker.can.create(null, path);\n\n return Object.keys(model.attributes).reduce((body, attributeName) => {\n const attribute = model.attributes[attributeName];\n const attributePath = [...path, attributeName].join('.');\n\n // Ignore the attribute if it's not visible\n if (!isVisibleAttribute(model, attributeName)) {\n return body;\n }\n\n switch (attribute.type) {\n // Relation should be empty if the user can't create it\n case 'relation': {\n if (canCreate(attributePath)) return body;\n return set(attributePath, { set: [] }, body);\n }\n // Go deeper into the component\n case 'component': {\n return excludeNotCreatableFields(attribute.component, permissionChecker)(body, [\n ...path,\n attributeName,\n ] as any);\n }\n // Attribute should be null if the user can't create it\n default: {\n if (canCreate(attributePath)) return body;\n return set(attributePath, null, body);\n }\n }\n }, body);\n };\n\nexport { getProhibitedCloningFields, excludeNotCreatableFields };\n"],"names":["isVisibleAttribute","contentTypes","checkRelation","model","attributeName","path","relation","inversedBy","mappedBy","attributes","includes","some","key","getProhibitedCloningFields","uid","pathPrefix","strapi","getModel","prohibitedFields","Object","keys","reduce","acc","attribute","attributePath","type","component","components","flatMap","componentUID","info","displayName","unique","excludeNotCreatableFields","permissionChecker","body","canCreate","can","create","join","set"],"mappings":"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"}
@@ -60,7 +60,7 @@ const validateCheckUIDAvailabilityInput = (body)=>{
60
60
  let regex;
61
61
  const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
62
62
  if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
63
- regex = (contentType?.attributes[body.field]).regex;
63
+ regex = contentType.attributes[body.field].regex;
64
64
  }
65
65
  const schema = createCheckUIDAvailabilityInputSchema(regex);
66
66
  return zod.validateZodAsync(schema)(body);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { z, errors } from '@strapi/utils';\nimport { validateZodAsync, strapiID } from '../../validation/zod';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'] as const;\n\n/**\n * Validates type kind\n */\nconst kindSchema = z.enum(TYPES).nullable().optional();\n\nconst bulkActionInputSchema = z.object({\n documentIds: z.array(strapiID).min(1),\n});\n\nconst generateUIDInputSchema = z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n data: z.looseObject({}),\n});\n\nconst createCheckUIDAvailabilityInputSchema = (regex?: string) => {\n const pattern = regex ? new RegExp(regex) : /^[A-Za-z0-9-_.~]*$/;\n return z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n value: z.string().refine((value) => value === '' || pattern.test(value), {\n error: `Must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n }),\n });\n};\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateZodAsync(kindSchema);\nconst validateBulkActionInput = validateZodAsync(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateZodAsync(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n let regex: string | undefined;\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n regex = (contentType?.attributes[body.field] as Schema.Attribute.UID).regex;\n }\n\n const schema = createCheckUIDAvailabilityInputSchema(regex);\n return validateZodAsync(schema)(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","z","enum","nullable","optional","bulkActionInputSchema","object","documentIds","array","strapiID","min","generateUIDInputSchema","contentTypeUID","string","field","data","looseObject","createCheckUIDAvailabilityInputSchema","regex","pattern","RegExp","value","refine","test","error","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateZodAsync","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","schema"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { z, errors } from '@strapi/utils';\nimport { validateZodAsync, strapiID } from '../../validation/zod';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'] as const;\n\n/**\n * Validates type kind\n */\nconst kindSchema = z.enum(TYPES).nullable().optional();\n\nconst bulkActionInputSchema = z.object({\n documentIds: z.array(strapiID).min(1),\n});\n\nconst generateUIDInputSchema = z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n data: z.looseObject({}),\n});\n\nconst createCheckUIDAvailabilityInputSchema = (regex?: string) => {\n const pattern = regex ? new RegExp(regex) : /^[A-Za-z0-9-_.~]*$/;\n return z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n value: z.string().refine((value) => value === '' || pattern.test(value), {\n error: `Must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n }),\n });\n};\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateZodAsync(kindSchema);\nconst validateBulkActionInput = validateZodAsync(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateZodAsync(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n let regex: string | undefined;\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n regex = (contentType.attributes[body.field] as Schema.Attribute.UID).regex;\n }\n\n const schema = createCheckUIDAvailabilityInputSchema(regex);\n return validateZodAsync(schema)(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","z","enum","nullable","optional","bulkActionInputSchema","object","documentIds","array","strapiID","min","generateUIDInputSchema","contentTypeUID","string","field","data","looseObject","createCheckUIDAvailabilityInputSchema","regex","pattern","RegExp","value","refine","test","error","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateZodAsync","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","schema"],"mappings":"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"}
@@ -54,7 +54,7 @@ const validateCheckUIDAvailabilityInput = (body)=>{
54
54
  let regex;
55
55
  const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
56
56
  if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
57
- regex = (contentType?.attributes[body.field]).regex;
57
+ regex = contentType.attributes[body.field].regex;
58
58
  }
59
59
  const schema = createCheckUIDAvailabilityInputSchema(regex);
60
60
  return validateZodAsync(schema)(body);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { z, errors } from '@strapi/utils';\nimport { validateZodAsync, strapiID } from '../../validation/zod';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'] as const;\n\n/**\n * Validates type kind\n */\nconst kindSchema = z.enum(TYPES).nullable().optional();\n\nconst bulkActionInputSchema = z.object({\n documentIds: z.array(strapiID).min(1),\n});\n\nconst generateUIDInputSchema = z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n data: z.looseObject({}),\n});\n\nconst createCheckUIDAvailabilityInputSchema = (regex?: string) => {\n const pattern = regex ? new RegExp(regex) : /^[A-Za-z0-9-_.~]*$/;\n return z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n value: z.string().refine((value) => value === '' || pattern.test(value), {\n error: `Must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n }),\n });\n};\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateZodAsync(kindSchema);\nconst validateBulkActionInput = validateZodAsync(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateZodAsync(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n let regex: string | undefined;\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n regex = (contentType?.attributes[body.field] as Schema.Attribute.UID).regex;\n }\n\n const schema = createCheckUIDAvailabilityInputSchema(regex);\n return validateZodAsync(schema)(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","z","enum","nullable","optional","bulkActionInputSchema","object","documentIds","array","strapiID","min","generateUIDInputSchema","contentTypeUID","string","field","data","looseObject","createCheckUIDAvailabilityInputSchema","regex","pattern","RegExp","value","refine","test","error","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateZodAsync","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","schema"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { z, errors } from '@strapi/utils';\nimport { validateZodAsync, strapiID } from '../../validation/zod';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'] as const;\n\n/**\n * Validates type kind\n */\nconst kindSchema = z.enum(TYPES).nullable().optional();\n\nconst bulkActionInputSchema = z.object({\n documentIds: z.array(strapiID).min(1),\n});\n\nconst generateUIDInputSchema = z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n data: z.looseObject({}),\n});\n\nconst createCheckUIDAvailabilityInputSchema = (regex?: string) => {\n const pattern = regex ? new RegExp(regex) : /^[A-Za-z0-9-_.~]*$/;\n return z.object({\n contentTypeUID: z.string(),\n field: z.string(),\n value: z.string().refine((value) => value === '' || pattern.test(value), {\n error: `Must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n }),\n });\n};\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateZodAsync(kindSchema);\nconst validateBulkActionInput = validateZodAsync(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateZodAsync(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n let regex: string | undefined;\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n regex = (contentType.attributes[body.field] as Schema.Attribute.UID).regex;\n }\n\n const schema = createCheckUIDAvailabilityInputSchema(regex);\n return validateZodAsync(schema)(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","z","enum","nullable","optional","bulkActionInputSchema","object","documentIds","array","strapiID","min","generateUIDInputSchema","contentTypeUID","string","field","data","looseObject","createCheckUIDAvailabilityInputSchema","regex","pattern","RegExp","value","refine","test","error","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateZodAsync","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","schema"],"mappings":"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"}
@@ -57,7 +57,7 @@ const documentManager = ({ strapi })=>{
57
57
  const params = strapiUtils.pagination.withDefaultPagination(opts || {}, {
58
58
  maxLimit: 1000
59
59
  });
60
- const { populate, sort, ...countParams } = params;
60
+ const { populate: _populate, sort: _sort, ...countParams } = params;
61
61
  const [documents, total = 0] = await Promise.all([
62
62
  strapi.documents(uid).findMany(params),
63
63
  strapi.documents(uid).count(countParams)
@@ -1 +1 @@
1
- {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate, sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":";;;;;;;AAYA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,kBAAAA;AAC7B,MAAM,EAAEC,sBAAsB,EAAE,GAAGC,yBAAaC,SAAS;AAEzD,MAAMC,uBAAuBC,OAAAA,CAAKJ,sBAAAA,CAAAA;AAClC,MAAMK,cAAcD,OAAAA,CAAK,IAAA,CAAA;AAEzB,MAAME,eAAAA,GAAkB,CAAC,EAAEC,MAAM,EAA2B,GAAA;IAC1D,OAAO;AACL,QAAA,MAAMC,SACJC,EAAU,EACVC,GAAuB,EACvBC,IAAAA,GAAwD,EAAE,EAAA;AAE1D,YAAA,OAAOJ,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKF,OAAO,CAAC;AAAE,gBAAA,GAAGG,IAAI;gBAAEE,UAAAA,EAAYJ;AAAG,aAAA,CAAA;AACjE,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMK,WAAAA,CAAAA,CACJL,EAAiC,EACjCC,GAAuB,EACvBC,IAIC,EAAA;;AAGD,YAAA,MAAMI,QAAa,EAAC;;AAGpB,YAAA,IAAIN,EAAAA,EAAI;AACNM,gBAAAA,KAAAA,CAAMF,UAAU,GAAGJ,EAAAA;AACrB,YAAA;;AAGA,YAAA,IAAIO,KAAAA,CAAMC,OAAO,CAACN,IAAAA,CAAKO,MAAM,CAAA,EAAG;AAC9BH,gBAAAA,KAAAA,CAAMG,MAAM,GAAG;AAAEC,oBAAAA,GAAAA,EAAKR,KAAKO;AAAO,iBAAA;AACpC,YAAA,CAAA,MAAO,IAAIP,IAAAA,CAAKO,MAAM,IAAIP,IAAAA,CAAKO,MAAM,KAAK,GAAA,EAAK;;gBAE7CH,KAAAA,CAAMG,MAAM,GAAGP,IAAAA,CAAKO,MAAM;AAC5B,YAAA;;AAGA,YAAA,IAAI,OAAOP,IAAAA,CAAKS,WAAW,KAAK,SAAA,EAAW;AACzCL,gBAAAA,KAAAA,CAAMM,WAAW,GAAG;AAAEC,oBAAAA,QAAAA,EAAUX,KAAKS;AAAY,iBAAA;AACnD,YAAA;AAEA,YAAA,OAAOb,OAAOgB,EAAE,CAACC,KAAK,CAACd,GAAAA,CAAAA,CAAKe,QAAQ,CAAC;AAAEC,gBAAAA,QAAAA,EAAUf,KAAKe,QAAQ;AAAEX,gBAAAA;AAAM,aAAA,CAAA;AACxE,QAAA,CAAA;QAEA,MAAMU,QAAAA,CAAAA,CAASd,IAAkC,EAAED,GAAuB,EAAA;AACxE,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,gBAAAA,QAAAA,EAAUE,wBAAAA,CAAgBlB,GAAAA;AAAK,aAAA;AACzD,YAAA,OAAOH,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAACE,MAAAA,CAAAA;AACxC,QAAA,CAAA;QAEA,MAAME,QAAAA,CAAAA,CAASlB,IAAkC,EAAED,GAAuB,EAAA;AACxE,YAAA,MAAMiB,SAASG,sBAAAA,CAAWC,qBAAqB,CAACpB,IAAAA,IAAQ,EAAC,EAAG;gBAC1DqB,QAAAA,EAAU;AACZ,aAAA,CAAA;AAEA,YAAA,MAAM,EAAEN,QAAQ,EAAEO,IAAI,EAAE,GAAGC,aAAa,GAAGP,MAAAA;YAC3C,MAAM,CAACf,WAAWuB,KAAAA,GAAQ,CAAC,CAAC,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AAC/C9B,gBAAAA,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAACE,MAAAA,CAAAA;AAC/BpB,gBAAAA,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAK4B,KAAK,CAACJ,WAAAA;AAC7B,aAAA,CAAA;YAED,OAAO;gBACLK,OAAAA,EAAS3B,SAAAA;gBACTkB,UAAAA,EAAYA,sBAAAA,CAAWU,4BAA4B,CAACb,MAAAA,EAAQQ,KAAAA;AAC9D,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMM,MAAAA,CAAAA,CAAO/B,GAAuB,EAAEC,IAAAA,GAAmC,EAAS,EAAA;AAChF,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;gBAAEgC,MAAAA,EAAQ,OAAA;AAAkBjB,0BAAAA;AAAS,aAAA;AAE7D,YAAA,OAAOnB,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAK+B,MAAM,CAACd,MAAAA,CAAAA;AACtC,QAAA,CAAA;AAEA,QAAA,MAAMiB,QACJnC,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAuD,EAAS,EAAA;AAEhE,YAAA,MAAMkC,cAAcC,OAAAA,CAAK3C,oBAAAA,EAAsBE,aAAaM,IAAAA,CAAKoC,IAAI,IAAI,EAAC,CAAA;AAC1E,YAAA,MAAMrB,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;gBAAEoC,IAAAA,EAAMF,WAAAA;AAAanB,0BAAAA,UAAAA;gBAAUiB,MAAAA,EAAQ;AAAQ,aAAA;AAEvE,YAAA,OAAOpC,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKkC,MAAM,CAAC;AAAE,gBAAA,GAAGjB,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA;AAClE,QAAA,CAAA;AAEA,QAAA,MAAMuC,KAAAA,CAAAA,CACJvC,EAAwB,EACxBwC,IAAsE,EACtEvC,GAAuB,EAAA;YAEvB,MAAMgB,UAAAA,GAAW,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;;AAGzC,YAAA,MAAMQ,SAAS+B,IAAAA,EAAM/B,MAAAA;AACrB,YAAA,MAAMS,MAAAA,GAAS;;AAEboB,gBAAAA,IAAAA,EAAM3C,OAAAA,CAAK;AAAC,oBAAA,IAAA;AAAM,oBAAA;iBAAa,EAAE6C,IAAAA,CAAAA;AACjC/B,gBAAAA,MAAAA;AACAQ,0BAAAA;AACF,aAAA;AAEA,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACVsC,KAAK,CAAC;AAAE,gBAAA,GAAGrB,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CAClCyC,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA;;AAEC,QACD,MAAMC,MAAAA,CAAAA,CAAO5C,GAAuB,EAAED,EAAW,EAAA;;AAE/C,YAAA,IAAIA,EAAAA,EAAI;gBACN,MAAM6B,KAAAA,GAAQ,MAAM/B,MAAAA,CAAOgB,EAAE,CAACC,KAAK,CAACd,GAAAA,CAAAA,CAAK4B,KAAK,CAAC;oBAAEvB,KAAAA,EAAO;wBAAEF,UAAAA,EAAYJ;AAAG;AAAE,iBAAA,CAAA;AAC3E,gBAAA,OAAO6B,KAAAA,GAAQ,CAAA;AACjB,YAAA;;YAGA,MAAMA,KAAAA,GAAQ,MAAM/B,MAAAA,CAAOgB,EAAE,CAACC,KAAK,CAACd,KAAK4B,KAAK,EAAA;AAC9C,YAAA,OAAOA,KAAAA,GAAQ,CAAA;AACjB,QAAA,CAAA;AAEA,QAAA,MAAMiB,QACJ9C,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAuD,EAAS,EAAA;AAEhE,YAAA,MAAMJ,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAK6C,MAAM,CAAC;AACjC,gBAAA,GAAG5C,IAAI;gBACPE,UAAAA,EAAYJ;AACd,aAAA,CAAA;AACA,YAAA,OAAO,EAAC;AACV,QAAA,CAAA;;AAGA,QAAA,MAAM+C,YACJC,WAAmC,EACnC/C,GAAuB,EACvBC,IAAAA,GAA2D,EAAE,EAAA;AAE7D,YAAA,MAAM+C,iBAAiB,MAAMnD,MAAAA,CAAOgB,EAAE,CAACoC,WAAW,CAAC,UAAA;AACjD,gBAAA,OAAOvB,OAAAA,CAAQC,GAAG,CAACoB,WAAAA,CAAYG,GAAG,CAAC,OAAOnD,EAAAA,GAAO,IAAI,CAAC8C,MAAM,CAAC9C,IAAIC,GAAAA,EAAKC,IAAAA,CAAAA,CAAAA,CAAAA;AACxE,YAAA,CAAA,CAAA;YAEA,OAAO;AAAE2B,gBAAAA,KAAAA,EAAOoB,eAAeG;AAAO,aAAA;AACxC,QAAA,CAAA;AAEA,QAAA,MAAMC,SACJrD,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAgF,EAAS,EAAA;AAEzF,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACVoD,OAAO,CAAC;AAAE,gBAAA,GAAGnC,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACpCyC,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,OAAAA,CAAAA;AAC9B,QAAA,CAAA;AAEA,QAAA,MAAMW,WAAAA,CAAAA,CAAYrD,GAAoB,EAAE+C,WAAqB,EAAEvC,MAA0B,EAAA;AACvF,YAAA,OAAOX,MAAAA,CAAOgB,EAAE,CAACoC,WAAW,CAAC,UAAA;AAC3B,gBAAA,MAAMpB,OAAAA,GAAU,MAAMH,OAAAA,CAAQC,GAAG,CAC/BoB,WAAAA,CAAYG,GAAG,CAAC,CAAC/C,aAAe,IAAI,CAACiD,OAAO,CAACjD,YAAYH,GAAAA,EAAK;AAAEQ,wBAAAA,MAAAA;AAAQQ,wBAAAA,QAAAA,EAAU;AAAG,qBAAA,CAAA,CAAA,CAAA;AAGvF,gBAAA,MAAMsC,yBAAyBzB,OAAAA,CAAQ0B,IAAI,GAAGC,MAAM,CAACC,SAASN,MAAM;gBACpE,OAAOG,sBAAAA;AACT,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMI,eACJX,WAAmC,EACnC/C,GAAuB,EACvBC,IAAAA,GAA0D,EAAS,EAAA;AAEnE,YAAA,MAAM0D,qBAAqB,MAAM9D,MAAAA,CAAOgB,EAAE,CAACoC,WAAW,CAAC,UAAA;AACrD,gBAAA,OAAOvB,OAAAA,CAAQC,GAAG,CAChBoB,WAAAA,CAAYG,GAAG,CAAC,CAACnD,EAAAA,GACfF,MAAAA,CACGK,SAAS,CAACF,GAAAA,CAAAA,CACV4D,SAAS,CAAC;AAAE,wBAAA,GAAG3D,IAAI;wBAAEE,UAAAA,EAAYJ,EAAAA;AAAIiB,wBAAAA,QAAAA,EAAU;AAAG,qBAAA,CAAA,CAClDwB,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,OAAAA,CAAAA,CAAAA,CAAAA;AAGlC,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMmB,2BAA2BF,kBAAAA,CAAmBJ,IAAI,GAAGC,MAAM,CAACC,SAASN,MAAM;;YAGjF,OAAO;gBAAEvB,KAAAA,EAAOiC;AAAyB,aAAA;AAC3C,QAAA,CAAA;AAEA,QAAA,MAAMD,WACJ7D,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAkF,EAAS,EAAA;AAE3F,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACV4D,SAAS,CAAC;AAAE,gBAAA,GAAG3C,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACtCyC,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA,QAAA,MAAMmB,cACJ/D,EAAwB,EACxBC,GAAuB,EACvBC,IAAAA,GAAqF,EAAS,EAAA;AAE9F,YAAA,MAAMe,UAAAA,GAAWf,IAAAA,CAAKe,QAAQ,IAAK,MAAMgB,0BAAAA,CAAkBhC,GAAAA,CAAAA;AAC3D,YAAA,MAAMiB,MAAAA,GAAS;AAAE,gBAAA,GAAGhB,IAAI;AAAEe,0BAAAA;AAAS,aAAA;AAEnC,YAAA,OAAOnB,MAAAA,CACJK,SAAS,CAACF,GAAAA,CAAAA,CACV8D,YAAY,CAAC;AAAE,gBAAA,GAAG7C,MAAM;gBAAEd,UAAAA,EAAYJ;AAAG,aAAA,CAAA,CACzCyC,IAAI,CAAC,CAACC,MAAAA,GAAWA,MAAAA,EAAQC,QAAQC,EAAAA,CAAG,CAAA,CAAA,CAAA;AACzC,QAAA,CAAA;AAEA,QAAA,MAAMoB,mBAAAA,CAAAA,CAAoBhE,EAAU,EAAEC,GAAoB,EAAEQ,MAAc,EAAA;AACxE,YAAA,MAAM,YAAEQ,UAAQ,EAAEgD,YAAY,EAAE,GAAGC,kCAAAA,CAA0BjE,GAAAA,CAAAA;AAE7D,YAAA,IAAI,CAACgE,YAAAA,EAAc;gBACjB,OAAO;oBAAEE,oBAAAA,EAAsB,CAAA;oBAAGC,aAAAA,EAAe;AAAE,iBAAA;AACrD,YAAA;AAEA,YAAA,MAAMC,WAAW,MAAMvE,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKF,OAAO,CAAC;gBAAEK,UAAAA,EAAYJ,EAAAA;AAAIiB,0BAAAA,UAAAA;AAAUR,gBAAAA;AAAO,aAAA,CAAA;AACxF,YAAA,IAAI,CAAC4D,QAAAA,EAAU;gBACb,MAAM,IAAIhF,gBAAAA,CACR,CAAC,kDAAkD,EAAEW,GAAG,YAAY,EAAES,MAAAA,CAAO,UAAU,CAAC,CAAA;AAE5F,YAAA;YAEA,OAAO6D,oBAAAA,CAAexE,QAAQuE,QAAAA,EAAUpE,GAAAA,CAAAA;AAC1C,QAAA,CAAA;AAEA,QAAA,MAAMsE,8BAAAA,CAAAA,CACJvB,WAAmC,EACnC/C,GAAuB,EACvBQ,MAAyB,EAAA;AAEzB,YAAA,MAAM,YAAEQ,UAAQ,EAAEgD,YAAY,EAAE,GAAGC,kCAAAA,CAA0BjE,GAAAA,CAAAA;AAE7D,YAAA,IAAI,CAACgE,YAAAA,EAAc;gBACjB,OAAO,CAAA;AACT,YAAA;AAEA,YAAA,MAAMO,WAAW,MAAM1E,MAAAA,CAAOK,SAAS,CAACF,GAAAA,CAAAA,CAAKe,QAAQ,CAAC;AACpDC,0BAAAA,UAAAA;gBACAwD,OAAAA,EAAS;oBAAErE,UAAAA,EAAY;wBAAEM,GAAAA,EAAKsC;AAAY;AAAE,iBAAA;AAC5CvC,gBAAAA,MAAAA;gBACAyB,MAAAA,EAAQ;AACV,aAAA,CAAA;AAEA,YAAA,MAAMwC,MAAAA,GAAS,MAAM/C,OAAAA,CAAQC,GAAG,CAC9B4C,QAAAA,CAASrB,GAAG,CAAC,CAACwB,MAAAA,GAAqBL,oBAAAA,CAAexE,MAAAA,EAAQ6E,MAAAA,EAAQ1E,GAAAA,CAAAA,CAAAA,CAAAA;AAGpE,YAAA,OAAOyE,MAAAA,CAAOE,MAAM,CAClB,CAAClD,KAAAA,EAAOmD,YAAAA,GACNnD,KAAAA,GAAQmD,YAAAA,CAAaV,oBAAoB,GAAGU,YAAAA,CAAaT,aAAa,EACxE,CAAA,CAAA;AAEJ,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = pipe(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(['id', 'documentId'], body),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":"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"}
@@ -55,7 +55,7 @@ const documentManager = ({ strapi })=>{
55
55
  const params = pagination.withDefaultPagination(opts || {}, {
56
56
  maxLimit: 1000
57
57
  });
58
- const { populate, sort, ...countParams } = params;
58
+ const { populate: _populate, sort: _sort, ...countParams } = params;
59
59
  const [documents, total = 0] = await Promise.all([
60
60
  strapi.documents(uid).findMany(params),
61
61
  strapi.documents(uid).count(countParams)