@strapi/upload 5.18.1 → 5.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/admin/components/FilterPopover/FilterPopover.js +3 -0
  2. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  3. package/dist/admin/components/FilterPopover/FilterPopover.mjs +3 -0
  4. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  5. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +2 -1
  6. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  7. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +2 -1
  8. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  9. package/dist/admin/package.json.js +7 -6
  10. package/dist/admin/package.json.js.map +1 -1
  11. package/dist/admin/package.json.mjs +7 -6
  12. package/dist/admin/package.json.mjs.map +1 -1
  13. package/dist/server/routes/content-api.js +84 -24
  14. package/dist/server/routes/content-api.js.map +1 -1
  15. package/dist/server/routes/content-api.mjs +65 -24
  16. package/dist/server/routes/content-api.mjs.map +1 -1
  17. package/dist/server/routes/validation/upload.js +99 -0
  18. package/dist/server/routes/validation/upload.js.map +1 -0
  19. package/dist/server/routes/validation/upload.mjs +78 -0
  20. package/dist/server/routes/validation/upload.mjs.map +1 -0
  21. package/dist/server/services/extensions/utils.js +10 -0
  22. package/dist/server/services/extensions/utils.js.map +1 -1
  23. package/dist/server/services/extensions/utils.mjs +10 -0
  24. package/dist/server/services/extensions/utils.mjs.map +1 -1
  25. package/dist/server/services/upload.js +18 -6
  26. package/dist/server/services/upload.js.map +1 -1
  27. package/dist/server/services/upload.mjs +19 -7
  28. package/dist/server/services/upload.mjs.map +1 -1
  29. package/dist/server/src/index.d.ts +2 -9
  30. package/dist/server/src/index.d.ts.map +1 -1
  31. package/dist/server/src/routes/content-api.d.ts +2 -8
  32. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  33. package/dist/server/src/routes/index.d.ts +1 -8
  34. package/dist/server/src/routes/index.d.ts.map +1 -1
  35. package/dist/server/src/routes/validation/index.d.ts +2 -0
  36. package/dist/server/src/routes/validation/index.d.ts.map +1 -0
  37. package/dist/server/src/routes/validation/upload.d.ts +94 -0
  38. package/dist/server/src/routes/validation/upload.d.ts.map +1 -0
  39. package/dist/server/src/services/extensions/utils.d.ts +1 -1
  40. package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
  41. package/dist/server/src/services/index.d.ts +1 -1
  42. package/dist/server/src/services/upload.d.ts +1 -1
  43. package/dist/server/src/services/upload.d.ts.map +1 -1
  44. package/package.json +7 -6
