@strapi/upload 5.31.2 → 5.32.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 (55) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +6 -3
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs +6 -3
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  5. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +3 -0
  6. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  7. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -0
  8. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  9. package/dist/admin/components/AssetGridList/AssetGridList.js +3 -0
  10. package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
  11. package/dist/admin/components/AssetGridList/AssetGridList.mjs +3 -0
  12. package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
  13. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +0 -1
  14. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  15. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +0 -1
  16. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  17. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +3 -1
  18. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  19. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +3 -1
  20. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  21. package/dist/admin/components/UploadProgress/UploadProgress.js +1 -0
  22. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  23. package/dist/admin/components/UploadProgress/UploadProgress.mjs +1 -0
  24. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  25. package/dist/admin/hooks/useTracking.js +2 -1
  26. package/dist/admin/hooks/useTracking.js.map +1 -1
  27. package/dist/admin/hooks/useTracking.mjs +2 -1
  28. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  29. package/dist/admin/package.json.js +10 -10
  30. package/dist/admin/package.json.mjs +10 -10
  31. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +4 -4
  32. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  33. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +4 -4
  34. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  35. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +3 -0
  36. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  37. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +3 -0
  38. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  39. package/dist/admin/pages/SettingsPage/SettingsPage.js +5 -5
  40. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  41. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +5 -5
  42. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  43. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +1 -1
  44. package/dist/server/content-types/file.js +4 -4
  45. package/dist/server/content-types/file.js.map +1 -1
  46. package/dist/server/content-types/file.mjs +4 -4
  47. package/dist/server/content-types/file.mjs.map +1 -1
  48. package/dist/server/services/ai-metadata.js +1 -1
  49. package/dist/server/services/ai-metadata.js.map +1 -1
  50. package/dist/server/services/ai-metadata.mjs +1 -1
  51. package/dist/server/services/ai-metadata.mjs.map +1 -1
  52. package/dist/server/src/content-types/file.d.ts +4 -4
  53. package/dist/server/src/content-types/index.d.ts +4 -4
  54. package/dist/server/src/index.d.ts +4 -4
  55. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sources":["../../../server/src/content-types/file.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\n\nimport { FOLDER_MODEL_UID } from '../constants';\n\nexport default {\n schema: {\n collectionName: 'files',\n info: {\n singularName: 'file',\n pluralName: 'files',\n displayName: 'File',\n description: '',\n },\n options: {},\n pluginOptions: {\n 'content-manager': {\n visible: false,\n },\n 'content-type-builder': {\n visible: false,\n },\n },\n attributes: {\n name: {\n type: 'string',\n configurable: false,\n required: true,\n },\n alternativeText: {\n type: 'string',\n configurable: false,\n },\n caption: {\n type: 'string',\n configurable: false,\n },\n width: {\n type: 'integer',\n configurable: false,\n },\n height: {\n type: 'integer',\n configurable: false,\n },\n formats: {\n type: 'json',\n configurable: false,\n },\n hash: {\n type: 'string',\n configurable: false,\n required: true,\n },\n ext: {\n type: 'string',\n configurable: false,\n },\n mime: {\n type: 'string',\n configurable: false,\n required: true,\n },\n size: {\n type: 'decimal',\n configurable: false,\n required: true,\n },\n url: {\n type: 'string',\n configurable: false,\n required: true,\n },\n previewUrl: {\n type: 'string',\n configurable: false,\n },\n provider: {\n type: 'string',\n configurable: false,\n required: true,\n },\n provider_metadata: {\n type: 'json',\n configurable: false,\n },\n related: {\n type: 'relation',\n relation: 'morphToMany',\n configurable: false,\n },\n folder: {\n type: 'relation',\n relation: 'manyToOne',\n target: FOLDER_MODEL_UID,\n inversedBy: 'files',\n private: true,\n },\n folderPath: {\n type: 'string',\n minLength: 1,\n required: true,\n private: true,\n searchable: false,\n },\n },\n // experimental feature:\n indexes: [\n {\n name: 'upload_files_folder_path_index',\n columns: ['folder_path'],\n type: null,\n },\n {\n name: `upload_files_created_at_index`,\n columns: ['created_at'],\n type: null,\n },\n {\n name: `upload_files_updated_at_index`,\n columns: ['updated_at'],\n type: null,\n },\n {\n name: `upload_files_name_index`,\n columns: ['name'],\n type: null,\n },\n {\n name: `upload_files_size_index`,\n columns: ['size'],\n type: null,\n },\n {\n name: `upload_files_ext_index`,\n columns: ['ext'],\n type: null,\n },\n ],\n } satisfies Partial<Struct.CollectionTypeSchema>,\n};\n"],"names":["schema","collectionName","info","singularName","pluralName","displayName","description","options","pluginOptions","visible","attributes","name","type","configurable","required","alternativeText","caption","width","height","formats","hash","ext","mime","size","url","previewUrl","provider","provider_metadata","related","relation","folder","target","FOLDER_MODEL_UID","inversedBy","private","folderPath","minLength","searchable","indexes","columns"],"mappings":"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"}
1
+ {"version":3,"file":"file.js","sources":["../../../server/src/content-types/file.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\n\nimport { FOLDER_MODEL_UID } from '../constants';\n\nexport default {\n schema: {\n collectionName: 'files',\n info: {\n singularName: 'file',\n pluralName: 'files',\n displayName: 'File',\n description: '',\n },\n options: {},\n pluginOptions: {\n 'content-manager': {\n visible: false,\n },\n 'content-type-builder': {\n visible: false,\n },\n },\n attributes: {\n name: {\n type: 'string',\n configurable: false,\n required: true,\n },\n alternativeText: {\n type: 'text',\n configurable: false,\n },\n caption: {\n type: 'text',\n configurable: false,\n },\n width: {\n type: 'integer',\n configurable: false,\n },\n height: {\n type: 'integer',\n configurable: false,\n },\n formats: {\n type: 'json',\n configurable: false,\n },\n hash: {\n type: 'string',\n configurable: false,\n required: true,\n },\n ext: {\n type: 'string',\n configurable: false,\n },\n mime: {\n type: 'string',\n configurable: false,\n required: true,\n },\n size: {\n type: 'decimal',\n configurable: false,\n required: true,\n },\n url: {\n type: 'text',\n configurable: false,\n required: true,\n },\n previewUrl: {\n type: 'text',\n configurable: false,\n },\n provider: {\n type: 'string',\n configurable: false,\n required: true,\n },\n provider_metadata: {\n type: 'json',\n configurable: false,\n },\n related: {\n type: 'relation',\n relation: 'morphToMany',\n configurable: false,\n },\n folder: {\n type: 'relation',\n relation: 'manyToOne',\n target: FOLDER_MODEL_UID,\n inversedBy: 'files',\n private: true,\n },\n folderPath: {\n type: 'string',\n minLength: 1,\n required: true,\n private: true,\n searchable: false,\n },\n },\n // experimental feature:\n indexes: [\n {\n name: 'upload_files_folder_path_index',\n columns: ['folder_path'],\n type: null,\n },\n {\n name: `upload_files_created_at_index`,\n columns: ['created_at'],\n type: null,\n },\n {\n name: `upload_files_updated_at_index`,\n columns: ['updated_at'],\n type: null,\n },\n {\n name: `upload_files_name_index`,\n columns: ['name'],\n type: null,\n },\n {\n name: `upload_files_size_index`,\n columns: ['size'],\n type: null,\n },\n {\n name: `upload_files_ext_index`,\n columns: ['ext'],\n type: null,\n },\n ],\n } satisfies Partial<Struct.CollectionTypeSchema>,\n};\n"],"names":["schema","collectionName","info","singularName","pluralName","displayName","description","options","pluginOptions","visible","attributes","name","type","configurable","required","alternativeText","caption","width","height","formats","hash","ext","mime","size","url","previewUrl","provider","provider_metadata","related","relation","folder","target","FOLDER_MODEL_UID","inversedBy","private","folderPath","minLength","searchable","indexes","columns"],"mappings":"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"}
@@ -25,11 +25,11 @@ var file = {
25
25
  required: true
26
26
  },
27
27
  alternativeText: {
28
- type: 'string',
28
+ type: 'text',
29
29
  configurable: false
30
30
  },
31
31
  caption: {
32
- type: 'string',
32
+ type: 'text',
33
33
  configurable: false
34
34
  },
35
35
  width: {
@@ -64,12 +64,12 @@ var file = {
64
64
  required: true
65
65
  },
66
66
  url: {
67
- type: 'string',
67
+ type: 'text',
68
68
  configurable: false,
69
69
  required: true
70
70
  },
71
71
  previewUrl: {
72
- type: 'string',
72
+ type: 'text',
73
73
  configurable: false
74
74
  },
75
75
  provider: {
@@ -1 +1 @@
1
- {"version":3,"file":"file.mjs","sources":["../../../server/src/content-types/file.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\n\nimport { FOLDER_MODEL_UID } from '../constants';\n\nexport default {\n schema: {\n collectionName: 'files',\n info: {\n singularName: 'file',\n pluralName: 'files',\n displayName: 'File',\n description: '',\n },\n options: {},\n pluginOptions: {\n 'content-manager': {\n visible: false,\n },\n 'content-type-builder': {\n visible: false,\n },\n },\n attributes: {\n name: {\n type: 'string',\n configurable: false,\n required: true,\n },\n alternativeText: {\n type: 'string',\n configurable: false,\n },\n caption: {\n type: 'string',\n configurable: false,\n },\n width: {\n type: 'integer',\n configurable: false,\n },\n height: {\n type: 'integer',\n configurable: false,\n },\n formats: {\n type: 'json',\n configurable: false,\n },\n hash: {\n type: 'string',\n configurable: false,\n required: true,\n },\n ext: {\n type: 'string',\n configurable: false,\n },\n mime: {\n type: 'string',\n configurable: false,\n required: true,\n },\n size: {\n type: 'decimal',\n configurable: false,\n required: true,\n },\n url: {\n type: 'string',\n configurable: false,\n required: true,\n },\n previewUrl: {\n type: 'string',\n configurable: false,\n },\n provider: {\n type: 'string',\n configurable: false,\n required: true,\n },\n provider_metadata: {\n type: 'json',\n configurable: false,\n },\n related: {\n type: 'relation',\n relation: 'morphToMany',\n configurable: false,\n },\n folder: {\n type: 'relation',\n relation: 'manyToOne',\n target: FOLDER_MODEL_UID,\n inversedBy: 'files',\n private: true,\n },\n folderPath: {\n type: 'string',\n minLength: 1,\n required: true,\n private: true,\n searchable: false,\n },\n },\n // experimental feature:\n indexes: [\n {\n name: 'upload_files_folder_path_index',\n columns: ['folder_path'],\n type: null,\n },\n {\n name: `upload_files_created_at_index`,\n columns: ['created_at'],\n type: null,\n },\n {\n name: `upload_files_updated_at_index`,\n columns: ['updated_at'],\n type: null,\n },\n {\n name: `upload_files_name_index`,\n columns: ['name'],\n type: null,\n },\n {\n name: `upload_files_size_index`,\n columns: ['size'],\n type: null,\n },\n {\n name: `upload_files_ext_index`,\n columns: ['ext'],\n type: null,\n },\n ],\n } satisfies Partial<Struct.CollectionTypeSchema>,\n};\n"],"names":["schema","collectionName","info","singularName","pluralName","displayName","description","options","pluginOptions","visible","attributes","name","type","configurable","required","alternativeText","caption","width","height","formats","hash","ext","mime","size","url","previewUrl","provider","provider_metadata","related","relation","folder","target","FOLDER_MODEL_UID","inversedBy","private","folderPath","minLength","searchable","indexes","columns"],"mappings":"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"}
1
+ {"version":3,"file":"file.mjs","sources":["../../../server/src/content-types/file.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\n\nimport { FOLDER_MODEL_UID } from '../constants';\n\nexport default {\n schema: {\n collectionName: 'files',\n info: {\n singularName: 'file',\n pluralName: 'files',\n displayName: 'File',\n description: '',\n },\n options: {},\n pluginOptions: {\n 'content-manager': {\n visible: false,\n },\n 'content-type-builder': {\n visible: false,\n },\n },\n attributes: {\n name: {\n type: 'string',\n configurable: false,\n required: true,\n },\n alternativeText: {\n type: 'text',\n configurable: false,\n },\n caption: {\n type: 'text',\n configurable: false,\n },\n width: {\n type: 'integer',\n configurable: false,\n },\n height: {\n type: 'integer',\n configurable: false,\n },\n formats: {\n type: 'json',\n configurable: false,\n },\n hash: {\n type: 'string',\n configurable: false,\n required: true,\n },\n ext: {\n type: 'string',\n configurable: false,\n },\n mime: {\n type: 'string',\n configurable: false,\n required: true,\n },\n size: {\n type: 'decimal',\n configurable: false,\n required: true,\n },\n url: {\n type: 'text',\n configurable: false,\n required: true,\n },\n previewUrl: {\n type: 'text',\n configurable: false,\n },\n provider: {\n type: 'string',\n configurable: false,\n required: true,\n },\n provider_metadata: {\n type: 'json',\n configurable: false,\n },\n related: {\n type: 'relation',\n relation: 'morphToMany',\n configurable: false,\n },\n folder: {\n type: 'relation',\n relation: 'manyToOne',\n target: FOLDER_MODEL_UID,\n inversedBy: 'files',\n private: true,\n },\n folderPath: {\n type: 'string',\n minLength: 1,\n required: true,\n private: true,\n searchable: false,\n },\n },\n // experimental feature:\n indexes: [\n {\n name: 'upload_files_folder_path_index',\n columns: ['folder_path'],\n type: null,\n },\n {\n name: `upload_files_created_at_index`,\n columns: ['created_at'],\n type: null,\n },\n {\n name: `upload_files_updated_at_index`,\n columns: ['updated_at'],\n type: null,\n },\n {\n name: `upload_files_name_index`,\n columns: ['name'],\n type: null,\n },\n {\n name: `upload_files_size_index`,\n columns: ['size'],\n type: null,\n },\n {\n name: `upload_files_ext_index`,\n columns: ['ext'],\n type: null,\n },\n ],\n } satisfies Partial<Struct.CollectionTypeSchema>,\n};\n"],"names":["schema","collectionName","info","singularName","pluralName","displayName","description","options","pluginOptions","visible","attributes","name","type","configurable","required","alternativeText","caption","width","height","formats","hash","ext","mime","size","url","previewUrl","provider","provider_metadata","related","relation","folder","target","FOLDER_MODEL_UID","inversedBy","private","folderPath","minLength","searchable","indexes","columns"],"mappings":"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"}
@@ -53,7 +53,7 @@ const createAIMetadataService = ({ strapi })=>{
53
53
  }
54
54
  let token;
55
55
  try {
56
- const tokenData = await strapi.service('admin::user').getAiToken();
56
+ const tokenData = await strapi.get('ai').getAiToken();
57
57
  token = tokenData.token;
58
58
  } catch (error) {
59
59
  throw new Error('Failed to retrieve AI token', {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-metadata.js","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
1
+ {"version":3,"file":"ai-metadata.js","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.get('ai').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
@@ -51,7 +51,7 @@ const createAIMetadataService = ({ strapi })=>{
51
51
  }
52
52
  let token;
53
53
  try {
54
- const tokenData = await strapi.service('admin::user').getAiToken();
54
+ const tokenData = await strapi.get('ai').getAiToken();
55
55
  token = tokenData.token;
56
56
  } catch (error) {
57
57
  throw new Error('Failed to retrieve AI token', {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-metadata.mjs","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.service('admin::user').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
1
+ {"version":3,"file":"ai-metadata.mjs","sources":["../../../server/src/services/ai-metadata.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { z } from 'zod';\nimport { InputFile } from '../types';\nimport { Settings } from '../controllers/validation/admin/settings';\n\nconst createAIMetadataService = ({ strapi }: { strapi: Core.Strapi }) => {\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return {\n async isEnabled() {\n // Check if user disabled AI features globally\n const isAIEnabled = strapi.config.get('admin.ai.enabled', true);\n if (!isAIEnabled) {\n return false;\n }\n\n // Check if the user's license grants access to AI features\n const hasAccess = strapi.ee.features.isEnabled('cms-ai');\n if (!hasAccess) {\n return false;\n }\n\n // Check if feature is specifically enabled, defaulting to true\n const settings: Settings = await strapi.plugin('upload').service('upload').getSettings();\n const aiMetadata: boolean = settings.aiMetadata ?? true;\n\n return aiMetadata;\n },\n\n async processFiles(\n files: InputFile[]\n ): Promise<Array<{ altText: string; caption: string } | null>> {\n if (!(await this.isEnabled()) || !aiServerUrl) {\n throw new Error('AI Metadata service is not enabled');\n }\n\n // Filter for image files only and track their original positions\n // We need to maintain the original indices so we can map AI results back correctly\n const imageFiles = files\n .map((file, index) => ({ file, originalIndex: index }))\n .filter(({ file }) => file.mimetype?.startsWith('image/'));\n\n // If no image files, return sparse array with all nulls to avoid calling the AI server\n // This maintains the same array length as input files for proper index alignment\n if (imageFiles.length === 0) {\n return new Array(files.length).fill(null);\n }\n\n const formData = new FormData();\n\n for (const { file } of imageFiles) {\n const fullUrl =\n file.provider === 'local'\n ? strapi.config.get('server.absoluteUrl') + file.filepath\n : file.filepath;\n\n const resp = await fetch(fullUrl);\n if (!resp.ok) {\n throw new Error(`Failed to fetch image from URL: ${fullUrl} (${resp.status})`);\n }\n const ab = await resp.arrayBuffer();\n const blob: Blob = new Blob([ab], { type: file.mimetype || undefined });\n formData.append('files', blob);\n }\n\n let token: string;\n try {\n const tokenData = await strapi.get('ai').getAiToken();\n token = tokenData.token;\n } catch (error) {\n throw new Error('Failed to retrieve AI token', {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n strapi.log.http('Contacting AI Server for media metadata generation');\n const res = await fetch(`${aiServerUrl}/media-library/generate-metadata`, {\n method: 'POST',\n body: formData,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!res.ok) {\n throw Error(`AI metadata generation failed`, { cause: await res.text() });\n }\n\n const responseSchema = z.object({\n results: z.array(\n z.object({\n altText: z.string(),\n caption: z.string(),\n })\n ),\n });\n\n const { results } = responseSchema.parse(await res.json());\n strapi.log.http(`Media metadata generated successfully for ${results.length} files`);\n\n // Create sparse array with results at original indices\n // Example: files=[img1, pdf, img2] -> imageFiles=[{img1, index:0}, {img2, index:2}]\n // AI results=[meta1, meta2] -> sparse=[meta1, null, meta2]\n // This ensures metadata[i] corresponds to files[i], with null for non-images\n return imageFiles.reduce((sparseResults, { originalIndex }, resultIndex) => {\n sparseResults[originalIndex] = results[resultIndex];\n return sparseResults;\n }, new Array(files.length).fill(null));\n },\n };\n};\n\nexport { createAIMetadataService };\n"],"names":["createAIMetadataService","strapi","aiServerUrl","process","env","STRAPI_AI_URL","isEnabled","isAIEnabled","config","get","hasAccess","ee","features","settings","plugin","service","getSettings","aiMetadata","processFiles","files","Error","imageFiles","map","file","index","originalIndex","filter","mimetype","startsWith","length","Array","fill","formData","FormData","fullUrl","provider","filepath","resp","fetch","ok","status","ab","arrayBuffer","blob","Blob","type","undefined","append","token","tokenData","getAiToken","error","cause","log","http","res","method","body","headers","Authorization","text","responseSchema","z","object","results","array","altText","string","caption","parse","json","reduce","sparseResults","resultIndex"],"mappings":"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"}
@@ -23,11 +23,11 @@ declare const _default: {
23
23
  required: true;
24
24
  };
25
25
  alternativeText: {
26
- type: "string";
26
+ type: "text";
27
27
  configurable: false;
28
28
  };
29
29
  caption: {
30
- type: "string";
30
+ type: "text";
31
31
  configurable: false;
32
32
  };
33
33
  width: {
@@ -62,12 +62,12 @@ declare const _default: {
62
62
  required: true;
63
63
  };
64
64
  url: {
65
- type: "string";
65
+ type: "text";
66
66
  configurable: false;
67
67
  required: true;
68
68
  };
69
69
  previewUrl: {
70
- type: "string";
70
+ type: "text";
71
71
  configurable: false;
72
72
  };
73
73
  provider: {
@@ -24,11 +24,11 @@ export declare const contentTypes: {
24
24
  required: true;
25
25
  };
26
26
  alternativeText: {
27
- type: "string";
27
+ type: "text";
28
28
  configurable: false;
29
29
  };
30
30
  caption: {
31
- type: "string";
31
+ type: "text";
32
32
  configurable: false;
33
33
  };
34
34
  width: {
@@ -63,12 +63,12 @@ export declare const contentTypes: {
63
63
  required: true;
64
64
  };
65
65
  url: {
66
- type: "string";
66
+ type: "text";
67
67
  configurable: false;
68
68
  required: true;
69
69
  };
70
70
  previewUrl: {
71
- type: "string";
71
+ type: "text";
72
72
  configurable: false;
73
73
  };
74
74
  provider: {
@@ -129,11 +129,11 @@ declare const _default: () => {
129
129
  required: true;
130
130
  };
131
131
  alternativeText: {
132
- type: "string";
132
+ type: "text";
133
133
  configurable: false;
134
134
  };
135
135
  caption: {
136
- type: "string";
136
+ type: "text";
137
137
  configurable: false;
138
138
  };
139
139
  width: {
@@ -168,12 +168,12 @@ declare const _default: () => {
168
168
  required: true;
169
169
  };
170
170
  url: {
171
- type: "string";
171
+ type: "text";
172
172
  configurable: false;
173
173
  required: true;
174
174
  };
175
175
  previewUrl: {
176
- type: "string";
176
+ type: "text";
177
177
  configurable: false;
178
178
  };
179
179
  provider: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upload",
3
- "version": "5.31.2",
3
+ "version": "5.32.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": {
@@ -62,10 +62,10 @@
62
62
  "dependencies": {
63
63
  "@mux/mux-player-react": "3.1.0",
64
64
  "@reduxjs/toolkit": "1.9.7",
65
- "@strapi/design-system": "2.0.0-rc.30",
66
- "@strapi/icons": "2.0.0-rc.30",
67
- "@strapi/provider-upload-local": "5.31.2",
68
- "@strapi/utils": "5.31.2",
65
+ "@strapi/design-system": "2.0.1",
66
+ "@strapi/icons": "2.0.1",
67
+ "@strapi/provider-upload-local": "5.32.0",
68
+ "@strapi/utils": "5.32.0",
69
69
  "byte-size": "8.1.1",
70
70
  "cropperjs": "1.6.1",
71
71
  "date-fns": "2.30.0",
@@ -89,11 +89,11 @@
89
89
  "zod": "3.25.67"
90
90
  },
91
91
  "devDependencies": {
92
- "@strapi/admin": "5.31.2",
93
- "@strapi/types": "5.31.2",
94
- "@testing-library/dom": "10.1.0",
95
- "@testing-library/react": "15.0.7",
96
- "@testing-library/user-event": "14.5.2",
92
+ "@strapi/admin": "5.32.0",
93
+ "@strapi/types": "5.32.0",
94
+ "@testing-library/dom": "10.4.1",
95
+ "@testing-library/react": "16.3.0",
96
+ "@testing-library/user-event": "14.6.1",
97
97
  "@types/byte-size": "8.1.2",
98
98
  "@types/fs-extra": "11.0.4",
99
99
  "@types/koa": "2.13.4",