@strapi/upload 5.19.0 → 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.
@@ -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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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/upload";
6
- var version = "5.19.0";
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.19.0",
70
- "@strapi/utils": "5.19.0",
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.19.0",
93
- "@strapi/types": "5.19.0",
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.19.0";
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.19.0",
66
- "@strapi/utils": "5.19.0",
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.19.0",
89
- "@strapi/types": "5.19.0",
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.mjs","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.mjs","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,oBAAqBC,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,CAAAA,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;;;;"}
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@strapi/utils');
4
+ var z = require('zod/v4');
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
+ /**
26
+ * UploadRouteValidator provides validation for upload/file routes.
27
+ *
28
+ * Extends the AbstractRouteValidator to inherit common query parameter validation
29
+ * while adding file-specific validation schemas.
30
+ */ class UploadRouteValidator extends utils.AbstractRouteValidator {
31
+ /**
32
+ * File schema for upload responses
33
+ * Defines the structure of a file object returned by the upload API
34
+ */ get file() {
35
+ return z__namespace.object({
36
+ id: this.fileId,
37
+ documentId: z__namespace.uuid(),
38
+ name: z__namespace.string(),
39
+ alternativeText: z__namespace.string().nullable().optional(),
40
+ caption: z__namespace.string().nullable().optional(),
41
+ width: z__namespace.number().int().optional(),
42
+ height: z__namespace.number().int().optional(),
43
+ formats: z__namespace.record(z__namespace.string(), z__namespace.unknown()).optional(),
44
+ hash: z__namespace.string(),
45
+ ext: z__namespace.string().optional(),
46
+ mime: z__namespace.string(),
47
+ size: z__namespace.number(),
48
+ url: z__namespace.string(),
49
+ previewUrl: z__namespace.string().nullable().optional(),
50
+ folder: z__namespace.number().optional(),
51
+ folderPath: z__namespace.string(),
52
+ provider: z__namespace.string(),
53
+ provider_metadata: z__namespace.record(z__namespace.string(), z__namespace.unknown()).nullable().optional(),
54
+ createdAt: z__namespace.string(),
55
+ updatedAt: z__namespace.string(),
56
+ createdBy: z__namespace.number().optional(),
57
+ updatedBy: z__namespace.number().optional()
58
+ });
59
+ }
60
+ /**
61
+ * Array of files schema
62
+ */ get files() {
63
+ return z__namespace.array(this.file);
64
+ }
65
+ /**
66
+ * File ID parameter validation
67
+ */ get fileId() {
68
+ return z__namespace.number().int().positive();
69
+ }
70
+ /**
71
+ * Upload request body schema for single file uploads
72
+ */ get uploadBody() {
73
+ return z__namespace.object({
74
+ fileInfo: z__namespace.object({
75
+ name: z__namespace.string().optional(),
76
+ alternativeText: z__namespace.string().optional(),
77
+ caption: z__namespace.string().optional()
78
+ }).optional()
79
+ });
80
+ }
81
+ /**
82
+ * Upload request body schema for multiple file uploads
83
+ */ get multiUploadBody() {
84
+ return z__namespace.object({
85
+ fileInfo: z__namespace.array(z__namespace.object({
86
+ name: z__namespace.string().optional(),
87
+ alternativeText: z__namespace.string().optional(),
88
+ caption: z__namespace.string().optional()
89
+ })).optional()
90
+ });
91
+ }
92
+ constructor(strapi){
93
+ super();
94
+ this._strapi = strapi;
95
+ }
96
+ }
97
+
98
+ exports.UploadRouteValidator = UploadRouteValidator;
99
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","positive","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { AbstractRouteValidator } from '@strapi/utils';
2
+ import * as z from 'zod/v4';
3
+
4
+ /**
5
+ * UploadRouteValidator provides validation for upload/file routes.
6
+ *
7
+ * Extends the AbstractRouteValidator to inherit common query parameter validation
8
+ * while adding file-specific validation schemas.
9
+ */ class UploadRouteValidator extends AbstractRouteValidator {
10
+ /**
11
+ * File schema for upload responses
12
+ * Defines the structure of a file object returned by the upload API
13
+ */ get file() {
14
+ return z.object({
15
+ id: this.fileId,
16
+ documentId: z.uuid(),
17
+ name: z.string(),
18
+ alternativeText: z.string().nullable().optional(),
19
+ caption: z.string().nullable().optional(),
20
+ width: z.number().int().optional(),
21
+ height: z.number().int().optional(),
22
+ formats: z.record(z.string(), z.unknown()).optional(),
23
+ hash: z.string(),
24
+ ext: z.string().optional(),
25
+ mime: z.string(),
26
+ size: z.number(),
27
+ url: z.string(),
28
+ previewUrl: z.string().nullable().optional(),
29
+ folder: z.number().optional(),
30
+ folderPath: z.string(),
31
+ provider: z.string(),
32
+ provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),
33
+ createdAt: z.string(),
34
+ updatedAt: z.string(),
35
+ createdBy: z.number().optional(),
36
+ updatedBy: z.number().optional()
37
+ });
38
+ }
39
+ /**
40
+ * Array of files schema
41
+ */ get files() {
42
+ return z.array(this.file);
43
+ }
44
+ /**
45
+ * File ID parameter validation
46
+ */ get fileId() {
47
+ return z.number().int().positive();
48
+ }
49
+ /**
50
+ * Upload request body schema for single file uploads
51
+ */ get uploadBody() {
52
+ return z.object({
53
+ fileInfo: z.object({
54
+ name: z.string().optional(),
55
+ alternativeText: z.string().optional(),
56
+ caption: z.string().optional()
57
+ }).optional()
58
+ });
59
+ }
60
+ /**
61
+ * Upload request body schema for multiple file uploads
62
+ */ get multiUploadBody() {
63
+ return z.object({
64
+ fileInfo: z.array(z.object({
65
+ name: z.string().optional(),
66
+ alternativeText: z.string().optional(),
67
+ caption: z.string().optional()
68
+ })).optional()
69
+ });
70
+ }
71
+ constructor(strapi){
72
+ super();
73
+ this._strapi = strapi;
74
+ }
75
+ }
76
+
77
+ export { UploadRouteValidator };
78
+ //# sourceMappingURL=upload.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.mjs","sources":["../../../../server/src/routes/validation/upload.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { AbstractRouteValidator, type QueryParam } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\nexport type FileQueryParam = QueryParam;\n\n/**\n * UploadRouteValidator provides validation for upload/file routes.\n *\n * Extends the AbstractRouteValidator to inherit common query parameter validation\n * while adding file-specific validation schemas.\n */\nexport class UploadRouteValidator extends AbstractRouteValidator {\n protected readonly _strapi: Core.Strapi;\n\n public constructor(strapi: Core.Strapi) {\n super();\n this._strapi = strapi;\n }\n\n /**\n * File schema for upload responses\n * Defines the structure of a file object returned by the upload API\n */\n get file() {\n return z.object({\n id: this.fileId,\n documentId: z.uuid(),\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n caption: z.string().nullable().optional(),\n width: z.number().int().optional(),\n height: z.number().int().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n url: z.string(),\n previewUrl: z.string().nullable().optional(),\n folder: z.number().optional(),\n folderPath: z.string(),\n provider: z.string(),\n provider_metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n createdBy: z.number().optional(),\n updatedBy: z.number().optional(),\n });\n }\n\n /**\n * Array of files schema\n */\n get files() {\n return z.array(this.file);\n }\n\n /**\n * File ID parameter validation\n */\n get fileId() {\n return z.number().int().positive();\n }\n\n /**\n * Upload request body schema for single file uploads\n */\n get uploadBody() {\n return z.object({\n fileInfo: z\n .object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n .optional(),\n });\n }\n\n /**\n * Upload request body schema for multiple file uploads\n */\n get multiUploadBody() {\n return z.object({\n fileInfo: z\n .array(\n z.object({\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n })\n )\n .optional(),\n });\n }\n\n // Note: queryParams() method is inherited from AbstractRouteValidator\n // and provides validation for ['fields', 'populate', 'sort', 'pagination', 'filters']\n}\n"],"names":["UploadRouteValidator","AbstractRouteValidator","file","z","object","id","fileId","documentId","uuid","name","string","alternativeText","nullable","optional","caption","width","number","int","height","formats","record","unknown","hash","ext","mime","size","url","previewUrl","folder","folderPath","provider","provider_metadata","createdAt","updatedAt","createdBy","updatedBy","files","array","positive","uploadBody","fileInfo","multiUploadBody","strapi","_strapi"],"mappings":"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"}
@@ -30,14 +30,7 @@ declare const _default: () => {
30
30
  };