@@ -194,6 +194,9 @@ const FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle })=>{
194
194
  const appliedFilter = displayedFilters.find((filter)=>filter.name === modifiedData.name);
195
195
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Popover.Content, {
196
196
  sideOffset: 4,
197
+ style: {
198
+ zIndex: 499
199
+ },
197
200
  children: /*#__PURE__*/ jsxRuntime.jsx("form", {
198
201
  onSubmit: handleSubmit,
199
202
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPopover.js","sources":["../../../../admin/src/components/FilterPopover/FilterPopover.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options?.[0].value || '';\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas?.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter!).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter?.metadatas}\n {...appliedFilter?.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n"],"names":["FilterPopover","displayedFilters","filters","onSubmit","onToggle","formatMessage","useIntl","modifiedData","setModifiedData","React","useState","name","filter","value","handleChangeFilterField","nextField","find","f","fieldSchema","type","options","filterValue","getFilterList","toString","handleChangeOperator","operator","prev","handleSubmit","e","preventDefault","stopPropagation","encodedValue","encodeURIComponent","alreadyAppliedFilters","Object","keys","filtersWithoutMimeType","hasCurrentFilter","filterToAdd","mime","$not","Array","isArray","$contains","undefined","nextFilters","hasFilter","modifiedDataFilter","filtersWithoutFile","filterType","oppositeFilter","oppositeFilterIndex","findIndex","hasOppositeFilter","slice","splice","modifiedDataName","appliedFilter","_jsx","Popover","Content","sideOffset","form","_jsxs","Flex","padding","direction","alignItems","gap","style","minWidth","Box","SingleSelect","aria-label","id","defaultMessage","size","onChange","map","SingleSelectOption","metadatas","label","option","intlLabel","FilterValueInput","Button","variant","startIcon","Plus","fullWidth"],"mappings":"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"}
1
+ {"version":3,"file":"FilterPopover.js","sources":["../../../../admin/src/components/FilterPopover/FilterPopover.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options?.[0].value || '';\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4} style={{ zIndex: 499 }}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas?.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter!).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter?.metadatas}\n {...appliedFilter?.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n"],"names":["FilterPopover","displayedFilters","filters","onSubmit","onToggle","formatMessage","useIntl","modifiedData","setModifiedData","React","useState","name","filter","value","handleChangeFilterField","nextField","find","f","fieldSchema","type","options","filterValue","getFilterList","toString","handleChangeOperator","operator","prev","handleSubmit","e","preventDefault","stopPropagation","encodedValue","encodeURIComponent","alreadyAppliedFilters","Object","keys","filtersWithoutMimeType","hasCurrentFilter","filterToAdd","mime","$not","Array","isArray","$contains","undefined","nextFilters","hasFilter","modifiedDataFilter","filtersWithoutFile","filterType","oppositeFilter","oppositeFilterIndex","findIndex","hasOppositeFilter","slice","splice","modifiedDataName","appliedFilter","_jsx","Popover","Content","sideOffset","style","zIndex","form","_jsxs","Flex","padding","direction","alignItems","gap","minWidth","Box","SingleSelect","aria-label","id","defaultMessage","size","onChange","map","SingleSelectOption","metadatas","label","option","intlLabel","FilterValueInput","Button","variant","startIcon","Plus","fullWidth"],"mappings":"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"}
@@ -173,6 +173,9 @@ const FilterPopover = ({ displayedFilters, filters, onSubmit, onToggle })=>{
173
173
  const appliedFilter = displayedFilters.find((filter)=>filter.name === modifiedData.name);
174
174
  return /*#__PURE__*/ jsx(Popover.Content, {
175
175
  sideOffset: 4,
176
+ style: {
177
+ zIndex: 499
178
+ },
176
179
  children: /*#__PURE__*/ jsx("form", {
177
180
  onSubmit: handleSubmit,
178
181
  children: /*#__PURE__*/ jsxs(Flex, {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPopover.mjs","sources":["../../../../admin/src/components/FilterPopover/FilterPopover.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options?.[0].value || '';\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas?.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter!).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter?.metadatas}\n {...appliedFilter?.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n"],"names":["FilterPopover","displayedFilters","filters","onSubmit","onToggle","formatMessage","useIntl","modifiedData","setModifiedData","React","useState","name","filter","value","handleChangeFilterField","nextField","find","f","fieldSchema","type","options","filterValue","getFilterList","toString","handleChangeOperator","operator","prev","handleSubmit","e","preventDefault","stopPropagation","encodedValue","encodeURIComponent","alreadyAppliedFilters","Object","keys","filtersWithoutMimeType","hasCurrentFilter","filterToAdd","mime","$not","Array","isArray","$contains","undefined","nextFilters","hasFilter","modifiedDataFilter","filtersWithoutFile","filterType","oppositeFilter","oppositeFilterIndex","findIndex","hasOppositeFilter","slice","splice","modifiedDataName","appliedFilter","_jsx","Popover","Content","sideOffset","form","_jsxs","Flex","padding","direction","alignItems","gap","style","minWidth","Box","SingleSelect","aria-label","id","defaultMessage","size","onChange","map","SingleSelectOption","metadatas","label","option","intlLabel","FilterValueInput","Button","variant","startIcon","Plus","fullWidth"],"mappings":"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"}
1
+ {"version":3,"file":"FilterPopover.mjs","sources":["../../../../admin/src/components/FilterPopover/FilterPopover.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\n/**\n *\n * FilterPopover\n *\n */\nimport * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n SingleSelectOption,\n Popover,\n SingleSelect,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { FilterValueInput } from './FilterValueInput';\nimport { getFilterList } from './utils/getFilterList';\n\ntype Filter = {\n [key in 'mime' | 'createdAt' | 'updatedAt']?:\n | {\n [key in '$contains' | '$notContains' | '$eq' | '$not']?:\n | string[]\n | string\n | { $contains: string[] };\n }\n | undefined;\n};\n\nexport interface FilterPopoverProps {\n displayedFilters: {\n name: string;\n metadatas?: {\n label?: string;\n };\n fieldSchema: {\n type: string;\n options?: {\n value: string;\n }[];\n mainField?: {\n schema: {\n type: string;\n };\n };\n };\n }[];\n filters: Filter[];\n onSubmit: (filters: Filter[]) => void;\n onToggle: () => void;\n}\n\nexport const FilterPopover = ({\n displayedFilters,\n filters,\n onSubmit,\n onToggle,\n}: FilterPopoverProps) => {\n const { formatMessage } = useIntl();\n\n const [modifiedData, setModifiedData] = React.useState({\n name: 'createdAt',\n filter: '$eq',\n value: '',\n });\n\n const handleChangeFilterField = (value: string | number) => {\n const nextField = displayedFilters.find((f) => f.name === value);\n if (!nextField) {\n return;\n }\n const {\n fieldSchema: { type, options },\n } = nextField;\n let filterValue = '';\n\n if (type === 'enumeration') {\n filterValue = options?.[0].value || '';\n }\n\n const filter = getFilterList(nextField)[0].value;\n\n setModifiedData({ name: value.toString(), filter, value: filterValue });\n };\n\n const handleChangeOperator = (operator: string | number) => {\n if (modifiedData.name === 'mime') {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: 'image' }));\n } else {\n setModifiedData((prev) => ({ ...prev, filter: operator.toString(), value: '' }));\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n const encodedValue = encodeURIComponent(modifiedData.value);\n\n if (encodedValue) {\n if (modifiedData.name === 'mime') {\n const alreadyAppliedFilters = filters.filter((filter) => {\n return Object.keys(filter)[0] === 'mime';\n });\n\n if (modifiedData.value === 'file') {\n const filtersWithoutMimeType = filters.filter((filter) => {\n return Object.keys(filter)[0] !== 'mime';\n });\n\n let hasCurrentFilter = false;\n\n let filterToAdd: Filter;\n\n if (modifiedData.filter === '$contains') {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n if (typeof filter.mime?.$not !== 'string' && !Array.isArray(filter.mime?.$not)) {\n return filter.mime?.$not?.$contains !== undefined;\n }\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $not: {\n $contains: ['image', 'video'],\n },\n },\n };\n } else {\n hasCurrentFilter =\n alreadyAppliedFilters.find((filter) => {\n return Array.isArray(filter.mime?.$contains);\n }) !== undefined;\n\n filterToAdd = {\n mime: {\n $contains: ['image', 'video'],\n },\n };\n }\n\n if (hasCurrentFilter) {\n onToggle();\n\n return;\n }\n\n const nextFilters = [...filtersWithoutMimeType, filterToAdd];\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n const hasFilter =\n alreadyAppliedFilters.find((filter) => {\n const modifiedDataFilter = modifiedData.filter;\n return (\n filter.mime &&\n filter.mime[modifiedDataFilter as keyof typeof filter.mime] === modifiedData.value\n );\n }) !== undefined;\n\n // Don't apply the same filter twice\n if (hasFilter) {\n onToggle();\n\n return;\n }\n\n const filtersWithoutFile = filters.filter((filter) => {\n const filterType = Object.keys(filter)[0];\n\n if (filterType !== 'mime') {\n return true;\n }\n\n if (\n typeof filter.mime?.$not !== 'string' &&\n !Array.isArray(filter.mime?.$not) &&\n filter.mime?.$not?.$contains !== undefined\n ) {\n return false;\n }\n\n if (Array.isArray(filter?.mime?.$contains)) {\n return false;\n }\n\n return true;\n });\n\n const oppositeFilter = modifiedData.filter === '$contains' ? '$notContains' : '$contains';\n\n const oppositeFilterIndex = filtersWithoutFile.findIndex((filter) => {\n return filter.mime?.[oppositeFilter] === modifiedData.value;\n });\n const hasOppositeFilter = oppositeFilterIndex !== -1;\n\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: modifiedData.value } };\n\n if (!hasOppositeFilter) {\n const nextFilters = [...filtersWithoutFile, filterToAdd];\n\n onSubmit(nextFilters);\n\n onToggle();\n\n return;\n }\n\n if (hasOppositeFilter) {\n const nextFilters = filtersWithoutFile.slice();\n nextFilters.splice(oppositeFilterIndex, 1, filterToAdd);\n onSubmit(nextFilters);\n\n onToggle();\n }\n\n return;\n }\n\n const hasFilter =\n filters.find((filter) => {\n const modifiedDataName = modifiedData.name as\n | 'mime'\n | 'createdAt'\n | 'updatedAt'\n | '$contains'\n | '$notContains'\n | '$eq'\n | '$not';\n return (\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt'] &&\n filter[modifiedDataName as 'mime' | 'createdAt' | 'updatedAt']?.[\n modifiedDataName as '$contains' | '$notContains' | '$eq' | '$not'\n ] === encodedValue\n );\n }) !== undefined;\n\n if (!hasFilter) {\n const filterToAdd = { [modifiedData.name]: { [modifiedData.filter]: encodedValue } };\n\n const nextFilters = [...filters, filterToAdd];\n\n onSubmit(nextFilters);\n }\n }\n\n onToggle();\n };\n\n const appliedFilter = displayedFilters.find((filter) => filter.name === modifiedData.name);\n\n return (\n <Popover.Content sideOffset={4} style={{ zIndex: 499 }}>\n <form onSubmit={handleSubmit}>\n <Flex padding={3} direction=\"column\" alignItems=\"stretch\" gap={1} style={{ minWidth: 184 }}>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n })}\n name=\"name\"\n size=\"M\"\n onChange={handleChangeFilterField}\n value={modifiedData.name}\n >\n {displayedFilters.map((filter) => {\n return (\n <SingleSelectOption key={filter.name} value={filter.name}>\n {filter.metadatas?.label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <SingleSelect\n aria-label={formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n })}\n name=\"filter\"\n size=\"M\"\n value={modifiedData.filter}\n onChange={handleChangeOperator}\n >\n {getFilterList(appliedFilter!).map((option) => {\n return (\n <SingleSelectOption key={option.value} value={option.value}>\n {formatMessage(option.intlLabel)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n <Box>\n <FilterValueInput\n {...appliedFilter?.metadatas}\n {...appliedFilter?.fieldSchema}\n value={modifiedData.value}\n onChange={(value) => setModifiedData((prev) => ({ ...prev, value }))}\n />\n </Box>\n <Box>\n <Button size=\"L\" variant=\"secondary\" startIcon={<Plus />} type=\"submit\" fullWidth>\n {formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Box>\n </Flex>\n </form>\n </Popover.Content>\n );\n};\n"],"names":["FilterPopover","displayedFilters","filters","onSubmit","onToggle","formatMessage","useIntl","modifiedData","setModifiedData","React","useState","name","filter","value","handleChangeFilterField","nextField","find","f","fieldSchema","type","options","filterValue","getFilterList","toString","handleChangeOperator","operator","prev","handleSubmit","e","preventDefault","stopPropagation","encodedValue","encodeURIComponent","alreadyAppliedFilters","Object","keys","filtersWithoutMimeType","hasCurrentFilter","filterToAdd","mime","$not","Array","isArray","$contains","undefined","nextFilters","hasFilter","modifiedDataFilter","filtersWithoutFile","filterType","oppositeFilter","oppositeFilterIndex","findIndex","hasOppositeFilter","slice","splice","modifiedDataName","appliedFilter","_jsx","Popover","Content","sideOffset","style","zIndex","form","_jsxs","Flex","padding","direction","alignItems","gap","minWidth","Box","SingleSelect","aria-label","id","defaultMessage","size","onChange","map","SingleSelectOption","metadatas","label","option","intlLabel","FilterValueInput","Button","variant","startIcon","Plus","fullWidth"],"mappings":"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"}
@@ -52,7 +52,8 @@ const CarouselAsset = ({ asset })=>{
52
52
  const assetUrl = createAssetUrl.createAssetUrl(asset, true);
53
53
  if (!assetUrl) return null;
54
54
  // Adding a param to the url to bust the cache and force the refresh of the image when replaced
55
- const cacheBustedUrl = `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;
55
+ // Only add updatedAt parameter if the URL is not signed to prevent signature invalidation
56
+ const cacheBustedUrl = asset.isUrlSigned ? assetUrl : `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;
56
57
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
57
58
  tag: "img",
58
59
  maxHeight: "100%",
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselAsset.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx"],"sourcesContent":["import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }: { asset: FileAsset }) => {\n if (asset.mime?.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)!}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Image)) {\n const assetUrl = createAssetUrl(asset, true);\n if (!assetUrl) return null;\n\n // Adding a param to the url to bust the cache and force the refresh of the image when replaced\n const cacheBustedUrl = `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;\n\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={cacheBustedUrl}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext?.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n"],"names":["DocAsset","styled","Flex","VideoPreviewWrapper","Box","AudioPreviewWrapper","CarouselAsset","asset","mime","includes","AssetType","Video","_jsx","height","VideoPreview","url","createAssetUrl","alt","alternativeText","name","Audio","AudioPreview","Image","assetUrl","cacheBustedUrl","updatedAt","tag","maxHeight","maxWidth","src","width","justifyContent","hasRadius","ext","FilePdf","aria-label","File"],"mappings":";;;;;;;;;;;;;;;AAWA,MAAMA,QAAAA,GAAWC,uBAAOC,CAAAA,iBAAAA,CAAK;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBF,uBAAOG,CAAAA,gBAAAA,CAAI;;;;;;AAMvC,CAAC;AAED,MAAMC,mBAAAA,GAAsBJ,uBAAOG,CAAAA,gBAAAA,CAAI;;;;;AAKvC,CAAC;AAEYE,MAAAA,aAAAA,GAAgB,CAAC,EAAEC,KAAK,EAAwB,GAAA;AAC3D,IAAA,IAAIA,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEC,cAACT,CAAAA,mBAAAA,EAAAA;YAAoBU,MAAO,EAAA,MAAA;AAC1B,YAAA,QAAA,gBAAAD,cAACE,CAAAA,yBAAAA,EAAAA;AACCC,gBAAAA,GAAAA,EAAKC,8BAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BC,gBAAAA,IAAAA,EAAMD,MAAMC,IAAI;AAChBS,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUU,KAAK,CAAG,EAAA;AACzC,QAAA,qBACER,cAACP,CAAAA,mBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAO,cAACS,CAAAA,yBAAAA,EAAAA;AACCN,gBAAAA,GAAAA,EAAKC,8BAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BU,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUY,KAAK,CAAG,EAAA;QACzC,MAAMC,QAAAA,GAAWP,8BAAeT,KAAO,EAAA,IAAA,CAAA;QACvC,IAAI,CAACgB,UAAU,OAAO,IAAA;;AAGtB,QAAA,MAAMC,iBAAiB,CAAC,EAAED,QAAS,CAAA,EAAEA,SAASd,QAAQ,CAAC,GAAO,CAAA,GAAA,GAAA,GAAM,IAAI,UAAU,EAAEF,KAAMkB,CAAAA,SAAS,CAAC,CAAC;AAErG,QAAA,qBACEb,cAACR,CAAAA,gBAAAA,EAAAA;YACCsB,GAAI,EAAA,KAAA;YACJC,SAAU,EAAA,MAAA;YACVC,QAAS,EAAA,MAAA;YACTC,GAAKL,EAAAA,cAAAA;AACLP,YAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;AAG1C;AAEA,IAAA,qBACEP,cAACZ,CAAAA,QAAAA,EAAAA;QAAS8B,KAAM,EAAA,MAAA;QAAOjB,MAAO,EAAA,MAAA;QAAOkB,cAAe,EAAA,QAAA;QAASC,SAAS,EAAA,IAAA;AACnEzB,QAAAA,QAAAA,EAAAA,KAAAA,CAAM0B,GAAG,EAAExB,QAAS,CAAA,KAAA,CAAA,iBACnBG,cAACsB,CAAAA,aAAAA,EAAAA;AAAQC,YAAAA,YAAAA,EAAY5B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEW,KAAM,EAAA,MAAA;YAAOjB,MAAO,EAAA;2BAE9ED,cAACwB,CAAAA,UAAAA,EAAAA;AAAKD,YAAAA,YAAAA,EAAY5B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEW,KAAM,EAAA,MAAA;YAAOjB,MAAO,EAAA;;;AAInF;;;;"}
1
+ {"version":3,"file":"CarouselAsset.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx"],"sourcesContent":["import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }: { asset: FileAsset }) => {\n if (asset.mime?.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)!}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Image)) {\n const assetUrl = createAssetUrl(asset, true);\n if (!assetUrl) return null;\n\n // Adding a param to the url to bust the cache and force the refresh of the image when replaced\n // Only add updatedAt parameter if the URL is not signed to prevent signature invalidation\n const cacheBustedUrl = asset.isUrlSigned\n ? assetUrl\n : `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;\n\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={cacheBustedUrl}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext?.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n"],"names":["DocAsset","styled","Flex","VideoPreviewWrapper","Box","AudioPreviewWrapper","CarouselAsset","asset","mime","includes","AssetType","Video","_jsx","height","VideoPreview","url","createAssetUrl","alt","alternativeText","name","Audio","AudioPreview","Image","assetUrl","cacheBustedUrl","isUrlSigned","updatedAt","tag","maxHeight","maxWidth","src","width","justifyContent","hasRadius","ext","FilePdf","aria-label","File"],"mappings":";;;;;;;;;;;;;;;AAWA,MAAMA,QAAAA,GAAWC,uBAAOC,CAAAA,iBAAAA,CAAK;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBF,uBAAOG,CAAAA,gBAAAA,CAAI;;;;;;AAMvC,CAAC;AAED,MAAMC,mBAAAA,GAAsBJ,uBAAOG,CAAAA,gBAAAA,CAAI;;;;;AAKvC,CAAC;AAEYE,MAAAA,aAAAA,GAAgB,CAAC,EAAEC,KAAK,EAAwB,GAAA;AAC3D,IAAA,IAAIA,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEC,cAACT,CAAAA,mBAAAA,EAAAA;YAAoBU,MAAO,EAAA,MAAA;AAC1B,YAAA,QAAA,gBAAAD,cAACE,CAAAA,yBAAAA,EAAAA;AACCC,gBAAAA,GAAAA,EAAKC,8BAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BC,gBAAAA,IAAAA,EAAMD,MAAMC,IAAI;AAChBS,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUU,KAAK,CAAG,EAAA;AACzC,QAAA,qBACER,cAACP,CAAAA,mBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAO,cAACS,CAAAA,yBAAAA,EAAAA;AACCN,gBAAAA,GAAAA,EAAKC,8BAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BU,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,mBAAAA,CAAUY,KAAK,CAAG,EAAA;QACzC,MAAMC,QAAAA,GAAWP,8BAAeT,KAAO,EAAA,IAAA,CAAA;QACvC,IAAI,CAACgB,UAAU,OAAO,IAAA;;;QAItB,MAAMC,cAAAA,GAAiBjB,MAAMkB,WAAW,GACpCF,WACA,CAAC,EAAEA,SAAS,EAAEA,QAAAA,CAASd,QAAQ,CAAC,GAAA,CAAA,GAAO,MAAM,GAAI,CAAA,UAAU,EAAEF,KAAMmB,CAAAA,SAAS,CAAC,CAAC;AAElF,QAAA,qBACEd,cAACR,CAAAA,gBAAAA,EAAAA;YACCuB,GAAI,EAAA,KAAA;YACJC,SAAU,EAAA,MAAA;YACVC,QAAS,EAAA,MAAA;YACTC,GAAKN,EAAAA,cAAAA;AACLP,YAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;AAG1C;AAEA,IAAA,qBACEP,cAACZ,CAAAA,QAAAA,EAAAA;QAAS+B,KAAM,EAAA,MAAA;QAAOlB,MAAO,EAAA,MAAA;QAAOmB,cAAe,EAAA,QAAA;QAASC,SAAS,EAAA,IAAA;AACnE1B,QAAAA,QAAAA,EAAAA,KAAAA,CAAM2B,GAAG,EAAEzB,QAAS,CAAA,KAAA,CAAA,iBACnBG,cAACuB,CAAAA,aAAAA,EAAAA;AAAQC,YAAAA,YAAAA,EAAY7B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEY,KAAM,EAAA,MAAA;YAAOlB,MAAO,EAAA;2BAE9ED,cAACyB,CAAAA,UAAAA,EAAAA;AAAKD,YAAAA,YAAAA,EAAY7B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEY,KAAM,EAAA,MAAA;YAAOlB,MAAO,EAAA;;;AAInF;;;;"}
@@ -50,7 +50,8 @@ const CarouselAsset = ({ asset })=>{
50
50
  const assetUrl = createAssetUrl(asset, true);
51
51
  if (!assetUrl) return null;
52
52
  // Adding a param to the url to bust the cache and force the refresh of the image when replaced
53
- const cacheBustedUrl = `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;
53
+ // Only add updatedAt parameter if the URL is not signed to prevent signature invalidation
54
+ const cacheBustedUrl = asset.isUrlSigned ? assetUrl : `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;
54
55
  return /*#__PURE__*/ jsx(Box, {
55
56
  tag: "img",
56
57
  maxHeight: "100%",
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselAsset.mjs","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx"],"sourcesContent":["import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }: { asset: FileAsset }) => {\n if (asset.mime?.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)!}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Image)) {\n const assetUrl = createAssetUrl(asset, true);\n if (!assetUrl) return null;\n\n // Adding a param to the url to bust the cache and force the refresh of the image when replaced\n const cacheBustedUrl = `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;\n\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={cacheBustedUrl}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext?.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n"],"names":["DocAsset","styled","Flex","VideoPreviewWrapper","Box","AudioPreviewWrapper","CarouselAsset","asset","mime","includes","AssetType","Video","_jsx","height","VideoPreview","url","createAssetUrl","alt","alternativeText","name","Audio","AudioPreview","Image","assetUrl","cacheBustedUrl","updatedAt","tag","maxHeight","maxWidth","src","width","justifyContent","hasRadius","ext","FilePdf","aria-label","File"],"mappings":";;;;;;;;;;;;;AAWA,MAAMA,QAAAA,GAAWC,MAAOC,CAAAA,IAAAA,CAAK;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBF,MAAOG,CAAAA,GAAAA,CAAI;;;;;;AAMvC,CAAC;AAED,MAAMC,mBAAAA,GAAsBJ,MAAOG,CAAAA,GAAAA,CAAI;;;;;AAKvC,CAAC;AAEYE,MAAAA,aAAAA,GAAgB,CAAC,EAAEC,KAAK,EAAwB,GAAA;AAC3D,IAAA,IAAIA,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEC,GAACT,CAAAA,mBAAAA,EAAAA;YAAoBU,MAAO,EAAA,MAAA;AAC1B,YAAA,QAAA,gBAAAD,GAACE,CAAAA,YAAAA,EAAAA;AACCC,gBAAAA,GAAAA,EAAKC,eAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BC,gBAAAA,IAAAA,EAAMD,MAAMC,IAAI;AAChBS,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUU,KAAK,CAAG,EAAA;AACzC,QAAA,qBACER,GAACP,CAAAA,mBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAO,GAACS,CAAAA,YAAAA,EAAAA;AACCN,gBAAAA,GAAAA,EAAKC,eAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BU,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUY,KAAK,CAAG,EAAA;QACzC,MAAMC,QAAAA,GAAWP,eAAeT,KAAO,EAAA,IAAA,CAAA;QACvC,IAAI,CAACgB,UAAU,OAAO,IAAA;;AAGtB,QAAA,MAAMC,iBAAiB,CAAC,EAAED,QAAS,CAAA,EAAEA,SAASd,QAAQ,CAAC,GAAO,CAAA,GAAA,GAAA,GAAM,IAAI,UAAU,EAAEF,KAAMkB,CAAAA,SAAS,CAAC,CAAC;AAErG,QAAA,qBACEb,GAACR,CAAAA,GAAAA,EAAAA;YACCsB,GAAI,EAAA,KAAA;YACJC,SAAU,EAAA,MAAA;YACVC,QAAS,EAAA,MAAA;YACTC,GAAKL,EAAAA,cAAAA;AACLP,YAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;AAG1C;AAEA,IAAA,qBACEP,GAACZ,CAAAA,QAAAA,EAAAA;QAAS8B,KAAM,EAAA,MAAA;QAAOjB,MAAO,EAAA,MAAA;QAAOkB,cAAe,EAAA,QAAA;QAASC,SAAS,EAAA,IAAA;AACnEzB,QAAAA,QAAAA,EAAAA,KAAAA,CAAM0B,GAAG,EAAExB,QAAS,CAAA,KAAA,CAAA,iBACnBG,GAACsB,CAAAA,OAAAA,EAAAA;AAAQC,YAAAA,YAAAA,EAAY5B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEW,KAAM,EAAA,MAAA;YAAOjB,MAAO,EAAA;2BAE9ED,GAACwB,CAAAA,IAAAA,EAAAA;AAAKD,YAAAA,YAAAA,EAAY5B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEW,KAAM,EAAA,MAAA;YAAOjB,MAAO,EAAA;;;AAInF;;;;"}
1
+ {"version":3,"file":"CarouselAsset.mjs","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.tsx"],"sourcesContent":["import { Box, Flex } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../../constants';\nimport { createAssetUrl } from '../../../utils';\nimport { AudioPreview } from '../../AssetCard/AudioPreview';\nimport { VideoPreview } from '../../AssetCard/VideoPreview';\n\nimport type { File as FileAsset } from '../../../../../shared/contracts/files';\n\nconst DocAsset = styled(Flex)`\n background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%);\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n max-width: 100%;\n height: 124px;\n }\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n max-width: 100%;\n }\n`;\n\nexport const CarouselAsset = ({ asset }: { asset: FileAsset }) => {\n if (asset.mime?.includes(AssetType.Video)) {\n return (\n <VideoPreviewWrapper height=\"100%\">\n <VideoPreview\n url={createAssetUrl(asset, true)!}\n mime={asset.mime}\n alt={asset.alternativeText || asset.name}\n />\n </VideoPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Audio)) {\n return (\n <AudioPreviewWrapper>\n <AudioPreview\n url={createAssetUrl(asset, true)!}\n alt={asset.alternativeText || asset.name}\n />\n </AudioPreviewWrapper>\n );\n }\n\n if (asset.mime?.includes(AssetType.Image)) {\n const assetUrl = createAssetUrl(asset, true);\n if (!assetUrl) return null;\n\n // Adding a param to the url to bust the cache and force the refresh of the image when replaced\n // Only add updatedAt parameter if the URL is not signed to prevent signature invalidation\n const cacheBustedUrl = asset.isUrlSigned\n ? assetUrl\n : `${assetUrl}${assetUrl.includes('?') ? '&' : '?'}updatedAt=${asset.updatedAt}`;\n\n return (\n <Box\n tag=\"img\"\n maxHeight=\"100%\"\n maxWidth=\"100%\"\n src={cacheBustedUrl}\n alt={asset.alternativeText || asset.name}\n />\n );\n }\n\n return (\n <DocAsset width=\"100%\" height=\"100%\" justifyContent=\"center\" hasRadius>\n {asset.ext?.includes('pdf') ? (\n <FilePdf aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n ) : (\n <File aria-label={asset.alternativeText || asset.name} width=\"24px\" height=\"32px\" />\n )}\n </DocAsset>\n );\n};\n"],"names":["DocAsset","styled","Flex","VideoPreviewWrapper","Box","AudioPreviewWrapper","CarouselAsset","asset","mime","includes","AssetType","Video","_jsx","height","VideoPreview","url","createAssetUrl","alt","alternativeText","name","Audio","AudioPreview","Image","assetUrl","cacheBustedUrl","isUrlSigned","updatedAt","tag","maxHeight","maxWidth","src","width","justifyContent","hasRadius","ext","FilePdf","aria-label","File"],"mappings":";;;;;;;;;;;;;AAWA,MAAMA,QAAAA,GAAWC,MAAOC,CAAAA,IAAAA,CAAK;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBF,MAAOG,CAAAA,GAAAA,CAAI;;;;;;AAMvC,CAAC;AAED,MAAMC,mBAAAA,GAAsBJ,MAAOG,CAAAA,GAAAA,CAAI;;;;;AAKvC,CAAC;AAEYE,MAAAA,aAAAA,GAAgB,CAAC,EAAEC,KAAK,EAAwB,GAAA;AAC3D,IAAA,IAAIA,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEC,GAACT,CAAAA,mBAAAA,EAAAA;YAAoBU,MAAO,EAAA,MAAA;AAC1B,YAAA,QAAA,gBAAAD,GAACE,CAAAA,YAAAA,EAAAA;AACCC,gBAAAA,GAAAA,EAAKC,eAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BC,gBAAAA,IAAAA,EAAMD,MAAMC,IAAI;AAChBS,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUU,KAAK,CAAG,EAAA;AACzC,QAAA,qBACER,GAACP,CAAAA,mBAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAO,GAACS,CAAAA,YAAAA,EAAAA;AACCN,gBAAAA,GAAAA,EAAKC,eAAeT,KAAO,EAAA,IAAA,CAAA;AAC3BU,gBAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;;AAI5C;AAEA,IAAA,IAAIZ,MAAMC,IAAI,EAAEC,QAASC,CAAAA,SAAAA,CAAUY,KAAK,CAAG,EAAA;QACzC,MAAMC,QAAAA,GAAWP,eAAeT,KAAO,EAAA,IAAA,CAAA;QACvC,IAAI,CAACgB,UAAU,OAAO,IAAA;;;QAItB,MAAMC,cAAAA,GAAiBjB,MAAMkB,WAAW,GACpCF,WACA,CAAC,EAAEA,SAAS,EAAEA,QAAAA,CAASd,QAAQ,CAAC,GAAA,CAAA,GAAO,MAAM,GAAI,CAAA,UAAU,EAAEF,KAAMmB,CAAAA,SAAS,CAAC,CAAC;AAElF,QAAA,qBACEd,GAACR,CAAAA,GAAAA,EAAAA;YACCuB,GAAI,EAAA,KAAA;YACJC,SAAU,EAAA,MAAA;YACVC,QAAS,EAAA,MAAA;YACTC,GAAKN,EAAAA,cAAAA;AACLP,YAAAA,GAAAA,EAAKV,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY;;AAG1C;AAEA,IAAA,qBACEP,GAACZ,CAAAA,QAAAA,EAAAA;QAAS+B,KAAM,EAAA,MAAA;QAAOlB,MAAO,EAAA,MAAA;QAAOmB,cAAe,EAAA,QAAA;QAASC,SAAS,EAAA,IAAA;AACnE1B,QAAAA,QAAAA,EAAAA,KAAAA,CAAM2B,GAAG,EAAEzB,QAAS,CAAA,KAAA,CAAA,iBACnBG,GAACuB,CAAAA,OAAAA,EAAAA;AAAQC,YAAAA,YAAAA,EAAY7B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEY,KAAM,EAAA,MAAA;YAAOlB,MAAO,EAAA;2BAE9ED,GAACyB,CAAAA,IAAAA,EAAAA;AAAKD,YAAAA,YAAAA,EAAY7B,KAAMW,CAAAA,eAAe,IAAIX,KAAAA,CAAMY,IAAI;YAAEY,KAAM,EAAA,MAAA;YAAOlB,MAAO,EAAA;;;AAInF;;;;"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/upload";
6
- var version = "5.18.1";
6
+ var version = "5.20.0";
7
7
  var description = "Makes it easy to upload images and files to your Strapi Application.";
8
8
  var license = "SEE LICENSE IN LICENSE";
9
9
  var author = {
@@ -66,8 +66,8 @@ var dependencies = {
66
66
  "@mux/mux-player-react": "3.1.0",
67
67
  "@strapi/design-system": "2.0.0-rc.29",
68
68
  "@strapi/icons": "2.0.0-rc.29",
69
- "@strapi/provider-upload-local": "5.18.1",
70
- "@strapi/utils": "5.18.1",
69
+ "@strapi/provider-upload-local": "5.20.0",
70
+ "@strapi/utils": "5.20.0",
71
71
  "byte-size": "8.1.1",
72
72
  cropperjs: "1.6.1",
73
73
  "date-fns": "2.30.0",
@@ -86,11 +86,12 @@ var dependencies = {
86
86
  "react-redux": "8.1.3",
87
87
  "react-select": "5.8.0",
88
88
  sharp: "0.33.5",
89
- yup: "0.32.9"
89
+ yup: "0.32.9",
90
+ zod: "3.25.67"
90
91
  };
91
92
  var devDependencies = {
92
- "@strapi/admin": "5.18.1",
93
- "@strapi/types": "5.18.1",
93
+ "@strapi/admin": "5.20.0",
94
+ "@strapi/types": "5.20.0",
94
95
  "@testing-library/dom": "10.1.0",
95
96
  "@testing-library/react": "15.0.7",
96
97
  "@testing-library/user-event": "14.5.2",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/upload";
2
- var version = "5.18.1";
2
+ var version = "5.20.0";
3
3
  var description = "Makes it easy to upload images and files to your Strapi Application.";
4
4
  var license = "SEE LICENSE IN LICENSE";
5
5
  var author = {
@@ -62,8 +62,8 @@ var dependencies = {
62
62
  "@mux/mux-player-react": "3.1.0",
63
63
  "@strapi/design-system": "2.0.0-rc.29",
64
64
  "@strapi/icons": "2.0.0-rc.29",
65
- "@strapi/provider-upload-local": "5.18.1",
66
- "@strapi/utils": "5.18.1",
65
+ "@strapi/provider-upload-local": "5.20.0",
66
+ "@strapi/utils": "5.20.0",
67
67
  "byte-size": "8.1.1",
68
68
  cropperjs: "1.6.1",
69
69
  "date-fns": "2.30.0",
@@ -82,11 +82,12 @@ var dependencies = {
82
82
  "react-redux": "8.1.3",
83
83
  "react-select": "5.8.0",
84
84
  sharp: "0.33.5",
85
- yup: "0.32.9"
85
+ yup: "0.32.9",
86
+ zod: "3.25.67"
86
87
  };
87
88
  var devDependencies = {
88
- "@strapi/admin": "5.18.1",
89
- "@strapi/types": "5.18.1",
89
+ "@strapi/admin": "5.20.0",
90
+ "@strapi/types": "5.20.0",
90
91
  "@testing-library/dom": "10.1.0",
91
92
  "@testing-library/react": "15.0.7",
92
93
  "@testing-library/user-event": "14.5.2",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,29 +1,89 @@
1
1
  'use strict';
2
2
 
3
- const routes = {
4
- type: 'content-api',
5
- routes: [
6
- {
7
- method: 'POST',
8
- path: '/',
9
- handler: 'content-api.upload'
10
- },
11
- {
12
- method: 'GET',
13
- path: '/files',
14
- handler: 'content-api.find'
15
- },
16
- {
17
- method: 'GET',
18
- path: '/files/:id',
19
- handler: 'content-api.findOne'
20
- },
21
- {
22
- method: 'DELETE',
23
- path: '/files/:id',
24
- handler: 'content-api.destroy'
25
- }
26
- ]
3
+ var z = require('zod/v4');
4
+ var upload = require('./validation/upload.js');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
24
+
25
+ const routes = ()=>{
26
+ const validator = new upload.UploadRouteValidator(strapi);
27
+ return {
28
+ type: 'content-api',
29
+ routes: [
30
+ {
31
+ method: 'POST',
32
+ path: '/',
33
+ handler: 'content-api.upload',
34
+ request: {
35
+ query: {
36
+ id: validator.fileId.optional()
37
+ }
38
+ },
39
+ response: z__namespace.union([
40
+ validator.file,
41
+ validator.files
42
+ ])
43
+ },
44
+ {
45
+ method: 'GET',
46
+ path: '/files',
47
+ handler: 'content-api.find',
48
+ request: {
49
+ query: {
50
+ fields: validator.queryFields.optional(),
51
+ populate: validator.queryPopulate.optional(),
52
+ sort: validator.querySort.optional(),
53
+ pagination: validator.pagination.optional(),
54
+ filters: validator.filters.optional()
55
+ }
56
+ },
57
+ response: validator.files
58
+ },
59
+ {
60
+ method: 'GET',
61
+ path: '/files/:id',
62
+ handler: 'content-api.findOne',
63
+ request: {
64
+ params: {
65
+ id: validator.fileId
66
+ },
67
+ query: {
68
+ fields: validator.queryFields.optional(),
69
+ populate: validator.queryPopulate.optional()
70
+ }
71
+ },
72
+ response: validator.file
73
+ },
74
+ {
75
+ method: 'DELETE',
76
+ path: '/files/:id',
77
+ handler: 'content-api.destroy',
78
+ request: {
79
+ params: {
80
+ id: validator.fileId
81
+ }
82
+ },
83
+ response: validator.file
84
+ }
85
+ ]
86
+ };
27
87
  };
28
88
 
29
89
  exports.routes = routes;
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["export const routes = {\n type: 'content-api',\n routes: [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n },\n ],\n};\n"],"names":["routes","type","method","path","handler"],"mappings":";;MAAaA,MAAS,GAAA;IACpBC,IAAM,EAAA,aAAA;IACND,MAAQ,EAAA;AACN,QAAA;YACEE,MAAQ,EAAA,MAAA;YACRC,IAAM,EAAA,GAAA;YACNC,OAAS,EAAA;AACX,SAAA;AACA,QAAA;YACEF,MAAQ,EAAA,KAAA;YACRC,IAAM,EAAA,QAAA;YACNC,OAAS,EAAA;AACX,SAAA;AACA,QAAA;YACEF,MAAQ,EAAA,KAAA;YACRC,IAAM,EAAA,YAAA;YACNC,OAAS,EAAA;AACX,SAAA;AACA,QAAA;YACEF,MAAQ,EAAA,QAAA;YACRC,IAAM,EAAA,YAAA;YACNC,OAAS,EAAA;AACX;AACD;AACH;;;;"}
1
+ {"version":3,"file":"content-api.js","sources":["../../../server/src/routes/content-api.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport * as z from 'zod/v4';\nimport { UploadRouteValidator } from './validation';\n\nexport const routes = (): Core.RouterInput => {\n const validator = new UploadRouteValidator(strapi);\n\n return {\n type: 'content-api',\n routes: [\n {\n method: 'POST',\n path: '/',\n handler: 'content-api.upload',\n request: {\n query: { id: validator.fileId.optional() },\n // Note: multipart/form-data is handled by Koa middleware, not Zod\n },\n response: z.union([validator.file, validator.files]),\n },\n {\n method: 'GET',\n path: '/files',\n handler: 'content-api.find',\n request: {\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n sort: validator.querySort.optional(),\n pagination: validator.pagination.optional(),\n filters: validator.filters.optional(),\n },\n },\n response: validator.files,\n },\n {\n method: 'GET',\n path: '/files/:id',\n handler: 'content-api.findOne',\n request: {\n params: { id: validator.fileId },\n query: {\n fields: validator.queryFields.optional(),\n populate: validator.queryPopulate.optional(),\n },\n },\n response: validator.file,\n },\n {\n method: 'DELETE',\n path: '/files/:id',\n handler: 'content-api.destroy',\n request: {\n params: { id: validator.fileId },\n },\n response: validator.file,\n },\n ],\n };\n};\n"],"names":["routes","validator","UploadRouteValidator","strapi","type","method","path","handler","request","query","id","fileId","optional","response","z","union","file","files","fields","queryFields","populate","queryPopulate","sort","querySort","pagination","filters","params"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;MAIaA,MAAS,GAAA,IAAA;IACpB,MAAMC,SAAAA,GAAY,IAAIC,2BAAqBC,CAAAA,MAAAA,CAAAA;IAE3C,OAAO;QACLC,IAAM,EAAA,aAAA;QACNJ,MAAQ,EAAA;AACN,YAAA;gBACEK,MAAQ,EAAA,MAAA;gBACRC,IAAM,EAAA,GAAA;gBACNC,OAAS,EAAA,oBAAA;gBACTC,OAAS,EAAA;oBACPC,KAAO,EAAA;wBAAEC,EAAIT,EAAAA,SAAAA,CAAUU,MAAM,CAACC,QAAQ;AAAG;AAE3C,iBAAA;gBACAC,QAAUC,EAAAA,YAAAA,CAAEC,KAAK,CAAC;AAACd,oBAAAA,SAAAA,CAAUe,IAAI;AAAEf,oBAAAA,SAAAA,CAAUgB;AAAM,iBAAA;AACrD,aAAA;AACA,YAAA;gBACEZ,MAAQ,EAAA,KAAA;gBACRC,IAAM,EAAA,QAAA;gBACNC,OAAS,EAAA,kBAAA;gBACTC,OAAS,EAAA;oBACPC,KAAO,EAAA;wBACLS,MAAQjB,EAAAA,SAAAA,CAAUkB,WAAW,CAACP,QAAQ,EAAA;wBACtCQ,QAAUnB,EAAAA,SAAAA,CAAUoB,aAAa,CAACT,QAAQ,EAAA;wBAC1CU,IAAMrB,EAAAA,SAAAA,CAAUsB,SAAS,CAACX,QAAQ,EAAA;wBAClCY,UAAYvB,EAAAA,SAAAA,CAAUuB,UAAU,CAACZ,QAAQ,EAAA;wBACzCa,OAASxB,EAAAA,SAAAA,CAAUwB,OAAO,CAACb,QAAQ;AACrC;AACF,iBAAA;AACAC,gBAAAA,QAAAA,EAAUZ,UAAUgB;AACtB,aAAA;AACA,YAAA;gBACEZ,MAAQ,EAAA,KAAA;gBACRC,IAAM,EAAA,YAAA;gBACNC,OAAS,EAAA,qBAAA;gBACTC,OAAS,EAAA;oBACPkB,MAAQ,EAAA;AAAEhB,wBAAAA,EAAAA,EAAIT,UAAUU;AAAO,qBAAA;oBAC/BF,KAAO,EAAA;wBACLS,MAAQjB,EAAAA,SAAAA,CAAUkB,WAAW,CAACP,QAAQ,EAAA;wBACtCQ,QAAUnB,EAAAA,SAAAA,CAAUoB,aAAa,CAACT,QAAQ;AAC5C;AACF,iBAAA;AACAC,gBAAAA,QAAAA,EAAUZ,UAAUe;AACtB,aAAA;AACA,YAAA;gBACEX,MAAQ,EAAA,QAAA;gBACRC,IAAM,EAAA,YAAA;gBACNC,OAAS,EAAA,qBAAA;gBACTC,OAAS,EAAA;oBACPkB,MAAQ,EAAA;AAAEhB,wBAAAA,EAAAA,EAAIT,UAAUU;AAAO;AACjC,iBAAA;AACAE,gBAAAA,QAAAA,EAAUZ,UAAUe;AACtB;AACD;AACH,KAAA;AACF;;;;"}
@@ -1,27 +1,68 @@
1
- const routes = {
2
- type: 'content-api',
3
- routes: [
4
- {
5
- method: 'POST',
6
- path: '/',
7
- handler: 'content-api.upload'
8
- },
9
- {
10
- method: 'GET',
11
- path: '/files',
12
- handler: 'content-api.find'
13
- },
14
- {
15
- method: 'GET',
16
- path: '/files/:id',
17
- handler: 'content-api.findOne'
18
- },
19
- {
20
- method: 'DELETE',
21
- path: '/files/:id',
22
- handler: 'content-api.destroy'
23
- }
24
- ]
1
+ import * as z from 'zod/v4';
2
+ import { UploadRouteValidator } from './validation/upload.mjs';
3
+
4
+ const routes = ()=>{
5
+ const validator = new UploadRouteValidator(strapi);
6
+ return {
7
+ type: 'content-api',
8
+ routes: [
9
+ {
10
+ method: 'POST',
11
+ path: '/',
12
+ handler: 'content-api.upload',
13
+ request: {
14
+ query: {
15
+ id: validator.fileId.optional()
16
+ }
17
+ },
18
+ response: z.union([
19
+ validator.file,
20
+ validator.files
21
+ ])
22
+ },
23
+ {
24
+ method: 'GET',
25
+ path: '/files',
26
+ handler: 'content-api.find',
27
+ request: {
28
+ query: {
29
+ fields: validator.queryFields.optional(),
30
+ populate: validator.queryPopulate.optional(),
31
+ sort: validator.querySort.optional(),
32
+ pagination: validator.pagination.optional(),
33
+ filters: validator.filters.optional()
34
+ }
35
+ },
36
+ response: validator.files
37
+ },
38
+ {
39
+ method: 'GET',
40
+ path: '/files/:id',
41
+ handler: 'content-api.findOne',
42
+ request: {
43
+ params: {
44
+ id: validator.fileId
45
+ },
46
+ query: {
47
+ fields: validator.queryFields.optional(),
48
+ populate: validator.queryPopulate.optional()
49
+ }
50
+ },
51
+ response: validator.file
52
+ },
53
+ {
54
+ method: 'DELETE',
55
+ path: '/files/:id',
56
+ handler: 'content-api.destroy',
57
+ request: {
58
+ params: {
59
+ id: validator.fileId
60
+ }
61
+ },
62
+ response: validator.file
63
+ }
64
+ ]
65
+ };
25
66
  };
26
67
 
27
68
  export { routes };