@vivinkv28/strapi-provider-uploadthing 0.1.6 → 0.1.8

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.
package/README.md CHANGED
@@ -1,213 +1,213 @@
1
- # @vivinkv28/strapi-provider-uploadthing
2
-
3
- UploadThing provider for the Strapi Uploads
4
-
5
- This provider stores Strapi Media Library files in UploadThing while keeping file records and metadata inside Strapi.
6
-
7
- ## What This Provider Does
8
-
9
- - Uploads Strapi media files to UploadThing
10
- - Stores UploadThing metadata in `provider_metadata.uploadthing`
11
- - Uses the UploadThing file URL as the Strapi file URL
12
- - Supports both `upload` and `uploadStream`
13
- - Supports signed URLs for private files
14
- - Deletes the remote file when the Strapi file is deleted
15
- - Uses predictable `customId` values by default
16
- - Retries transient upload failures automatically
17
- - Handles replace-media conflicts more safely
18
-
19
- ## Requirements
20
-
21
- - Node.js `>= 20.0.0`
22
- - Strapi v5
23
-
24
- ## Installation
25
-
26
- Install the provider in your Strapi project:
27
-
28
- ```bash
29
- npm install @vivinkv28/strapi-provider-uploadthing
30
- ```
31
-
32
- ## Quick Start
33
-
34
- 1. Add your UploadThing token to `.env`.
35
- 2. Configure the upload provider in `config/plugins.ts`.
36
- 3. Update `config/middlewares.ts` so Strapi allows UploadThing media URLs in the admin.
37
- 4. Restart Strapi.
38
-
39
- ## Environment Variables
40
-
41
- Minimum required:
42
-
43
- ```env
44
- UPLOADTHING_TOKEN=your_uploadthing_token
45
- ```
46
-
47
- Typical public-file setup:
48
-
49
- ```env
50
- UPLOADTHING_TOKEN=your_uploadthing_token
51
- UPLOADTHING_ACL=public-read
52
- UPLOADTHING_PRIVATE_FILES=false
53
- UPLOADTHING_CONTENT_DISPOSITION=inline
54
- UPLOADTHING_SIGNED_URL_EXPIRES_IN=3600
55
- UPLOADTHING_UPLOAD_CONCURRENCY=1
56
- UPLOADTHING_UPLOAD_RETRIES=2
57
- UPLOADTHING_USE_CUSTOM_ID=true
58
- UPLOADTHING_LOG_LEVEL=Info
59
- ```
60
-
61
- Typical private-file setup:
62
-
63
- ```env
64
- UPLOADTHING_TOKEN=your_uploadthing_token
65
- UPLOADTHING_ACL=private
66
- UPLOADTHING_PRIVATE_FILES=true
67
- UPLOADTHING_SIGNED_URL_EXPIRES_IN=3600
68
- ```
69
-
70
- ## Strapi Configuration
71
-
72
- Create or update `./config/plugins.ts`:
73
-
74
- ```ts
75
- export default ({ env }) => ({
76
- upload: {
77
- config: {
78
- provider: '@vivinkv28/strapi-provider-uploadthing',
79
- providerOptions: {
80
- token: env('UPLOADTHING_TOKEN'),
81
- acl: env('UPLOADTHING_ACL', 'public-read'),
82
- privateFiles: env.bool('UPLOADTHING_PRIVATE_FILES', false),
83
- contentDisposition: env('UPLOADTHING_CONTENT_DISPOSITION', 'inline'),
84
- signedUrlExpiresIn: env.int('UPLOADTHING_SIGNED_URL_EXPIRES_IN', 3600),
85
- uploadConcurrency: env.int('UPLOADTHING_UPLOAD_CONCURRENCY', 1),
86
- uploadRetries: env.int('UPLOADTHING_UPLOAD_RETRIES', 2),
87
- useCustomId: env.bool('UPLOADTHING_USE_CUSTOM_ID', true),
88
- logLevel: env('UPLOADTHING_LOG_LEVEL', 'Info'),
89
- },
90
- actionOptions: {
91
- upload: {},
92
- uploadStream: {},
93
- delete: {},
94
- },
95
- },
96
- },
97
- });
98
- ```
99
-
100
- Update `./config/middlewares.ts` as well. This step is required so Strapi's Content Security Policy allows UploadThing-hosted images and media to load in the admin panel and Media Library:
101
-
102
- ```ts
103
- import type { Core } from '@strapi/strapi';
104
-
105
- const config: Core.Config.Middlewares = [
106
- 'strapi::logger',
107
- 'strapi::errors',
108
- {
109
- name: 'strapi::security',
110
- config: {
111
- contentSecurityPolicy: {
112
- useDefaults: true,
113
- directives: {
114
- 'connect-src': ["'self'", 'https:'],
115
- 'img-src': ["'self'", 'data:', 'blob:', 'https://*.ufs.sh', 'https://utfs.io'],
116
- 'media-src': ["'self'", 'data:', 'blob:', 'https://*.ufs.sh', 'https://utfs.io'],
117
- upgradeInsecureRequests: null,
118
- },
119
- },
120
- },
121
- },
122
- 'strapi::cors',
123
- 'strapi::poweredBy',
124
- 'strapi::query',
125
- 'strapi::body',
126
- 'strapi::session',
127
- 'strapi::favicon',
128
- 'strapi::public',
129
- ];
130
-
131
- export default config;
132
- ```
133
-
134
- If you already have a `strapi::security` middleware entry, merge these UploadThing domains into your existing CSP directives instead of adding a second `strapi::security` entry.
135
-
136
- ## Public vs Private Files
137
-
138
- This is the part most people get confused by:
139
-
140
- - `acl` controls how the file is stored in UploadThing.
141
- - `privateFiles` controls how Strapi serves the file.
142
-
143
- Use this combination for public files:
144
-
145
- ```env
146
- UPLOADTHING_ACL=public-read
147
- UPLOADTHING_PRIVATE_FILES=false
148
- ```
149
-
150
- Use this combination for private files:
151
-
152
- ```env
153
- UPLOADTHING_ACL=private
154
- UPLOADTHING_PRIVATE_FILES=true
155
- ```
156
-
157
- If you set only `privateFiles=true`, Strapi will generate signed URLs, but the uploaded file may still be stored with a public ACL depending on your UploadThing configuration.
158
-
159
- ## How Private Files Work
160
-
161
- When `privateFiles` is enabled:
162
-
163
- 1. The provider tells Strapi that files should be treated as private.
164
- 2. Strapi asks the provider for a signed URL whenever it needs to serve the file.
165
- 3. The provider requests a temporary signed URL from UploadThing using the stored `customId` or `fileKey`.
166
- 4. Strapi returns that temporary URL to the client.
167
-
168
- The signed URL lifetime is controlled by `signedUrlExpiresIn`.
169
-
170
- ## Provider Options
171
-
172
- | Option | Type | Default | Description |
173
- | --- | --- | --- | --- |
174
- | `token` | `string` | `process.env.UPLOADTHING_TOKEN` | UploadThing token used to initialize `UTApi`. |
175
- | `acl` | `'public-read' \| 'private'` | `undefined` | ACL passed to UploadThing during upload. Use `'public-read'` for public files or `'private'` for storage-level private files. |
176
- | `privateFiles` | `boolean` | `false` | Tells Strapi to treat files as private and request signed URLs when serving them. |
177
- | `contentDisposition` | `'inline' \| 'attachment'` | `'inline'` | Content disposition sent to UploadThing during upload. |
178
- | `signedUrlExpiresIn` | `number` | `3600` | Signed URL lifetime in seconds. Used when Strapi requests a private file URL. |
179
- | `uploadConcurrency` | `number` | `1` | Maximum number of concurrent uploads handled by the provider. Values above `25` are capped to `25`. |
180
- | `uploadRetries` | `number` | `2` | Number of retry attempts for transient UploadThing upload failures. |
181
- | `useCustomId` | `boolean` | `true` | Uses a deterministic UploadThing `customId` based on the Strapi file hash and extension. |
182
- | `apiUrl` | `string` | `undefined` | Optional custom UploadThing API URL. |
183
- | `ingestUrl` | `string` | `undefined` | Optional custom UploadThing ingest URL. |
184
- | `logLevel` | `string` | `undefined` | Optional UploadThing log level. |
185
- | `logFormat` | `string` | `undefined` | Optional UploadThing log format. |
186
- | `isDev` | `boolean` | `undefined` | Optional UploadThing development mode flag. |
187
-
188
- ## Stored Metadata
189
-
190
- After upload, this provider stores UploadThing-specific metadata in:
191
-
192
- ```txt
193
- provider_metadata.uploadthing
194
- ```
195
-
196
- That metadata includes values such as:
197
-
198
- - `fileKey`
199
- - `customId`
200
- - `url`
201
- - `ufsUrl`
202
- - `name`
203
- - `size`
204
-
205
- ## Notes
206
-
207
- - The provider uses UploadThing `ufsUrl` as the file URL stored in Strapi.
208
- - If `useCustomId` is enabled, the provider prefers `customId` when generating signed URLs or deleting files.
209
- - If a deterministic `customId` conflicts during replace-media flows, the provider falls back to a unique ID and retries the upload.
210
-
211
- ## Learn More
212
-
213
- - [UploadThing](https://uploadthing.com/)
1
+ # @vivinkv28/strapi-provider-uploadthing
2
+
3
+ UploadThing provider for the Strapi Uploads
4
+
5
+ This provider stores Strapi Media Library files in UploadThing while keeping file records and metadata inside Strapi.
6
+
7
+ ## What This Provider Does
8
+
9
+ - Uploads Strapi media files to UploadThing
10
+ - Stores UploadThing metadata in `provider_metadata.uploadthing`
11
+ - Uses the UploadThing file URL as the Strapi file URL
12
+ - Supports both `upload` and `uploadStream`
13
+ - Supports signed URLs for private files
14
+ - Deletes the remote file when the Strapi file is deleted
15
+ - Uses predictable `customId` values by default
16
+ - Retries transient upload failures automatically
17
+ - Handles replace-media conflicts more safely
18
+
19
+ ## Requirements
20
+
21
+ - Node.js `>= 20.0.0`
22
+ - Strapi v5
23
+
24
+ ## Installation
25
+
26
+ Install the provider in your Strapi project:
27
+
28
+ ```bash
29
+ npm install @vivinkv28/strapi-provider-uploadthing
30
+ ```
31
+
32
+ ## Quick Start
33
+
34
+ 1. Add your UploadThing token to `.env`.
35
+ 2. Configure the upload provider in `config/plugins.ts`.
36
+ 3. Update `config/middlewares.ts` so Strapi allows UploadThing media URLs in the admin.
37
+ 4. Restart Strapi.
38
+
39
+ ## Environment Variables
40
+
41
+ Minimum required:
42
+
43
+ ```env
44
+ UPLOADTHING_TOKEN=your_uploadthing_token
45
+ ```
46
+
47
+ Typical public-file setup:
48
+
49
+ ```env
50
+ UPLOADTHING_TOKEN=your_uploadthing_token
51
+ UPLOADTHING_ACL=public-read
52
+ UPLOADTHING_PRIVATE_FILES=false
53
+ UPLOADTHING_CONTENT_DISPOSITION=inline
54
+ UPLOADTHING_SIGNED_URL_EXPIRES_IN=3600
55
+ UPLOADTHING_UPLOAD_CONCURRENCY=1
56
+ UPLOADTHING_UPLOAD_RETRIES=2
57
+ UPLOADTHING_USE_CUSTOM_ID=true
58
+ UPLOADTHING_LOG_LEVEL=Info
59
+ ```
60
+
61
+ Typical private-file setup:
62
+
63
+ ```env
64
+ UPLOADTHING_TOKEN=your_uploadthing_token
65
+ UPLOADTHING_ACL=private
66
+ UPLOADTHING_PRIVATE_FILES=true
67
+ UPLOADTHING_SIGNED_URL_EXPIRES_IN=3600
68
+ ```
69
+
70
+ ## Strapi Configuration
71
+
72
+ Create or update `./config/plugins.ts`:
73
+
74
+ ```ts
75
+ export default ({ env }) => ({
76
+ upload: {
77
+ config: {
78
+ provider: '@vivinkv28/strapi-provider-uploadthing',
79
+ providerOptions: {
80
+ token: env('UPLOADTHING_TOKEN'),
81
+ acl: env('UPLOADTHING_ACL', 'public-read'),
82
+ privateFiles: env.bool('UPLOADTHING_PRIVATE_FILES', false),
83
+ contentDisposition: env('UPLOADTHING_CONTENT_DISPOSITION', 'inline'),
84
+ signedUrlExpiresIn: env.int('UPLOADTHING_SIGNED_URL_EXPIRES_IN', 3600),
85
+ uploadConcurrency: env.int('UPLOADTHING_UPLOAD_CONCURRENCY', 1),
86
+ uploadRetries: env.int('UPLOADTHING_UPLOAD_RETRIES', 2),
87
+ useCustomId: env.bool('UPLOADTHING_USE_CUSTOM_ID', true),
88
+ logLevel: env('UPLOADTHING_LOG_LEVEL', 'Info'),
89
+ },
90
+ actionOptions: {
91
+ upload: {},
92
+ uploadStream: {},
93
+ delete: {},
94
+ },
95
+ },
96
+ },
97
+ });
98
+ ```
99
+
100
+ Update `./config/middlewares.ts` as well. This step is required so Strapi's Content Security Policy allows UploadThing-hosted images and media to load in the admin panel and Media Library:
101
+
102
+ ```ts
103
+ import type { Core } from '@strapi/strapi';
104
+
105
+ const config: Core.Config.Middlewares = [
106
+ 'strapi::logger',
107
+ 'strapi::errors',
108
+ {
109
+ name: 'strapi::security',
110
+ config: {
111
+ contentSecurityPolicy: {
112
+ useDefaults: true,
113
+ directives: {
114
+ 'connect-src': ["'self'", 'https:'],
115
+ 'img-src': ["'self'", 'data:', 'blob:', 'https://*.ufs.sh', 'https://utfs.io'],
116
+ 'media-src': ["'self'", 'data:', 'blob:', 'https://*.ufs.sh', 'https://utfs.io'],
117
+ upgradeInsecureRequests: null,
118
+ },
119
+ },
120
+ },
121
+ },
122
+ 'strapi::cors',
123
+ 'strapi::poweredBy',
124
+ 'strapi::query',
125
+ 'strapi::body',
126
+ 'strapi::session',
127
+ 'strapi::favicon',
128
+ 'strapi::public',
129
+ ];
130
+
131
+ export default config;
132
+ ```
133
+
134
+ If you already have a `strapi::security` middleware entry, merge these UploadThing domains into your existing CSP directives instead of adding a second `strapi::security` entry.
135
+
136
+ ## Public vs Private Files
137
+
138
+ This is the part most people get confused by:
139
+
140
+ - `acl` controls how the file is stored in UploadThing.
141
+ - `privateFiles` controls how Strapi serves the file.
142
+
143
+ Use this combination for public files:
144
+
145
+ ```env
146
+ UPLOADTHING_ACL=public-read
147
+ UPLOADTHING_PRIVATE_FILES=false
148
+ ```
149
+
150
+ Use this combination for private files:
151
+
152
+ ```env
153
+ UPLOADTHING_ACL=private
154
+ UPLOADTHING_PRIVATE_FILES=true
155
+ ```
156
+
157
+ If you set only `privateFiles=true`, Strapi will generate signed URLs, but the uploaded file may still be stored with a public ACL depending on your UploadThing configuration.
158
+
159
+ ## How Private Files Work
160
+
161
+ When `privateFiles` is enabled:
162
+
163
+ 1. The provider tells Strapi that files should be treated as private.
164
+ 2. Strapi asks the provider for a signed URL whenever it needs to serve the file.
165
+ 3. The provider requests a temporary signed URL from UploadThing using the stored `customId` or `fileKey`.
166
+ 4. Strapi returns that temporary URL to the client.
167
+
168
+ The signed URL lifetime is controlled by `signedUrlExpiresIn`.
169
+
170
+ ## Provider Options
171
+
172
+ | Option | Type | Default | Description |
173
+ | --- | --- | --- | --- |
174
+ | `token` | `string` | `process.env.UPLOADTHING_TOKEN` | UploadThing token used to initialize `UTApi`. |
175
+ | `acl` | `'public-read' \| 'private'` | `undefined` | ACL passed to UploadThing during upload. Use `'public-read'` for public files or `'private'` for storage-level private files. |
176
+ | `privateFiles` | `boolean` | `false` | Tells Strapi to treat files as private and request signed URLs when serving them. |
177
+ | `contentDisposition` | `'inline' \| 'attachment'` | `'inline'` | Content disposition sent to UploadThing during upload. |
178
+ | `signedUrlExpiresIn` | `number` | `3600` | Signed URL lifetime in seconds. Used when Strapi requests a private file URL. |
179
+ | `uploadConcurrency` | `number` | `1` | Maximum number of concurrent uploads handled by the provider. Values above `25` are capped to `25`. |
180
+ | `uploadRetries` | `number` | `2` | Number of retry attempts for transient UploadThing upload failures. |
181
+ | `useCustomId` | `boolean` | `true` | Uses a deterministic UploadThing `customId` based on the Strapi file hash and extension. |
182
+ | `apiUrl` | `string` | `undefined` | Optional custom UploadThing API URL. |
183
+ | `ingestUrl` | `string` | `undefined` | Optional custom UploadThing ingest URL. |
184
+ | `logLevel` | `string` | `undefined` | Optional UploadThing log level. |
185
+ | `logFormat` | `string` | `undefined` | Optional UploadThing log format. |
186
+ | `isDev` | `boolean` | `undefined` | Optional UploadThing development mode flag. |
187
+
188
+ ## Stored Metadata
189
+
190
+ After upload, this provider stores UploadThing-specific metadata in:
191
+
192
+ ```txt
193
+ provider_metadata.uploadthing
194
+ ```
195
+
196
+ That metadata includes values such as:
197
+
198
+ - `fileKey`
199
+ - `customId`
200
+ - `url`
201
+ - `ufsUrl`
202
+ - `name`
203
+ - `size`
204
+
205
+ ## Notes
206
+
207
+ - The provider uses UploadThing `ufsUrl` as the file URL stored in Strapi.
208
+ - If `useCustomId` is enabled, the provider prefers `customId` when generating signed URLs or deleting files.
209
+ - If a deterministic `customId` conflicts during replace-media flows, the provider falls back to a unique ID and retries the upload.
210
+
211
+ ## Learn More
212
+
213
+ - [UploadThing](https://uploadthing.com/)
@@ -222,12 +222,12 @@ const provider = (providerOptions = {}) => {
222
222
  if (!key) {
223
223
  return file;
224
224
  }
225
- const signed = await utapi.getSignedURL(key, {
225
+ const signed = await utapi.generateSignedURL(key, {
226
226
  expiresIn: resolvedSignedUrlTtl,
227
227
  keyType
228
228
  });
229
229
  return {
230
- url: signed.ufsUrl || signed.url
230
+ url: signed.ufsUrl
231
231
  };
232
232
  },
233
233
  async uploadStream(file) {
@@ -218,12 +218,12 @@ const provider = (providerOptions = {}) => {
218
218
  if (!key) {
219
219
  return file;
220
220
  }
221
- const signed = await utapi.getSignedURL(key, {
221
+ const signed = await utapi.generateSignedURL(key, {
222
222
  expiresIn: resolvedSignedUrlTtl,
223
223
  keyType
224
224
  });
225
225
  return {
226
- url: signed.ufsUrl || signed.url
226
+ url: signed.ufsUrl
227
227
  };
228
228
  },
229
229
  async uploadStream(file) {
package/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const providerModule = require('./server/src/services/provider');
4
- const provider = providerModule.default || providerModule;
3
+ const server = require('./dist/server');
4
+ const provider = server.default?.services?.provider || server.services?.provider;
5
5
 
6
6
  module.exports = {
7
7
  init: provider,
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
- {
2
- "name": "@vivinkv28/strapi-provider-uploadthing",
3
- "version": "0.1.6",
4
- "description": "UploadThing provider for the Strapi Upload plugin",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/vivinkv28/strapi-provider-uploadthing.git"
8
- },
9
- "homepage": "https://github.com/vivinkv28/strapi-provider-uploadthing#readme",
10
- "bugs": {
11
- "url": "https://github.com/vivinkv28/strapi-provider-uploadthing/issues"
12
- },
13
- "main": "index.js",
14
- "exports": {
15
- ".": "./index.js",
16
- "./strapi-server": {
17
- "source": "./server/src/index.js",
18
- "import": "./dist/server/index.mjs",
19
- "require": "./dist/server/index.js",
20
- "default": "./dist/server/index.js"
21
- },
22
- "./package.json": "./package.json"
23
- },
24
- "files": [
25
- "dist/",
26
- "index.js",
27
- "server",
28
- "strapi-server.js",
29
- "LICENSE",
30
- "README.md"
31
- ],
32
- "keywords": [
33
- "strapi",
34
- "strapi-plugin",
35
- "uploadthing",
36
- "upload",
37
- "provider",
38
- "media-library"
39
- ],
40
- "strapi": {
41
- "kind": "plugin",
42
- "name": "strapi-upload-things",
43
- "displayName": "UploadThing Provider",
44
- "description": "UploadThing integration for the Strapi upload plugin"
45
- },
46
- "license": "MIT",
47
- "publishConfig": {
48
- "access": "public"
49
- },
50
- "engines": {
51
- "node": ">=20.0.0"
52
- },
53
- "scripts": {
54
- "build": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js build",
55
- "watch": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js watch",
56
- "watch:link": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js watch:link",
57
- "verify": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js verify",
58
- "prepack": "npm run build"
59
- },
60
- "dependencies": {
61
- "uploadthing": "^7.7.2"
62
- },
63
- "devDependencies": {
64
- "@babel/runtime": "^7.29.2",
65
- "@strapi/sdk-plugin": "^6.1.0"
66
- }
67
- }
1
+ {
2
+ "name": "@vivinkv28/strapi-provider-uploadthing",
3
+ "version": "0.1.8",
4
+ "description": "UploadThing provider for the Strapi Upload plugin",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/vivinkv28/strapi-provider-uploadthing.git"
8
+ },
9
+ "homepage": "https://github.com/vivinkv28/strapi-provider-uploadthing#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/vivinkv28/strapi-provider-uploadthing/issues"
12
+ },
13
+ "main": "index.js",
14
+ "exports": {
15
+ ".": "./index.js",
16
+ "./strapi-server": {
17
+ "source": "./server/src/index.js",
18
+ "import": "./dist/server/index.mjs",
19
+ "require": "./dist/server/index.js",
20
+ "default": "./dist/server/index.js"
21
+ },
22
+ "./package.json": "./package.json"
23
+ },
24
+ "files": [
25
+ "dist/",
26
+ "index.js",
27
+ "server",
28
+ "strapi-server.js",
29
+ "LICENSE",
30
+ "README.md"
31
+ ],
32
+ "keywords": [
33
+ "strapi",
34
+ "strapi-plugin",
35
+ "uploadthing",
36
+ "upload",
37
+ "provider",
38
+ "media-library"
39
+ ],
40
+ "strapi": {
41
+ "kind": "plugin",
42
+ "name": "strapi-upload-things",
43
+ "displayName": "UploadThing Provider",
44
+ "description": "UploadThing integration for the Strapi upload plugin"
45
+ },
46
+ "license": "MIT",
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "engines": {
51
+ "node": ">=20.0.0"
52
+ },
53
+ "scripts": {
54
+ "build": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js build",
55
+ "watch": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js watch",
56
+ "watch:link": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js watch:link",
57
+ "verify": "node ./node_modules/@strapi/sdk-plugin/bin/strapi-plugin.js verify",
58
+ "prepack": "npm run build"
59
+ },
60
+ "dependencies": {
61
+ "uploadthing": "^7.7.2"
62
+ },
63
+ "devDependencies": {
64
+ "@babel/runtime": "^7.29.2",
65
+ "@strapi/sdk-plugin": "^6.1.0"
66
+ }
67
+ }
@@ -271,13 +271,13 @@ export default (providerOptions = {}) => {
271
271
  return file;
272
272
  }
273
273
 
274
- const signed = await utapi.getSignedURL(key, {
274
+ const signed = await utapi.generateSignedURL(key, {
275
275
  expiresIn: resolvedSignedUrlTtl,
276
276
  keyType,
277
277
  });
278
278
 
279
279
  return {
280
- url: signed.ufsUrl || signed.url,
280
+ url: signed.ufsUrl,
281
281
  };
282
282
  },
283
283