@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,30 @@
1
+ import { FileRouter, RouteHandlerOptions, UTFiles, UTRegion, UnsetMarker, UploadBuilder } from "../dist/types-DiVC1t2V.cjs";
2
+ import { CreateBuilderOptions } from "../dist/upload-builder-BUa7tovh.cjs";
3
+ import * as _uploadthing_shared14 from "@uploadthing/shared";
4
+ import { Json } from "@uploadthing/shared";
5
+ import { ActionFunctionArgs } from "@remix-run/server-runtime";
6
+
7
+ //#region src/remix.d.ts
8
+
9
+ type AdapterArgs = {
10
+ event: ActionFunctionArgs;
11
+ };
12
+ declare const createUploadthing: <TErrorShape extends Json>(opts?: CreateBuilderOptions<TErrorShape>) => <TRouteOptions extends _uploadthing_shared14.RouteOptions>(input: _uploadthing_shared14.FileRouterInputConfig, config?: TRouteOptions | undefined) => UploadBuilder<{
13
+ _routeOptions: TRouteOptions;
14
+ _input: {
15
+ in: UnsetMarker;
16
+ out: UnsetMarker;
17
+ };
18
+ _metadata: UnsetMarker;
19
+ _adapterFnArgs: AdapterArgs;
20
+ _errorShape: TErrorShape;
21
+ _errorFn: UnsetMarker;
22
+ _output: UnsetMarker;
23
+ }>;
24
+ declare const createRouteHandler: <TRouter extends FileRouter>(opts: RouteHandlerOptions<TRouter>) => {
25
+ action: (args_0: ActionFunctionArgs) => Promise<Response>;
26
+ loader: (args_0: ActionFunctionArgs) => Promise<Response>;
27
+ };
28
+ //#endregion
29
+ export { type FileRouter, UTFiles, createRouteHandler, createUploadthing, UTRegion as experimental_UTRegion };
30
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/remix.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAoBK,WAAA,GAKyB;EAAW,KAAhC,EAJA,kBAIA;CAAoB;AAAa,cAD7B,iBAC6B,EAAA,CAAA,oBADY,IACZ,CAAA,CAAA,IAAA,CAAA,EAAjC,oBAAiC,CAAZ,WAAY,CAAA,EAAA,GAAA,CAAA,sBAAb,qBAAA,CAAa,YAAA,CAAA,CAAA,KAAA,EAAA,qBAAA,CAAA,qBAAA,EAAA,MAAA,CAAA,EAAA,aAAA,GAAA,SAAA,EAAA,gBAAA,CAAA;EAAA,aAAA,EAAA,aAAA;EAAA,MAAA,EAAA;;;;;;;;;AAAA,CAAA,CAAA;AAG7B,cAAA,kBAUZ,EAAA,CAAA,gBAVkD,UAUlD,CAAA,CAAA,IAAA,EATO,mBASP,CAT2B,OAS3B,CAAA,EAAA,GAAA;EAAA,MAAA,EAAA,CAAA,MAAA,EAT0B,kBAS1B,EAAA,UAAA,SAAA,CAAA;EAAA,MAVkD,EAAA,CAAA,MAAA,oBAAA,EAAA,UAAA,SAAA,CAAA;CAAU"}
@@ -0,0 +1,30 @@
1
+ import { FileRouter, RouteHandlerOptions, UTFiles, UTRegion, UnsetMarker, UploadBuilder } from "../dist/types-Bs3w2d_3.js";
2
+ import { CreateBuilderOptions } from "../dist/upload-builder-BcFawEj0.js";
3
+ import * as _uploadthing_shared14 from "@uploadthing/shared";
4
+ import { Json } from "@uploadthing/shared";
5
+ import { ActionFunctionArgs } from "@remix-run/server-runtime";
6
+
7
+ //#region src/remix.d.ts
8
+
9
+ type AdapterArgs = {
10
+ event: ActionFunctionArgs;
11
+ };
12
+ declare const createUploadthing: <TErrorShape extends Json>(opts?: CreateBuilderOptions<TErrorShape>) => <TRouteOptions extends _uploadthing_shared14.RouteOptions>(input: _uploadthing_shared14.FileRouterInputConfig, config?: TRouteOptions | undefined) => UploadBuilder<{
13
+ _routeOptions: TRouteOptions;
14
+ _input: {
15
+ in: UnsetMarker;
16
+ out: UnsetMarker;
17
+ };
18
+ _metadata: UnsetMarker;
19
+ _adapterFnArgs: AdapterArgs;
20
+ _errorShape: TErrorShape;
21
+ _errorFn: UnsetMarker;
22
+ _output: UnsetMarker;
23
+ }>;
24
+ declare const createRouteHandler: <TRouter extends FileRouter>(opts: RouteHandlerOptions<TRouter>) => {
25
+ action: (args_0: ActionFunctionArgs) => Promise<Response>;
26
+ loader: (args_0: ActionFunctionArgs) => Promise<Response>;
27
+ };
28
+ //#endregion
29
+ export { type FileRouter, UTFiles, createRouteHandler, createUploadthing, UTRegion as experimental_UTRegion };
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/remix.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAoBK,WAAA,GAKyB;EAAW,KAAhC,EAJA,kBAIA;CAAoB;AAAa,cAD7B,iBAC6B,EAAA,CAAA,oBADY,IACZ,CAAA,CAAA,IAAA,CAAA,EAAjC,oBAAiC,CAAZ,WAAY,CAAA,EAAA,GAAA,CAAA,sBAAb,qBAAA,CAAa,YAAA,CAAA,CAAA,KAAA,EAAA,qBAAA,CAAA,qBAAA,EAAA,MAAA,CAAA,EAAA,aAAA,GAAA,SAAA,EAAA,gBAAA,CAAA;EAAA,aAAA,EAAA,aAAA;EAAA,MAAA,EAAA;;;;;;;;;AAAA,CAAA,CAAA;AAG7B,cAAA,kBAUZ,EAAA,CAAA,gBAVkD,UAUlD,CAAA,CAAA,IAAA,EATO,mBASP,CAT2B,OAS3B,CAAA,EAAA,GAAA;EAAA,MAAA,EAAA,CAAA,MAAA,EAT0B,kBAS1B,EAAA,UAAA,SAAA,CAAA;EAAA,MAVkD,EAAA,CAAA,MAAA,oBAAA,EAAA,UAAA,SAAA,CAAA;CAAU"}
package/remix/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import "../dist/package-DpScpvTA.js";
2
+ import "../dist/deprecations-pLmw6Ytd.js";
3
+ import "../dist/shared-schemas-BmG5ARoX.js";
4
+ import { UTFiles, UTRegion, createBuilder, makeAdapterHandler } from "../dist/upload-builder-BlFOAnsv.js";
5
+ import * as Effect from "effect/Effect";
6
+
7
+ //#region src/remix.ts
8
+ const createUploadthing = (opts) => createBuilder(opts);
9
+ const createRouteHandler = (opts) => {
10
+ const handler = makeAdapterHandler((args) => Effect.succeed({ event: args }), (args) => Effect.succeed(args.request), opts, "remix");
11
+ return {
12
+ action: handler,
13
+ loader: handler
14
+ };
15
+ };
16
+
17
+ //#endregion
18
+ export { UTFiles, createRouteHandler, createUploadthing, UTRegion as experimental_UTRegion };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["opts?: CreateBuilderOptions<TErrorShape>","opts: RouteHandlerOptions<TRouter>"],"sources":["../src/remix.ts"],"sourcesContent":["import type { ActionFunctionArgs } from \"@remix-run/server-runtime\";\nimport * as Effect from \"effect/Effect\";\n\nimport type { Json } from \"@uploadthing/shared\";\n\nimport { makeAdapterHandler } from \"./_internal/handler\";\nimport type { CreateBuilderOptions } from \"./_internal/upload-builder\";\nimport { createBuilder } from \"./_internal/upload-builder\";\nimport type { FileRouter, RouteHandlerOptions } from \"./types\";\n\nexport type { FileRouter };\nexport {\n UTFiles,\n /**\n * This is an experimental feature.\n * You need to be feature flagged on our backend to use this\n */\n UTRegion as experimental_UTRegion,\n} from \"./_internal/types\";\n\ntype AdapterArgs = {\n event: ActionFunctionArgs;\n};\n\nexport const createUploadthing = <TErrorShape extends Json>(\n opts?: CreateBuilderOptions<TErrorShape>,\n) => createBuilder<AdapterArgs, TErrorShape>(opts);\n\nexport const createRouteHandler = <TRouter extends FileRouter>(\n opts: RouteHandlerOptions<TRouter>,\n) => {\n const handler = makeAdapterHandler<[ActionFunctionArgs], AdapterArgs>(\n (args) => Effect.succeed({ event: args }),\n (args) => Effect.succeed(args.request),\n opts,\n \"remix\",\n );\n return { action: handler, loader: handler };\n};\n"],"mappings":";;;;;;;AAwBA,MAAa,oBAAoB,CAC/BA,SACG,cAAwC,KAAK;AAElD,MAAa,qBAAqB,CAChCC,SACG;CACH,MAAM,UAAU,mBACd,CAAC,SAAS,OAAO,QAAQ,EAAE,OAAO,KAAM,EAAC,EACzC,CAAC,SAAS,OAAO,QAAQ,KAAK,QAAQ,EACtC,MACA,QACD;AACD,QAAO;EAAE,QAAQ;EAAS,QAAQ;CAAS;AAC5C"}
@@ -0,0 +1,414 @@
1
+ const require_chunk = require('../dist/chunk-CUT6urMc.cjs');
2
+ const require_package = require('../dist/package-BQ_k22T9.cjs');
3
+ const require_deprecations = require('../dist/deprecations-DPGpmqha.cjs');
4
+ require('../dist/shared-schemas-CG9VaBtT.cjs');
5
+ const require_upload_builder = require('../dist/upload-builder-D6Ken9H0.cjs');
6
+ const effect_Array = require_chunk.__toESM(require("effect/Array"));
7
+ const __uploadthing_shared = require_chunk.__toESM(require("@uploadthing/shared"));
8
+ const effect_Function = require_chunk.__toESM(require("effect/Function"));
9
+ const effect_Predicate = require_chunk.__toESM(require("effect/Predicate"));
10
+ const effect_Effect = require_chunk.__toESM(require("effect/Effect"));
11
+ const __effect_platform_HttpClient = require_chunk.__toESM(require("@effect/platform/HttpClient"));
12
+ const __effect_platform_HttpClientRequest = require_chunk.__toESM(require("@effect/platform/HttpClientRequest"));
13
+ const __effect_platform_HttpClientResponse = require_chunk.__toESM(require("@effect/platform/HttpClientResponse"));
14
+ const effect_Redacted = require_chunk.__toESM(require("effect/Redacted"));
15
+ const effect_Schema = require_chunk.__toESM(require("effect/Schema"));
16
+ const effect_Cause = require_chunk.__toESM(require("effect/Cause"));
17
+ const __uploadthing_mime_types = require_chunk.__toESM(require("@uploadthing/mime-types"));
18
+
19
+ //#region src/sdk/ut-file.ts
20
+ /**
21
+ * Extension of the Blob class that simplifies setting the `name` and `customId` properties,
22
+ * similar to the built-in File class from Node > 20.
23
+ */
24
+ var UTFile = class extends Blob {
25
+ name;
26
+ lastModified;
27
+ customId;
28
+ constructor(parts, name, options) {
29
+ const optionsWithDefaults = {
30
+ ...options,
31
+ type: options?.type ?? ((0, __uploadthing_mime_types.lookup)(name) || "application/octet-stream"),
32
+ lastModified: options?.lastModified ?? Date.now()
33
+ };
34
+ super(parts, optionsWithDefaults);
35
+ this.name = name;
36
+ this.customId = optionsWithDefaults.customId;
37
+ this.lastModified = optionsWithDefaults.lastModified;
38
+ }
39
+ };
40
+
41
+ //#endregion
42
+ //#region src/_internal/upload-server.ts
43
+ const uploadWithoutProgress = (file, presigned) => effect_Effect.gen(function* () {
44
+ const formData = new FormData();
45
+ formData.append("file", file);
46
+ const httpClient = (yield* __effect_platform_HttpClient.HttpClient).pipe(__effect_platform_HttpClient.filterStatusOk);
47
+ const json = yield* __effect_platform_HttpClientRequest.put(presigned.url).pipe(__effect_platform_HttpClientRequest.bodyFormData(formData), __effect_platform_HttpClientRequest.setHeader("Range", "bytes=0-"), __effect_platform_HttpClientRequest.setHeader("x-uploadthing-version", require_package.version), httpClient.execute, effect_Effect.tapError(require_upload_builder.logHttpClientError("Failed to upload file")), effect_Effect.mapError((e) => new __uploadthing_shared.UploadThingError({
48
+ code: "UPLOAD_FAILED",
49
+ message: "Failed to upload file",
50
+ cause: e
51
+ })), effect_Effect.andThen((_) => _.json), effect_Effect.andThen(effect_Function.unsafeCoerce), effect_Effect.scoped);
52
+ yield* effect_Effect.logDebug(`File ${file.name} uploaded successfully`).pipe(effect_Effect.annotateLogs("json", json));
53
+ return {
54
+ ...json,
55
+ get url() {
56
+ require_deprecations.logDeprecationWarning("`file.url` is deprecated and will be removed in uploadthing v9. Use `file.ufsUrl` instead.");
57
+ return json.url;
58
+ },
59
+ get appUrl() {
60
+ require_deprecations.logDeprecationWarning("`file.appUrl` is deprecated and will be removed in uploadthing v9. Use `file.ufsUrl` instead.");
61
+ return json.appUrl;
62
+ }
63
+ };
64
+ });
65
+
66
+ //#endregion
67
+ //#region src/sdk/utils.ts
68
+ function guardServerOnly() {
69
+ if (typeof window !== "undefined") throw new __uploadthing_shared.UploadThingError({
70
+ code: "INTERNAL_SERVER_ERROR",
71
+ message: "The `utapi` can only be used on the server."
72
+ });
73
+ }
74
+ const downloadFile = (_url) => effect_Effect.gen(function* () {
75
+ let url = effect_Predicate.isRecord(_url) ? _url.url : _url;
76
+ if (typeof url === "string") {
77
+ if (url.startsWith("data:")) return yield* effect_Effect.fail({
78
+ code: "BAD_REQUEST",
79
+ message: "Please use uploadFiles() for data URLs. uploadFilesFromUrl() is intended for use with remote URLs only.",
80
+ data: void 0
81
+ });
82
+ }
83
+ url = new URL(url);
84
+ const { name = url.pathname.split("/").pop() ?? "unknown-filename", customId = void 0 } = effect_Predicate.isRecord(_url) ? _url : {};
85
+ const httpClient = (yield* __effect_platform_HttpClient.HttpClient).pipe(__effect_platform_HttpClient.filterStatusOk);
86
+ const arrayBuffer = yield* __effect_platform_HttpClientRequest.get(url).pipe(__effect_platform_HttpClientRequest.modify({ headers: {} }), httpClient.execute, effect_Effect.flatMap((_) => _.arrayBuffer), effect_Effect.mapError((cause) => {
87
+ return {
88
+ code: "BAD_REQUEST",
89
+ message: `Failed to download requested file: ${cause.message}`,
90
+ data: cause.toJSON()
91
+ };
92
+ }), effect_Effect.scoped);
93
+ return new UTFile([arrayBuffer], name, {
94
+ customId,
95
+ lastModified: Date.now()
96
+ });
97
+ }).pipe(effect_Effect.withLogSpan("downloadFile"));
98
+ const generatePresignedUrl = (file, cd, acl) => effect_Effect.gen(function* () {
99
+ const { apiKey, appId } = yield* require_upload_builder.UTToken;
100
+ const baseUrl = yield* require_upload_builder.IngestUrl(void 0);
101
+ const key = yield* (0, __uploadthing_shared.generateKey)(file, appId);
102
+ const url = yield* (0, __uploadthing_shared.generateSignedURL)(`${baseUrl}/${key}`, apiKey, { data: {
103
+ "x-ut-identifier": appId,
104
+ "x-ut-file-name": file.name,
105
+ "x-ut-file-size": file.size,
106
+ "x-ut-file-type": file.type,
107
+ "x-ut-custom-id": file.customId,
108
+ "x-ut-content-disposition": cd,
109
+ "x-ut-acl": acl
110
+ } });
111
+ return {
112
+ url,
113
+ key
114
+ };
115
+ }).pipe(effect_Effect.withLogSpan("generatePresignedUrl"));
116
+ const uploadFile = (file, opts) => effect_Effect.gen(function* () {
117
+ const presigned = yield* generatePresignedUrl(file, opts.contentDisposition ?? "inline", opts.acl).pipe(effect_Effect.catchTag("UploadThingError", (e) => effect_Effect.fail(__uploadthing_shared.UploadThingError.toObject(e))), effect_Effect.catchTag("ConfigError", () => effect_Effect.fail({
118
+ code: "INVALID_SERVER_CONFIG",
119
+ message: "Failed to generate presigned URL"
120
+ })));
121
+ const response = yield* uploadWithoutProgress(file, presigned).pipe(effect_Effect.catchTag("UploadThingError", (e) => effect_Effect.fail(__uploadthing_shared.UploadThingError.toObject(e))), effect_Effect.catchTag("ResponseError", (e) => effect_Effect.fail({
122
+ code: "UPLOAD_FAILED",
123
+ message: "Failed to upload file",
124
+ data: e.toJSON()
125
+ })));
126
+ return {
127
+ key: presigned.key,
128
+ url: response.url,
129
+ appUrl: response.appUrl,
130
+ ufsUrl: response.ufsUrl,
131
+ lastModified: file.lastModified ?? Date.now(),
132
+ name: file.name,
133
+ size: file.size,
134
+ type: file.type,
135
+ customId: file.customId ?? null,
136
+ fileHash: response.fileHash
137
+ };
138
+ }).pipe(effect_Effect.withLogSpan("uploadFile"));
139
+
140
+ //#endregion
141
+ //#region src/sdk/index.ts
142
+ var UTApi = class {
143
+ fetch;
144
+ defaultKeyType;
145
+ runtime;
146
+ opts;
147
+ constructor(options) {
148
+ guardServerOnly();
149
+ this.opts = options ?? {};
150
+ this.fetch = this.opts.fetch ?? globalThis.fetch;
151
+ this.defaultKeyType = this.opts.defaultKeyType ?? "fileKey";
152
+ this.runtime = require_upload_builder.makeRuntime(this.fetch, this.opts);
153
+ }
154
+ requestUploadThing = (pathname, body, responseSchema) => effect_Effect.gen(this, function* () {
155
+ const { apiKey } = yield* require_upload_builder.UTToken;
156
+ const baseUrl = yield* require_upload_builder.ApiUrl;
157
+ const httpClient = (yield* __effect_platform_HttpClient.HttpClient).pipe(__effect_platform_HttpClient.filterStatusOk);
158
+ return yield* __effect_platform_HttpClientRequest.post(pathname).pipe(__effect_platform_HttpClientRequest.prependUrl(baseUrl), __effect_platform_HttpClientRequest.bodyUnsafeJson(body), __effect_platform_HttpClientRequest.setHeaders({
159
+ "x-uploadthing-version": require_package.version,
160
+ "x-uploadthing-be-adapter": "server-sdk",
161
+ "x-uploadthing-api-key": effect_Redacted.value(apiKey)
162
+ }), httpClient.execute, effect_Effect.tapBoth({
163
+ onSuccess: require_upload_builder.logHttpClientResponse("UploadThing API Response"),
164
+ onFailure: require_upload_builder.logHttpClientError("Failed to request UploadThing API")
165
+ }), effect_Effect.flatMap(__effect_platform_HttpClientResponse.schemaBodyJson(responseSchema)), effect_Effect.scoped);
166
+ }).pipe(effect_Effect.catchTag("ConfigError", (e) => new __uploadthing_shared.UploadThingError({
167
+ code: "INVALID_SERVER_CONFIG",
168
+ message: "There was an error with the server configuration. More info can be found on this error's `cause` property",
169
+ cause: e
170
+ })), effect_Effect.withLogSpan("utapi.#requestUploadThing"));
171
+ executeAsync = async (program, signal) => {
172
+ const exit = await program.pipe(effect_Effect.withLogSpan("utapi.#executeAsync"), (e) => this.runtime.runPromiseExit(e, signal ? { signal } : void 0));
173
+ if (exit._tag === "Failure") throw effect_Cause.squash(exit.cause);
174
+ return exit.value;
175
+ };
176
+ uploadFiles(files, opts) {
177
+ guardServerOnly();
178
+ const concurrency = opts?.concurrency ?? 1;
179
+ if (concurrency < 1 || concurrency > 25) throw new __uploadthing_shared.UploadThingError({
180
+ code: "BAD_REQUEST",
181
+ message: "concurrency must be a positive integer between 1 and 25"
182
+ });
183
+ const program = effect_Effect.forEach(effect_Array.ensure(files), (file) => uploadFile(file, opts ?? {}).pipe(effect_Effect.match({
184
+ onSuccess: (data) => ({
185
+ data,
186
+ error: null
187
+ }),
188
+ onFailure: (error) => ({
189
+ data: null,
190
+ error
191
+ })
192
+ })), { concurrency }).pipe(effect_Effect.map((ups) => Array.isArray(files) ? ups : ups[0]), effect_Effect.tap((res) => effect_Effect.logDebug("Finished uploading").pipe(effect_Effect.annotateLogs("uploadResult", res))), effect_Effect.withLogSpan("uploadFiles"));
193
+ return this.executeAsync(program, opts?.signal);
194
+ }
195
+ uploadFilesFromUrl(urls, opts) {
196
+ guardServerOnly();
197
+ const concurrency = opts?.concurrency ?? 1;
198
+ if (concurrency < 1 || concurrency > 25) throw new __uploadthing_shared.UploadThingError({
199
+ code: "BAD_REQUEST",
200
+ message: "concurrency must be a positive integer between 1 and 25"
201
+ });
202
+ const program = effect_Effect.forEach(effect_Array.ensure(urls), (url) => downloadFile(url).pipe(effect_Effect.flatMap((file) => uploadFile(file, opts ?? {})), effect_Effect.match({
203
+ onSuccess: (data) => ({
204
+ data,
205
+ error: null
206
+ }),
207
+ onFailure: (error) => ({
208
+ data: null,
209
+ error
210
+ })
211
+ })), { concurrency }).pipe(effect_Effect.map((ups) => Array.isArray(urls) ? ups : ups[0]), effect_Effect.tap((res) => effect_Effect.logDebug("Finished uploading").pipe(effect_Effect.annotateLogs("uploadResult", res))), effect_Effect.withLogSpan("uploadFiles")).pipe(effect_Effect.withLogSpan("uploadFilesFromUrl"));
212
+ return this.executeAsync(program, opts?.signal);
213
+ }
214
+ /**
215
+ * Request to delete files from UploadThing storage.
216
+ * @param {string | string[]} fileKeys
217
+ *
218
+ * @example
219
+ * await deleteFiles("2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg");
220
+ *
221
+ * @example
222
+ * await deleteFiles(["2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg","1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg"])
223
+ *
224
+ * @example
225
+ * await deleteFiles("myCustomIdentifier", { keyType: "customId" })
226
+ */
227
+ deleteFiles = async (keys, opts) => {
228
+ guardServerOnly();
229
+ const { keyType = this.defaultKeyType } = opts ?? {};
230
+ class DeleteFileResponse extends effect_Schema.Class("DeleteFileResponse")({
231
+ success: effect_Schema.Boolean,
232
+ deletedCount: effect_Schema.Number
233
+ }) {}
234
+ return await this.executeAsync(this.requestUploadThing("/v6/deleteFiles", keyType === "fileKey" ? { fileKeys: effect_Array.ensure(keys) } : { customIds: effect_Array.ensure(keys) }, DeleteFileResponse).pipe(effect_Effect.withLogSpan("deleteFiles")));
235
+ };
236
+ /**
237
+ * Request file URLs from UploadThing storage.
238
+ * @param {string | string[]} fileKeys
239
+ *
240
+ * @example
241
+ * const data = await getFileUrls("2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg");
242
+ * console.log(data); // [{key: "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", url: "https://uploadthing.com/f/2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg"}]
243
+ *
244
+ * @example
245
+ * const data = await getFileUrls(["2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg","1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg"])
246
+ * console.log(data) // [{key: "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", url: "https://uploadthing.com/f/2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg" },{key: "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg", url: "https://uploadthing.com/f/1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg"}]
247
+ *
248
+ * @deprecated - See https://docs.uploadthing.com/working-with-files#accessing-files for info how to access files
249
+ */
250
+ getFileUrls = async (keys, opts) => {
251
+ guardServerOnly();
252
+ const { keyType = this.defaultKeyType } = opts ?? {};
253
+ class GetFileUrlResponse extends effect_Schema.Class("GetFileUrlResponse")({ data: effect_Schema.Array(effect_Schema.Struct({
254
+ key: effect_Schema.String,
255
+ url: effect_Schema.String
256
+ })) }) {}
257
+ return await this.executeAsync(this.requestUploadThing("/v6/getFileUrl", keyType === "fileKey" ? { fileKeys: effect_Array.ensure(keys) } : { customIds: effect_Array.ensure(keys) }, GetFileUrlResponse).pipe(effect_Effect.withLogSpan("getFileUrls")));
258
+ };
259
+ /**
260
+ * Request file list from UploadThing storage.
261
+ * @param {object} opts
262
+ * @param {number} opts.limit The maximum number of files to return
263
+ * @param {number} opts.offset The number of files to skip
264
+ *
265
+ * @example
266
+ * const data = await listFiles({ limit: 1 });
267
+ * console.log(data); // { key: "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", id: "2e0fdb64-9957-4262-8e45-f372ba903ac8" }
268
+ */
269
+ listFiles = async (opts) => {
270
+ guardServerOnly();
271
+ class ListFileResponse extends effect_Schema.Class("ListFileResponse")({
272
+ hasMore: effect_Schema.Boolean,
273
+ files: effect_Schema.Array(effect_Schema.Struct({
274
+ id: effect_Schema.String,
275
+ customId: effect_Schema.NullOr(effect_Schema.String),
276
+ key: effect_Schema.String,
277
+ name: effect_Schema.String,
278
+ size: effect_Schema.Number,
279
+ status: effect_Schema.Literal("Deletion Pending", "Failed", "Uploaded", "Uploading"),
280
+ uploadedAt: effect_Schema.Number
281
+ }))
282
+ }) {}
283
+ return await this.executeAsync(this.requestUploadThing("/v6/listFiles", { ...opts }, ListFileResponse).pipe(effect_Effect.withLogSpan("listFiles")));
284
+ };
285
+ renameFiles = async (updates) => {
286
+ guardServerOnly();
287
+ class RenameFileResponse extends effect_Schema.Class("RenameFileResponse")({ success: effect_Schema.Boolean }) {}
288
+ return await this.executeAsync(this.requestUploadThing("/v6/renameFiles", { updates: effect_Array.ensure(updates) }, RenameFileResponse).pipe(effect_Effect.withLogSpan("renameFiles")));
289
+ };
290
+ getUsageInfo = async () => {
291
+ guardServerOnly();
292
+ class GetUsageInfoResponse extends effect_Schema.Class("GetUsageInfoResponse")({
293
+ totalBytes: effect_Schema.Number,
294
+ appTotalBytes: effect_Schema.Number,
295
+ filesUploaded: effect_Schema.Number,
296
+ limitBytes: effect_Schema.Number
297
+ }) {}
298
+ return await this.executeAsync(this.requestUploadThing("/v6/getUsageInfo", {}, GetUsageInfoResponse).pipe(effect_Effect.withLogSpan("getUsageInfo")));
299
+ };
300
+ /**
301
+ * Generate a presigned url for a private file
302
+ * Unlike {@link getSignedURL}, this method does not make a fetch request to the UploadThing API
303
+ * and is the recommended way to generate a presigned url for a private file.
304
+ **/
305
+ generateSignedURL = async (key, opts) => {
306
+ guardServerOnly();
307
+ const expiresIn = (0, __uploadthing_shared.parseTimeToSeconds)(opts?.expiresIn ?? "5 minutes");
308
+ if (opts?.expiresIn && isNaN(expiresIn)) throw new __uploadthing_shared.UploadThingError({
309
+ code: "BAD_REQUEST",
310
+ message: "expiresIn must be a valid time string, for example '1d', '2 days', or a number of seconds."
311
+ });
312
+ if (expiresIn > 86400 * 7) throw new __uploadthing_shared.UploadThingError({
313
+ code: "BAD_REQUEST",
314
+ message: "expiresIn must be less than 7 days (604800 seconds)."
315
+ });
316
+ const program = effect_Effect.gen(function* () {
317
+ const { apiKey, appId } = yield* require_upload_builder.UTToken;
318
+ const appIdLocation = yield* require_upload_builder.UfsAppIdLocation;
319
+ const ufsHost = yield* require_upload_builder.UfsHost;
320
+ const proto = ufsHost.includes("local") ? "http" : "https";
321
+ const urlBase = appIdLocation === "subdomain" ? `${proto}://${appId}.${ufsHost}/f/${key}` : `${proto}://${ufsHost}/a/${appId}/${key}`;
322
+ const ufsUrl = yield* (0, __uploadthing_shared.generateSignedURL)(urlBase, apiKey, { ttlInSeconds: expiresIn });
323
+ return { ufsUrl };
324
+ });
325
+ return await this.executeAsync(program.pipe(effect_Effect.catchTag("ConfigError", (e) => new __uploadthing_shared.UploadThingError({
326
+ code: "INVALID_SERVER_CONFIG",
327
+ message: "There was an error with the server configuration. More info can be found on this error's `cause` property",
328
+ cause: e
329
+ })), effect_Effect.withLogSpan("generateSignedURL")));
330
+ };
331
+ /**
332
+ * Request a presigned url for a private file(s)
333
+ * @remarks This method is no longer recommended as it makes a fetch
334
+ * request to the UploadThing API which incurs redundant latency. It
335
+ * will be deprecated in UploadThing v8 and removed in UploadThing v9.
336
+ *
337
+ * @see {@link generateSignedURL} for a more efficient way to generate a presigned url
338
+ **/
339
+ getSignedURL = async (key, opts) => {
340
+ guardServerOnly();
341
+ const expiresIn = opts?.expiresIn ? (0, __uploadthing_shared.parseTimeToSeconds)(opts.expiresIn) : void 0;
342
+ const { keyType = this.defaultKeyType } = opts ?? {};
343
+ if (opts?.expiresIn && isNaN(expiresIn)) throw new __uploadthing_shared.UploadThingError({
344
+ code: "BAD_REQUEST",
345
+ message: "expiresIn must be a valid time string, for example '1d', '2 days', or a number of seconds."
346
+ });
347
+ if (expiresIn && expiresIn > 86400 * 7) throw new __uploadthing_shared.UploadThingError({
348
+ code: "BAD_REQUEST",
349
+ message: "expiresIn must be less than 7 days (604800 seconds)."
350
+ });
351
+ class GetSignedUrlResponse extends effect_Schema.Class("GetSignedUrlResponse")({
352
+ url: effect_Schema.String,
353
+ ufsUrl: effect_Schema.String
354
+ }) {}
355
+ return await this.executeAsync(this.requestUploadThing("/v6/requestFileAccess", keyType === "fileKey" ? {
356
+ fileKey: key,
357
+ expiresIn
358
+ } : {
359
+ customId: key,
360
+ expiresIn
361
+ }, GetSignedUrlResponse).pipe(effect_Effect.withLogSpan("getSignedURL")));
362
+ };
363
+ /**
364
+ * Update the ACL of a file or set of files.
365
+ *
366
+ * @example
367
+ * // Make a single file public
368
+ * await utapi.updateACL("2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg", "public-read");
369
+ *
370
+ * // Make multiple files private
371
+ * await utapi.updateACL(
372
+ * [
373
+ * "2e0fdb64-9957-4262-8e45-f372ba903ac8_image.jpg",
374
+ * "1649353b-04ea-48a2-9db7-31de7f562c8d_image2.jpg",
375
+ * ],
376
+ * "private",
377
+ * );
378
+ */
379
+ updateACL = async (keys, acl, opts) => {
380
+ guardServerOnly();
381
+ const { keyType = this.defaultKeyType } = opts ?? {};
382
+ const updates = effect_Array.ensure(keys).map((key) => {
383
+ return keyType === "fileKey" ? {
384
+ fileKey: key,
385
+ acl
386
+ } : {
387
+ customId: key,
388
+ acl
389
+ };
390
+ });
391
+ const responseSchema = effect_Schema.Struct({ success: effect_Schema.Boolean });
392
+ return await this.executeAsync(this.requestUploadThing("/v6/updateACL", { updates }, responseSchema).pipe(effect_Effect.withLogSpan("updateACL")));
393
+ };
394
+ };
395
+
396
+ //#endregion
397
+ //#region src/server.ts
398
+ const createUploadthing = (opts) => require_upload_builder.createBuilder(opts);
399
+ const createRouteHandler = (opts) => {
400
+ return require_upload_builder.makeAdapterHandler((ev) => effect_Effect.succeed({ req: "request" in ev ? ev.request : ev }), (ev) => effect_Effect.succeed("request" in ev ? ev.request : ev), opts, "server");
401
+ };
402
+ const extractRouterConfig$1 = (router) => effect_Effect.runSync(require_upload_builder.extractRouterConfig(router));
403
+
404
+ //#endregion
405
+ exports.UTApi = UTApi;
406
+ exports.UTFile = UTFile;
407
+ exports.UTFiles = require_upload_builder.UTFiles;
408
+ exports.UploadThingError = __uploadthing_shared.UploadThingError;
409
+ exports.createBuilder = require_upload_builder.createBuilder;
410
+ exports.createRouteHandler = createRouteHandler;
411
+ exports.createUploadthing = createUploadthing;
412
+ exports.experimental_UTRegion = require_upload_builder.UTRegion;
413
+ exports.extractRouterConfig = extractRouterConfig$1;
414
+ exports.makeAdapterHandler = require_upload_builder.makeAdapterHandler;