@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.
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/changes.json +18 -0
- package/client/index.cjs +331 -0
- package/client/index.d.cts +36 -0
- package/client/index.d.cts.map +1 -0
- package/client/index.d.ts +36 -0
- package/client/index.d.ts.map +1 -0
- package/client/index.js +286 -0
- package/client/index.js.map +1 -0
- package/client-future/index.cjs +426 -0
- package/client-future/index.d.cts +373 -0
- package/client-future/index.d.cts.map +1 -0
- package/client-future/index.d.ts +373 -0
- package/client-future/index.d.ts.map +1 -0
- package/client-future/index.js +383 -0
- package/client-future/index.js.map +1 -0
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/deprecations-DPGpmqha.cjs +13 -0
- package/dist/deprecations-pLmw6Ytd.js +8 -0
- package/dist/deprecations-pLmw6Ytd.js.map +1 -0
- package/dist/package-BQ_k22T9.cjs +11 -0
- package/dist/package-DpScpvTA.js +6 -0
- package/dist/package-DpScpvTA.js.map +1 -0
- package/dist/shared-schemas-BmG5ARoX.js +82 -0
- package/dist/shared-schemas-BmG5ARoX.js.map +1 -0
- package/dist/shared-schemas-CG9VaBtT.cjs +129 -0
- package/dist/to-web-request-BQtxSXgE.cjs +98 -0
- package/dist/to-web-request-DhP0wXG-.js +87 -0
- package/dist/to-web-request-DhP0wXG-.js.map +1 -0
- package/dist/types-Bs3w2d_3.d.ts +627 -0
- package/dist/types-Bs3w2d_3.d.ts.map +1 -0
- package/dist/types-DiVC1t2V.d.cts +625 -0
- package/dist/types-DiVC1t2V.d.cts.map +1 -0
- package/dist/upload-builder-BUa7tovh.d.cts +32 -0
- package/dist/upload-builder-BUa7tovh.d.cts.map +1 -0
- package/dist/upload-builder-BcFawEj0.d.ts +32 -0
- package/dist/upload-builder-BcFawEj0.d.ts.map +1 -0
- package/dist/upload-builder-BlFOAnsv.js +699 -0
- package/dist/upload-builder-BlFOAnsv.js.map +1 -0
- package/dist/upload-builder-D6Ken9H0.cjs +794 -0
- package/dist/ut-reporter-BHoyNnzW.cjs +120 -0
- package/dist/ut-reporter-Dlppchbx.js +103 -0
- package/dist/ut-reporter-Dlppchbx.js.map +1 -0
- package/effect-platform/index.cjs +22 -0
- package/effect-platform/index.d.cts +54 -0
- package/effect-platform/index.d.cts.map +1 -0
- package/effect-platform/index.d.ts +54 -0
- package/effect-platform/index.d.ts.map +1 -0
- package/effect-platform/index.js +19 -0
- package/effect-platform/index.js.map +1 -0
- package/express/index.cjs +30 -0
- package/express/index.d.cts +28 -0
- package/express/index.d.cts.map +1 -0
- package/express/index.d.ts +28 -0
- package/express/index.d.ts.map +1 -0
- package/express/index.js +27 -0
- package/express/index.js.map +1 -0
- package/fastify/index.cjs +27 -0
- package/fastify/index.d.cts +28 -0
- package/fastify/index.d.cts.map +1 -0
- package/fastify/index.d.ts +28 -0
- package/fastify/index.d.ts.map +1 -0
- package/fastify/index.js +24 -0
- package/fastify/index.js.map +1 -0
- package/h3/index.cjs +20 -0
- package/h3/index.d.cts +28 -0
- package/h3/index.d.cts.map +1 -0
- package/h3/index.d.ts +28 -0
- package/h3/index.d.ts.map +1 -0
- package/h3/index.js +17 -0
- package/h3/index.js.map +1 -0
- package/next/index.cjs +22 -0
- package/next/index.d.cts +30 -0
- package/next/index.d.cts.map +1 -0
- package/next/index.d.ts +30 -0
- package/next/index.d.ts.map +1 -0
- package/next/index.js +19 -0
- package/next/index.js.map +1 -0
- package/next-legacy/index.cjs +28 -0
- package/next-legacy/index.d.cts +28 -0
- package/next-legacy/index.d.cts.map +1 -0
- package/next-legacy/index.d.ts +28 -0
- package/next-legacy/index.d.ts.map +1 -0
- package/next-legacy/index.js +25 -0
- package/next-legacy/index.js.map +1 -0
- package/package.json +210 -0
- package/remix/index.cjs +22 -0
- package/remix/index.d.cts +30 -0
- package/remix/index.d.cts.map +1 -0
- package/remix/index.d.ts +30 -0
- package/remix/index.d.ts.map +1 -0
- package/remix/index.js +19 -0
- package/remix/index.js.map +1 -0
- package/server/index.cjs +414 -0
- package/server/index.d.cts +211 -0
- package/server/index.d.cts.map +1 -0
- package/server/index.d.ts +213 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +405 -0
- package/server/index.js.map +1 -0
- package/tw/index.cjs +70 -0
- package/tw/index.d.cts +29 -0
- package/tw/index.d.cts.map +1 -0
- package/tw/index.d.ts +29 -0
- package/tw/index.d.ts.map +1 -0
- package/tw/index.js +74 -0
- package/tw/index.js.map +1 -0
- package/tw/v4.css +11 -0
- package/types/index.cjs +3 -0
- package/types/index.d.cts +2 -0
- package/types/index.d.ts +2 -0
- 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"}
|
package/remix/index.d.ts
ADDED
|
@@ -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"}
|
package/server/index.cjs
ADDED
|
@@ -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;
|