31
31
  }[];
32
32
  };
33
- 'content-api': {
34
- type: string;
35
- routes: {
36
- method: string;
37
- path: string;
38
- handler: string;
39
- }[];
40
- };
33
+ 'content-api': () => import("@strapi/types/dist/core").RouterInput;
41
34
  viewConfiguration: {
42
35
  type: string;
43
36
  routes: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOxC,wBAQG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOxC,wBAQG"}
@@ -1,9 +1,3 @@
1
- export declare const routes: {
2
- type: string;
3
- routes: {
4
- method: string;
5
- path: string;
6
- handler: string;
7
- }[];
8
- };
1
+ import type { Core } from '@strapi/types';
2
+ export declare const routes: () => Core.RouterInput;
9
3
  //# sourceMappingURL=content-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;CAwBlB,CAAC"}
1
+ {"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,eAAO,MAAM,MAAM,QAAO,KAAK,WAuD9B,CAAC"}
@@ -15,14 +15,7 @@ export declare const routes: {
15
15
  };
16
16
  }[];
17
17
  };
18
- 'content-api': {
19
- type: string;
20
- routes: {
21
- method: string;
22
- path: string;
23
- handler: string;
24
- }[];
25
- };
18
+ 'content-api': () => import("@strapi/types/dist/core").RouterInput;
26
19
  viewConfiguration: {
27
20
  type: string;
28
21
  routes: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIlB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIlB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { UploadRouteValidator } from './upload';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/routes/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,94 @@
1
+ import type { Core } from '@strapi/types';
2
+ import { AbstractRouteValidator, type QueryParam } from '@strapi/utils';
3
+ import * as z from 'zod/v4';
4
+ export type FileQueryParam = QueryParam;
5
+ /**
6
+ * UploadRouteValidator provides validation for upload/file routes.
7
+ *
8
+ * Extends the AbstractRouteValidator to inherit common query parameter validation
9
+ * while adding file-specific validation schemas.
10
+ */
11
+ export declare class UploadRouteValidator extends AbstractRouteValidator {
12
+ protected readonly _strapi: Core.Strapi;
13
+ constructor(strapi: Core.Strapi);
14
+ /**
15
+ * File schema for upload responses
16
+ * Defines the structure of a file object returned by the upload API
17
+ */
18
+ get file(): z.ZodObject<{
19
+ id: z.ZodNumber;
20
+ documentId: z.ZodUUID;
21
+ name: z.ZodString;
22
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
+ width: z.ZodOptional<z.ZodNumber>;
25
+ height: z.ZodOptional<z.ZodNumber>;
26
+ formats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
27
+ hash: z.ZodString;
28
+ ext: z.ZodOptional<z.ZodString>;
29
+ mime: z.ZodString;
30
+ size: z.ZodNumber;
31
+ url: z.ZodString;
32
+ previewUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ folder: z.ZodOptional<z.ZodNumber>;
34
+ folderPath: z.ZodString;
35
+ provider: z.ZodString;
36
+ provider_metadata: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
37
+ createdAt: z.ZodString;
38
+ updatedAt: z.ZodString;
39
+ createdBy: z.ZodOptional<z.ZodNumber>;
40
+ updatedBy: z.ZodOptional<z.ZodNumber>;
41
+ }, z.core.$strip>;
42
+ /**
43
+ * Array of files schema
44
+ */
45
+ get files(): z.ZodArray<z.ZodObject<{
46
+ id: z.ZodNumber;
47
+ documentId: z.ZodUUID;
48
+ name: z.ZodString;
49
+ alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
50
+ caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
+ width: z.ZodOptional<z.ZodNumber>;
52
+ height: z.ZodOptional<z.ZodNumber>;
53
+ formats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
54
+ hash: z.ZodString;
55
+ ext: z.ZodOptional<z.ZodString>;
56
+ mime: z.ZodString;
57
+ size: z.ZodNumber;
58
+ url: z.ZodString;
59
+ previewUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
60
+ folder: z.ZodOptional<z.ZodNumber>;
61
+ folderPath: z.ZodString;
62
+ provider: z.ZodString;
63
+ provider_metadata: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
64
+ createdAt: z.ZodString;
65
+ updatedAt: z.ZodString;
66
+ createdBy: z.ZodOptional<z.ZodNumber>;
67
+ updatedBy: z.ZodOptional<z.ZodNumber>;
68
+ }, z.core.$strip>>;
69
+ /**
70
+ * File ID parameter validation
71
+ */
72
+ get fileId(): z.ZodNumber;
73
+ /**
74
+ * Upload request body schema for single file uploads
75
+ */
76
+ get uploadBody(): z.ZodObject<{
77
+ fileInfo: z.ZodOptional<z.ZodObject<{
78
+ name: z.ZodOptional<z.ZodString>;
79
+ alternativeText: z.ZodOptional<z.ZodString>;
80
+ caption: z.ZodOptional<z.ZodString>;
81
+ }, z.core.$strip>>;
82
+ }, z.core.$strip>;
83
+ /**
84
+ * Upload request body schema for multiple file uploads
85
+ */
86
+ get multiUploadBody(): z.ZodObject<{
87
+ fileInfo: z.ZodOptional<z.ZodArray<z.ZodObject<{
88
+ name: z.ZodOptional<z.ZodString>;
89
+ alternativeText: z.ZodOptional<z.ZodString>;
90
+ caption: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strip>>>;
92
+ }, z.core.$strip>;
93
+ }
94
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../../server/src/routes/validation/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC;AAExC;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;gBAErB,MAAM,EAAE,IAAI,CAAC,MAAM;IAKtC;;;OAGG;IACH,IAAI,IAAI;;;;;;;;;;;;;;;;;;;;;;;sBAyBP;IAED;;OAEG;IACH,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;;uBAER;IAED;;OAEG;IACH,IAAI,MAAM,gBAET;IAED;;OAEG;IACH,IAAI,UAAU;;;;;;sBAUb;IAED;;OAEG;IACH,IAAI,eAAe;;;;;;sBAYlB;CAIF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upload",
3
- "version": "5.19.0",
3
+ "version": "5.20.0",
4
4
  "description": "Makes it easy to upload images and files to your Strapi Application.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
@@ -63,8 +63,8 @@
63
63
  "@mux/mux-player-react": "3.1.0",
64
64
  "@strapi/design-system": "2.0.0-rc.29",
65
65
  "@strapi/icons": "2.0.0-rc.29",
66
- "@strapi/provider-upload-local": "5.19.0",
67
- "@strapi/utils": "5.19.0",
66
+ "@strapi/provider-upload-local": "5.20.0",
67
+ "@strapi/utils": "5.20.0",
68
68
  "byte-size": "8.1.1",
69
69
  "cropperjs": "1.6.1",
70
70
  "date-fns": "2.30.0",
@@ -83,11 +83,12 @@
83
83
  "react-redux": "8.1.3",
84
84
  "react-select": "5.8.0",
85
85
  "sharp": "0.33.5",
86
- "yup": "0.32.9"
86
+ "yup": "0.32.9",
87
+ "zod": "3.25.67"
87
88
  },
88
89
  "devDependencies": {
89
- "@strapi/admin": "5.19.0",
90
- "@strapi/types": "5.19.0",
90
+ "@strapi/admin": "5.20.0",
91
+ "@strapi/types": "5.20.0",
91
92
  "@testing-library/dom": "10.1.0",
92
93
  "@testing-library/react": "15.0.7",
93
94
  "@testing-library/user-event": "14.5.2",