@depup/uploadthing 7.7.4-depup.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 (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/changes.json +18 -0
  4. package/client/index.cjs +331 -0
  5. package/client/index.d.cts +36 -0
  6. package/client/index.d.cts.map +1 -0
  7. package/client/index.d.ts +36 -0
  8. package/client/index.d.ts.map +1 -0
  9. package/client/index.js +286 -0
  10. package/client/index.js.map +1 -0
  11. package/client-future/index.cjs +426 -0
  12. package/client-future/index.d.cts +373 -0
  13. package/client-future/index.d.cts.map +1 -0
  14. package/client-future/index.d.ts +373 -0
  15. package/client-future/index.d.ts.map +1 -0
  16. package/client-future/index.js +383 -0
  17. package/client-future/index.js.map +1 -0
  18. package/dist/chunk-CUT6urMc.cjs +30 -0
  19. package/dist/deprecations-DPGpmqha.cjs +13 -0
  20. package/dist/deprecations-pLmw6Ytd.js +8 -0
  21. package/dist/deprecations-pLmw6Ytd.js.map +1 -0
  22. package/dist/package-BQ_k22T9.cjs +11 -0
  23. package/dist/package-DpScpvTA.js +6 -0
  24. package/dist/package-DpScpvTA.js.map +1 -0
  25. package/dist/shared-schemas-BmG5ARoX.js +82 -0
  26. package/dist/shared-schemas-BmG5ARoX.js.map +1 -0
  27. package/dist/shared-schemas-CG9VaBtT.cjs +129 -0
  28. package/dist/to-web-request-BQtxSXgE.cjs +98 -0
  29. package/dist/to-web-request-DhP0wXG-.js +87 -0
  30. package/dist/to-web-request-DhP0wXG-.js.map +1 -0
  31. package/dist/types-Bs3w2d_3.d.ts +627 -0
  32. package/dist/types-Bs3w2d_3.d.ts.map +1 -0
  33. package/dist/types-DiVC1t2V.d.cts +625 -0
  34. package/dist/types-DiVC1t2V.d.cts.map +1 -0
  35. package/dist/upload-builder-BUa7tovh.d.cts +32 -0
  36. package/dist/upload-builder-BUa7tovh.d.cts.map +1 -0
  37. package/dist/upload-builder-BcFawEj0.d.ts +32 -0
  38. package/dist/upload-builder-BcFawEj0.d.ts.map +1 -0
  39. package/dist/upload-builder-BlFOAnsv.js +699 -0
  40. package/dist/upload-builder-BlFOAnsv.js.map +1 -0
  41. package/dist/upload-builder-D6Ken9H0.cjs +794 -0
  42. package/dist/ut-reporter-BHoyNnzW.cjs +120 -0
  43. package/dist/ut-reporter-Dlppchbx.js +103 -0
  44. package/dist/ut-reporter-Dlppchbx.js.map +1 -0
  45. package/effect-platform/index.cjs +22 -0
  46. package/effect-platform/index.d.cts +54 -0
  47. package/effect-platform/index.d.cts.map +1 -0
  48. package/effect-platform/index.d.ts +54 -0
  49. package/effect-platform/index.d.ts.map +1 -0
  50. package/effect-platform/index.js +19 -0
  51. package/effect-platform/index.js.map +1 -0
  52. package/express/index.cjs +30 -0
  53. package/express/index.d.cts +28 -0
  54. package/express/index.d.cts.map +1 -0
  55. package/express/index.d.ts +28 -0
  56. package/express/index.d.ts.map +1 -0
  57. package/express/index.js +27 -0
  58. package/express/index.js.map +1 -0
  59. package/fastify/index.cjs +27 -0
  60. package/fastify/index.d.cts +28 -0
  61. package/fastify/index.d.cts.map +1 -0
  62. package/fastify/index.d.ts +28 -0
  63. package/fastify/index.d.ts.map +1 -0
  64. package/fastify/index.js +24 -0
  65. package/fastify/index.js.map +1 -0
  66. package/h3/index.cjs +20 -0
  67. package/h3/index.d.cts +28 -0
  68. package/h3/index.d.cts.map +1 -0
  69. package/h3/index.d.ts +28 -0
  70. package/h3/index.d.ts.map +1 -0
  71. package/h3/index.js +17 -0
  72. package/h3/index.js.map +1 -0
  73. package/next/index.cjs +22 -0
  74. package/next/index.d.cts +30 -0
  75. package/next/index.d.cts.map +1 -0
  76. package/next/index.d.ts +30 -0
  77. package/next/index.d.ts.map +1 -0
  78. package/next/index.js +19 -0
  79. package/next/index.js.map +1 -0
  80. package/next-legacy/index.cjs +28 -0
  81. package/next-legacy/index.d.cts +28 -0
  82. package/next-legacy/index.d.cts.map +1 -0
  83. package/next-legacy/index.d.ts +28 -0
  84. package/next-legacy/index.d.ts.map +1 -0
  85. package/next-legacy/index.js +25 -0
  86. package/next-legacy/index.js.map +1 -0
  87. package/package.json +210 -0
  88. package/remix/index.cjs +22 -0
  89. package/remix/index.d.cts +30 -0
  90. package/remix/index.d.cts.map +1 -0
  91. package/remix/index.d.ts +30 -0
  92. package/remix/index.d.ts.map +1 -0
  93. package/remix/index.js +19 -0
  94. package/remix/index.js.map +1 -0
  95. package/server/index.cjs +414 -0
  96. package/server/index.d.cts +211 -0
  97. package/server/index.d.cts.map +1 -0
  98. package/server/index.d.ts +213 -0
  99. package/server/index.d.ts.map +1 -0
  100. package/server/index.js +405 -0
  101. package/server/index.js.map +1 -0
  102. package/tw/index.cjs +70 -0
  103. package/tw/index.d.cts +29 -0
  104. package/tw/index.d.cts.map +1 -0
  105. package/tw/index.d.ts +29 -0
  106. package/tw/index.d.ts.map +1 -0
  107. package/tw/index.js +74 -0
  108. package/tw/index.js.map +1 -0
  109. package/tw/v4.css +11 -0
  110. package/types/index.cjs +3 -0
  111. package/types/index.d.cts +2 -0
  112. package/types/index.d.ts +2 -0
  113. package/types/index.js +3 -0
@@ -0,0 +1,426 @@
1
+ const require_chunk = require('../dist/chunk-CUT6urMc.cjs');
2
+ const require_package = require('../dist/package-BQ_k22T9.cjs');
3
+ const require_ut_reporter = require('../dist/ut-reporter-BHoyNnzW.cjs');
4
+ const effect_Array = require_chunk.__toESM(require("effect/Array"));
5
+ const effect_Micro = require_chunk.__toESM(require("effect/Micro"));
6
+ const __uploadthing_shared = require_chunk.__toESM(require("@uploadthing/shared"));
7
+ const effect_Predicate = require_chunk.__toESM(require("effect/Predicate"));
8
+
9
+ //#region src/_internal/client-future.ts
10
+ /**
11
+ * Error indicating the XHR request failed
12
+ * @public
13
+ */
14
+ var XHRError = class extends effect_Micro.TaggedError("XHRError") {};
15
+ /**
16
+ * Error indicating the upload was rejected during upload to the storage provider
17
+ * @public
18
+ */
19
+ var UTStorageError = class extends effect_Micro.TaggedError("UTStorageError") {};
20
+ /**
21
+ * Error indicating the request to your UploadThing server failed
22
+ * @public
23
+ */
24
+ var UTServerError = class extends effect_Micro.TaggedError("UTServerError") {};
25
+ /**
26
+ * Predicate function to check if a file is pending
27
+ * @public
28
+ */
29
+ function isPendingFile(file) {
30
+ return file.status === "pending";
31
+ }
32
+ /**
33
+ * Predicate function to check if a file is uploading
34
+ * @public
35
+ */
36
+ function isUploadingFile(file) {
37
+ return file.status === "uploading";
38
+ }
39
+ /**
40
+ * Predicate function to check if a file is failed
41
+ * @public
42
+ */
43
+ function isFailedFile(file) {
44
+ return file.status === "failed";
45
+ }
46
+ /**
47
+ * Predicate function to check if a file is uploaded
48
+ * @public
49
+ */
50
+ function isUploadedFile(file) {
51
+ return file.status === "uploaded";
52
+ }
53
+ /**
54
+ * @internal
55
+ */
56
+ function makePendingFile(file) {
57
+ return Object.assign(file, {
58
+ status: "pending",
59
+ sent: 0,
60
+ key: null,
61
+ customId: null
62
+ });
63
+ }
64
+ /**
65
+ * Modifies a pending file to an uploading file in place
66
+ * @internal
67
+ */
68
+ function transitionToUploading(file, rangeStart) {
69
+ const uploadingFile = file;
70
+ uploadingFile.sent = rangeStart;
71
+ uploadingFile.status = "uploading";
72
+ return uploadingFile;
73
+ }
74
+ /**
75
+ * Modifies an uploading file to an uploaded file in place
76
+ * @internal
77
+ */
78
+ function transitionToUploaded(file, xhrResult) {
79
+ const uploadedFile = file;
80
+ uploadedFile.status = "uploaded";
81
+ uploadedFile.data = xhrResult.serverData;
82
+ uploadedFile.hash = xhrResult.fileHash;
83
+ uploadedFile.url = xhrResult.ufsUrl;
84
+ return uploadedFile;
85
+ }
86
+ /**
87
+ * Modifies a pending or uploading file to a failed file in place
88
+ * @internal
89
+ */
90
+ function transitionToFailed(file, reason) {
91
+ const failedFile = file;
92
+ failedFile.status = "failed";
93
+ failedFile.reason = reason;
94
+ return failedFile;
95
+ }
96
+ /**
97
+ * Upload a file to the storage provider
98
+ * Throughout the upload, the file's status and progress will be updated
99
+ * @remarks This function never rejects
100
+ * @internal
101
+ */
102
+ function uploadFile(url, { file, files, XHRImpl,...options }) {
103
+ return (0, __uploadthing_shared.fetchEff)(url, {
104
+ method: "HEAD",
105
+ headers: options.traceHeaders
106
+ }).pipe(effect_Micro.map(({ headers }) => Number.parseInt(headers.get("x-ut-range-start") ?? "0")), effect_Micro.map((rangeStart) => transitionToUploading(file, rangeStart)), effect_Micro.tap((uploadingFile) => {
107
+ options.onEvent({
108
+ type: "upload-started",
109
+ file: uploadingFile,
110
+ files
111
+ });
112
+ }), effect_Micro.flatMap((uploadingFile) => effect_Micro.async((resume) => {
113
+ const xhr = new XHRImpl();
114
+ xhr.open("PUT", url, true);
115
+ const rangeStart = uploadingFile.sent;
116
+ xhr.setRequestHeader("Range", `bytes=${rangeStart}-`);
117
+ xhr.setRequestHeader("x-uploadthing-version", require_package.version);
118
+ xhr.setRequestHeader("b3", options.traceHeaders.b3);
119
+ xhr.setRequestHeader("traceparent", options.traceHeaders.traceparent);
120
+ xhr.responseType = "json";
121
+ xhr.upload.addEventListener("progress", (ev) => {
122
+ uploadingFile.sent = rangeStart + ev.loaded;
123
+ options.onEvent({
124
+ type: "upload-progress",
125
+ file: uploadingFile,
126
+ files
127
+ });
128
+ });
129
+ xhr.addEventListener("load", () => {
130
+ if (xhr.status > 299 || effect_Predicate.hasProperty(xhr.response, "error")) resume(new UTStorageError({
131
+ message: String(xhr.response.error),
132
+ response: xhr.response
133
+ }));
134
+ else {
135
+ const uploadedFile = transitionToUploaded(uploadingFile, xhr.response);
136
+ options.onEvent({
137
+ type: "upload-completed",
138
+ file: uploadedFile,
139
+ files
140
+ });
141
+ resume(effect_Micro.succeed(uploadedFile));
142
+ }
143
+ });
144
+ xhr.addEventListener("error", () => {
145
+ resume(new XHRError({
146
+ message: `XHR failed ${xhr.status} ${xhr.statusText}`,
147
+ xhr
148
+ }));
149
+ });
150
+ const formData = new FormData();
151
+ /**
152
+ * iOS/React Native FormData handling requires special attention:
153
+ *
154
+ * Issue: In React Native, iOS crashes with "attempt to insert nil object" when appending File directly
155
+ * to FormData. This happens because iOS tries to create NSDictionary from the file object and expects
156
+ * specific structure {uri, type, name}.
157
+ *
158
+ *
159
+ * Note: Don't try to use Blob or modify File object - iOS specifically needs plain object
160
+ * with these properties to create valid NSDictionary.
161
+ */
162
+ if ("uri" in file) formData.append("file", {
163
+ uri: file.uri,
164
+ type: file.type,
165
+ name: file.name,
166
+ ...rangeStart > 0 && { range: rangeStart }
167
+ });
168
+ else formData.append("file", rangeStart > 0 ? file.slice(rangeStart) : file);
169
+ xhr.send(formData);
170
+ return effect_Micro.sync(() => xhr.abort());
171
+ })), effect_Micro.catchAll((error) => {
172
+ const failedFile = transitionToFailed(file, error);
173
+ options.onEvent({
174
+ type: "upload-failed",
175
+ file: failedFile,
176
+ files
177
+ });
178
+ return effect_Micro.succeed(failedFile);
179
+ }));
180
+ }
181
+ /**
182
+ * Request presigned URLs from your server for a set of files
183
+ * @internal
184
+ */
185
+ function requestPresignedUrls(options) {
186
+ const reportEventToUT = require_ut_reporter.createUTReporter({
187
+ endpoint: String(options.endpoint),
188
+ package: options.package,
189
+ url: options.url,
190
+ headers: options.headers,
191
+ traceHeaders: options.traceHeaders
192
+ });
193
+ return reportEventToUT("upload", {
194
+ input: options.input,
195
+ files: options.files.map((f) => ({
196
+ name: f.name,
197
+ size: f.size,
198
+ type: f.type,
199
+ lastModified: f.lastModified
200
+ }))
201
+ }).pipe(effect_Micro.mapError((error) => new UTServerError({
202
+ message: error.message,
203
+ cause: error,
204
+ data: error.data
205
+ })));
206
+ }
207
+ /**
208
+ * Upload a set of files to the storage provider
209
+ * @internal
210
+ */
211
+ function uploadFiles(endpoint, options) {
212
+ const pendingFiles = options.files.map(makePendingFile);
213
+ const traceHeaders = require_ut_reporter.generateTraceHeaders();
214
+ return requestPresignedUrls({
215
+ endpoint,
216
+ files: options.files,
217
+ url: options.url,
218
+ input: options.input,
219
+ headers: options.headers,
220
+ package: options.package,
221
+ traceHeaders
222
+ }).pipe(effect_Micro.map(effect_Array.zip(pendingFiles)), effect_Micro.tap((pairs) => {
223
+ for (const [presigned, file] of pairs) {
224
+ file.key = presigned.key;
225
+ file.customId = presigned.customId;
226
+ }
227
+ options.onEvent({
228
+ type: "presigned-received",
229
+ files: pendingFiles
230
+ });
231
+ }), effect_Micro.flatMap((pairs) => effect_Micro.forEach(pairs, ([presigned, file]) => uploadFile(presigned.url, {
232
+ file,
233
+ files: pendingFiles,
234
+ input: options.input,
235
+ onEvent: options.onEvent,
236
+ XHRImpl: globalThis.XMLHttpRequest,
237
+ traceHeaders
238
+ }), { concurrency: 6 })));
239
+ }
240
+
241
+ //#endregion
242
+ //#region src/client-future.ts
243
+ const version$1 = require_package.version;
244
+ /**
245
+ * Generate a typed uploader for a given FileRouter
246
+ * @public
247
+ * @remarks This API is not covered by semver
248
+ */
249
+ const future_genUploader = (initOpts) => {
250
+ const routeRegistry = (0, __uploadthing_shared.createIdentityProxy)();
251
+ const controllableUpload = async (slug, options) => {
252
+ const endpoint = typeof slug === "function" ? slug(routeRegistry) : slug;
253
+ const fetchFn = initOpts?.fetch ?? window.fetch;
254
+ const traceHeaders = require_ut_reporter.generateTraceHeaders();
255
+ const pExit = await requestPresignedUrls({
256
+ endpoint: String(endpoint),
257
+ files: options.files,
258
+ url: (0, __uploadthing_shared.resolveMaybeUrlArg)(initOpts?.url),
259
+ input: options.input,
260
+ headers: options.headers,
261
+ traceHeaders
262
+ }).pipe(effect_Micro.provideService(__uploadthing_shared.FetchContext, fetchFn), (effect) => effect_Micro.runPromiseExit(effect, options.signal && { signal: options.signal }));
263
+ if (pExit._tag === "Failure") throw effect_Micro.causeSquash(pExit.cause);
264
+ const presigneds = pExit.value;
265
+ const pendingFiles = options.files.map(makePendingFile);
266
+ options.onEvent({
267
+ type: "presigned-received",
268
+ files: pendingFiles
269
+ });
270
+ const uploads = /* @__PURE__ */ new Map();
271
+ const uploadEffect = (file, presigned) => uploadFile(presigned.url, {
272
+ file,
273
+ files: pendingFiles,
274
+ input: options.input,
275
+ onEvent: options.onEvent,
276
+ traceHeaders,
277
+ XHRImpl: globalThis.XMLHttpRequest
278
+ }).pipe(effect_Micro.provideService(__uploadthing_shared.FetchContext, fetchFn));
279
+ for (const [presigned, file] of effect_Array.zip(presigneds, pendingFiles)) {
280
+ file.key = presigned.key;
281
+ file.customId = presigned.customId;
282
+ const deferred = require_ut_reporter.createDeferred();
283
+ uploads.set(file, {
284
+ presigned,
285
+ deferred
286
+ });
287
+ effect_Micro.runPromiseExit(uploadEffect(file, presigned), { signal: deferred.ac.signal }).then((result) => {
288
+ if (result._tag === "Success") return deferred.resolve(result.value);
289
+ else if (result.cause._tag === "Interrupt") throw new __uploadthing_shared.UploadPausedError();
290
+ throw effect_Micro.causeSquash(result.cause);
291
+ }).catch((err) => {
292
+ if (err instanceof __uploadthing_shared.UploadPausedError) return;
293
+ deferred.reject(err);
294
+ });
295
+ }
296
+ /**
297
+ * Pause an ongoing upload
298
+ * @param file The file upload you want to pause. Can be omitted to pause all files
299
+ */
300
+ const pauseUpload = (file) => {
301
+ const files = effect_Array.ensure(file ?? options.files);
302
+ for (const file$1 of files) {
303
+ const upload = uploads.get(file$1);
304
+ if (!upload) return;
305
+ if (upload.deferred.ac.signal.aborted) return;
306
+ upload.deferred.ac.abort();
307
+ }
308
+ };
309
+ /**
310
+ * Abort an upload
311
+ * @param file The file upload you want to abort. Can be omitted to abort all files
312
+ */
313
+ const abortUpload = (file) => {
314
+ const files = effect_Array.ensure(file ?? options.files);
315
+ for (const file$1 of files) {
316
+ const upload = uploads.get(file$1);
317
+ if (!upload) throw "No upload found";
318
+ if (upload.deferred.ac.signal.aborted === false) {
319
+ upload.deferred.ac.abort();
320
+ const failedFile = transitionToFailed(file$1, new __uploadthing_shared.UploadAbortedError());
321
+ upload.deferred.resolve(failedFile);
322
+ }
323
+ }
324
+ options.onEvent({
325
+ type: "upload-aborted",
326
+ files
327
+ });
328
+ };
329
+ options.signal?.addEventListener("abort", () => {
330
+ abortUpload();
331
+ });
332
+ /**
333
+ * Resume a paused upload
334
+ * @param file The file upload you want to resume. Can be omitted to resume all files
335
+ */
336
+ const resumeUpload = (file) => {
337
+ const files = effect_Array.ensure(file ?? options.files);
338
+ for (const file$1 of files) {
339
+ const upload = uploads.get(file$1);
340
+ if (!upload) throw "No upload found";
341
+ upload.deferred.ac = new AbortController();
342
+ effect_Micro.runPromiseExit(uploadEffect(file$1, upload.presigned), { signal: upload.deferred.ac.signal }).then((result) => {
343
+ if (result._tag === "Success") return upload.deferred.resolve(result.value);
344
+ else if (result.cause._tag === "Interrupt") throw new __uploadthing_shared.UploadPausedError();
345
+ throw effect_Micro.causeSquash(result.cause);
346
+ }).catch((err) => {
347
+ if (err instanceof __uploadthing_shared.UploadPausedError) return;
348
+ upload.deferred.reject(err);
349
+ });
350
+ }
351
+ };
352
+ /**
353
+ * Wait for an upload to complete
354
+ * @param file The file upload you want to wait for. Can be omitted to wait for all files
355
+ */
356
+ const done = async (file) => {
357
+ const promises = [];
358
+ const files = effect_Array.ensure(file ?? options.files);
359
+ for (const file$1 of files) {
360
+ const upload = uploads.get(file$1);
361
+ if (!upload) throw "No upload found";
362
+ promises.push(upload.deferred.promise);
363
+ }
364
+ const results = await Promise.all(promises);
365
+ return file ? results[0] : results;
366
+ };
367
+ return {
368
+ pauseUpload,
369
+ abortUpload,
370
+ resumeUpload,
371
+ done
372
+ };
373
+ };
374
+ const uploadFiles$1 = (slug, opts) => controllableUpload(slug, opts).then((_) => _.done());
375
+ return {
376
+ uploadFiles: uploadFiles$1,
377
+ createUpload: controllableUpload,
378
+ routeRegistry
379
+ };
380
+ };
381
+
382
+ //#endregion
383
+ exports.UTServerError = UTServerError;
384
+ exports.UTStorageError = UTStorageError;
385
+ Object.defineProperty(exports, 'UploadAbortedError', {
386
+ enumerable: true,
387
+ get: function () {
388
+ return __uploadthing_shared.UploadAbortedError;
389
+ }
390
+ });
391
+ Object.defineProperty(exports, 'UploadPausedError', {
392
+ enumerable: true,
393
+ get: function () {
394
+ return __uploadthing_shared.UploadPausedError;
395
+ }
396
+ });
397
+ exports.XHRError = XHRError;
398
+ exports.future_genUploader = future_genUploader;
399
+ Object.defineProperty(exports, 'generateClientDropzoneAccept', {
400
+ enumerable: true,
401
+ get: function () {
402
+ return __uploadthing_shared.generateClientDropzoneAccept;
403
+ }
404
+ });
405
+ Object.defineProperty(exports, 'generateMimeTypes', {
406
+ enumerable: true,
407
+ get: function () {
408
+ return __uploadthing_shared.generateMimeTypes;
409
+ }
410
+ });
411
+ Object.defineProperty(exports, 'generatePermittedFileTypes', {
412
+ enumerable: true,
413
+ get: function () {
414
+ return __uploadthing_shared.generatePermittedFileTypes;
415
+ }
416
+ });
417
+ exports.isFailedFile = isFailedFile;
418
+ exports.isPendingFile = isPendingFile;
419
+ exports.isUploadedFile = isUploadedFile;
420
+ exports.isUploadingFile = isUploadingFile;
421
+ exports.makePendingFile = makePendingFile;
422
+ exports.requestPresignedUrls = requestPresignedUrls;
423
+ exports.transitionToFailed = transitionToFailed;
424
+ exports.uploadFile = uploadFile;
425
+ exports.uploadFiles = uploadFiles;
426
+ exports.version = version$1;