uploadkit-sdk 1.0.1
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/CHANGELOG.md +13 -0
- package/README.md +128 -0
- package/dist/chunk-E3AP57KG.mjs +2 -0
- package/dist/chunk-E3AP57KG.mjs.map +1 -0
- package/dist/chunk-JZJWUVD7.mjs +1 -0
- package/dist/chunk-JZJWUVD7.mjs.map +1 -0
- package/dist/errors.d.mts +30 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.mjs +2 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.mts +24 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +55 -0
- package/uploadkit-sdk-1.0.1.tgz +0 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# @uploadnest/sdk
|
|
2
|
+
|
|
3
|
+
[](https://npmjs.org/package/@uploadnest/sdk)
|
|
4
|
+

|
|
5
|
+
|
|
6
|
+
TypeScript library for uploading files to Uploadnest API. Works in Node.js, Next.js, and browsers.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @uploadnest/sdk
|
|
12
|
+
# or
|
|
13
|
+
pnpm add @uploadnest/sdk
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { UploadNestClient } from "@uploadnest/sdk";
|
|
20
|
+
|
|
21
|
+
const client = new UploadNestClient({
|
|
22
|
+
apiKey: "your-api-key",
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Upload files
|
|
26
|
+
const result = await client.uploadFiles(files);
|
|
27
|
+
console.log(result.files);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Usage Examples
|
|
31
|
+
|
|
32
|
+
### Node.js - File Paths
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Upload from file path
|
|
36
|
+
await client.uploadFiles("/path/to/file.jpg");
|
|
37
|
+
|
|
38
|
+
// Multiple files
|
|
39
|
+
await client.uploadFiles(["/path/to/file1.jpg", "/path/to/file2.pdf"]);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Node.js - Buffers
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import fs from "fs";
|
|
46
|
+
|
|
47
|
+
const buffer = fs.readFileSync("image.jpg");
|
|
48
|
+
// Add metadata to buffer
|
|
49
|
+
buffer.name = "image.jpg";
|
|
50
|
+
buffer.type = "image/jpeg";
|
|
51
|
+
|
|
52
|
+
await client.uploadFiles(buffer);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Browser/Next.js - File Objects
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// From file input
|
|
59
|
+
const fileInput = document.querySelector('input[type="file"]');
|
|
60
|
+
await client.uploadFiles(fileInput.files[0]);
|
|
61
|
+
|
|
62
|
+
// Multiple files
|
|
63
|
+
await client.uploadFiles(Array.from(fileInput.files));
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Next.js Server Actions
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// app/upload/page.tsx
|
|
70
|
+
import { UploadNestClient } from "@uploadnest/sdk";
|
|
71
|
+
|
|
72
|
+
async function uploadAction(formData: FormData) {
|
|
73
|
+
"use server";
|
|
74
|
+
|
|
75
|
+
const client = new UploadNestClient({
|
|
76
|
+
apiKey: process.env.UPLOADNEST_API_KEY!,
|
|
77
|
+
isBrowser: true,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const file = formData.get("file") as File;
|
|
81
|
+
const result = await client.uploadFiles(file);
|
|
82
|
+
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Supported File Types
|
|
88
|
+
|
|
89
|
+
- **Node.js**: File paths (strings), Buffers
|
|
90
|
+
- **Browser**: File objects, Blob objects
|
|
91
|
+
- **Next.js**: File objects, Blob objects (server actions/API routes)
|
|
92
|
+
|
|
93
|
+
## Error Handling
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { ValidationError, UploadError } from "@uploadnest/sdk/errors";
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
await client.uploadFiles(files);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (error instanceof ValidationError) {
|
|
102
|
+
console.log("Invalid file type:", error.message);
|
|
103
|
+
} else if (error instanceof UploadError) {
|
|
104
|
+
console.log("Upload failed:", error.message);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## TypeScript Support
|
|
110
|
+
|
|
111
|
+
Full TypeScript support with type definitions:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import type { UploadFileResponse } from "@uploadnest/sdk/types";
|
|
115
|
+
|
|
116
|
+
const result: UploadFileResponse = await client.uploadFiles(files);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Requirements
|
|
120
|
+
|
|
121
|
+
- **Node.js**: 18+
|
|
122
|
+
- **TypeScript**: 4.5+ (optional)
|
|
123
|
+
- **Browsers**: Modern browsers with fetch support
|
|
124
|
+
- **Next.js**: 13+ (App Router recommended)
|
|
125
|
+
|
|
126
|
+
## License
|
|
127
|
+
|
|
128
|
+
Apache-2.0
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var A=(e=>(e.VALIDATION_ERROR="VALIDATION_ERROR",e.UNAUTHORIZED="UNAUTHORIZED",e.UPLOAD_FAILED="UPLOAD_FAILED",e.REQUEST_FAILED="REQUEST_FAILED",e.INVALID_FILE="INVALID_FILE",e.NETWORK_ERROR="NETWORK_ERROR",e))(A||{}),t=class extends Error{statusCode;errorCode;constructor(s,E=500,n){super(s),this.statusCode=E,this.errorCode=n,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},o=class extends t{constructor(s="Validation Error"){super(s,400,"VALIDATION_ERROR")}},c=class extends t{constructor(s="Unauthorized - Invalid API Key"){super(s,401,"UNAUTHORIZED")}},R=class extends t{constructor(s="Upload failed"){super(s,500,"UPLOAD_FAILED")}},I=class extends t{constructor(s="Network request failed"){super(s,503,"NETWORK_ERROR")}},u=class extends t{constructor(s="Invalid file input"){super(s,400,"INVALID_FILE")}};export{A as a,t as b,o as c,c as d,R as e,I as f,u as g};
|
|
2
|
+
//# sourceMappingURL=chunk-E3AP57KG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export enum UploadErrorCode {\r\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\r\n UNAUTHORIZED = \"UNAUTHORIZED\",\r\n UPLOAD_FAILED = \"UPLOAD_FAILED\",\r\n REQUEST_FAILED = \"REQUEST_FAILED\",\r\n INVALID_FILE = \"INVALID_FILE\",\r\n NETWORK_ERROR = \"NETWORK_ERROR\",\r\n}\r\n\r\nexport class UploadNestError extends Error {\r\n public statusCode: number;\r\n public errorCode: UploadErrorCode;\r\n\r\n constructor(message: string, statusCode = 500, errorCode: UploadErrorCode) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n this.errorCode = errorCode;\r\n this.name = this.constructor.name;\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n}\r\n\r\nexport class ValidationError extends UploadNestError {\r\n constructor(message = \"Validation Error\") {\r\n super(message, 400, UploadErrorCode.VALIDATION_ERROR);\r\n }\r\n}\r\n\r\nexport class UnauthorizedError extends UploadNestError {\r\n constructor(message = \"Unauthorized - Invalid API Key\") {\r\n super(message, 401, UploadErrorCode.UNAUTHORIZED);\r\n }\r\n}\r\n\r\nexport class UploadError extends UploadNestError {\r\n constructor(message = \"Upload failed\") {\r\n super(message, 500, UploadErrorCode.UPLOAD_FAILED);\r\n }\r\n}\r\n\r\nexport class NetworkError extends UploadNestError {\r\n constructor(message = \"Network request failed\") {\r\n super(message, 503, UploadErrorCode.NETWORK_ERROR);\r\n }\r\n}\r\n\r\nexport class InvalidFileError extends UploadNestError {\r\n constructor(message = \"Invalid file input\") {\r\n super(message, 400, UploadErrorCode.INVALID_FILE);\r\n }\r\n}\r\n"],"mappings":"AAAO,IAAKA,OACVA,EAAA,iBAAmB,mBACnBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBANNA,OAAA,IASCC,EAAN,cAA8B,KAAM,CAClC,WACA,UAEP,YAAYC,EAAiBC,EAAa,IAAKC,EAA4B,CACzE,MAAMF,CAAO,EACb,KAAK,WAAaC,EAClB,KAAK,UAAYC,EACjB,KAAK,KAAO,KAAK,YAAY,KAC7B,MAAM,kBAAkB,KAAM,KAAK,WAAW,CAChD,CACF,EAEaC,EAAN,cAA8BJ,CAAgB,CACnD,YAAYC,EAAU,mBAAoB,CACxC,MAAMA,EAAS,IAAK,kBAAgC,CACtD,CACF,EAEaI,EAAN,cAAgCL,CAAgB,CACrD,YAAYC,EAAU,iCAAkC,CACtD,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF,EAEaK,EAAN,cAA0BN,CAAgB,CAC/C,YAAYC,EAAU,gBAAiB,CACrC,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaM,EAAN,cAA2BP,CAAgB,CAChD,YAAYC,EAAU,yBAA0B,CAC9C,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaO,EAAN,cAA+BR,CAAgB,CACpD,YAAYC,EAAU,qBAAsB,CAC1C,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF","names":["UploadErrorCode","UploadNestError","message","statusCode","errorCode","ValidationError","UnauthorizedError","UploadError","NetworkError","InvalidFileError"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-JZJWUVD7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
declare enum UploadErrorCode {
|
|
2
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
3
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
4
|
+
UPLOAD_FAILED = "UPLOAD_FAILED",
|
|
5
|
+
REQUEST_FAILED = "REQUEST_FAILED",
|
|
6
|
+
INVALID_FILE = "INVALID_FILE",
|
|
7
|
+
NETWORK_ERROR = "NETWORK_ERROR"
|
|
8
|
+
}
|
|
9
|
+
declare class UploadNestError extends Error {
|
|
10
|
+
statusCode: number;
|
|
11
|
+
errorCode: UploadErrorCode;
|
|
12
|
+
constructor(message: string, statusCode: number | undefined, errorCode: UploadErrorCode);
|
|
13
|
+
}
|
|
14
|
+
declare class ValidationError extends UploadNestError {
|
|
15
|
+
constructor(message?: string);
|
|
16
|
+
}
|
|
17
|
+
declare class UnauthorizedError extends UploadNestError {
|
|
18
|
+
constructor(message?: string);
|
|
19
|
+
}
|
|
20
|
+
declare class UploadError extends UploadNestError {
|
|
21
|
+
constructor(message?: string);
|
|
22
|
+
}
|
|
23
|
+
declare class NetworkError extends UploadNestError {
|
|
24
|
+
constructor(message?: string);
|
|
25
|
+
}
|
|
26
|
+
declare class InvalidFileError extends UploadNestError {
|
|
27
|
+
constructor(message?: string);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadNestError, ValidationError };
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
declare enum UploadErrorCode {
|
|
2
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
3
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
4
|
+
UPLOAD_FAILED = "UPLOAD_FAILED",
|
|
5
|
+
REQUEST_FAILED = "REQUEST_FAILED",
|
|
6
|
+
INVALID_FILE = "INVALID_FILE",
|
|
7
|
+
NETWORK_ERROR = "NETWORK_ERROR"
|
|
8
|
+
}
|
|
9
|
+
declare class UploadNestError extends Error {
|
|
10
|
+
statusCode: number;
|
|
11
|
+
errorCode: UploadErrorCode;
|
|
12
|
+
constructor(message: string, statusCode: number | undefined, errorCode: UploadErrorCode);
|
|
13
|
+
}
|
|
14
|
+
declare class ValidationError extends UploadNestError {
|
|
15
|
+
constructor(message?: string);
|
|
16
|
+
}
|
|
17
|
+
declare class UnauthorizedError extends UploadNestError {
|
|
18
|
+
constructor(message?: string);
|
|
19
|
+
}
|
|
20
|
+
declare class UploadError extends UploadNestError {
|
|
21
|
+
constructor(message?: string);
|
|
22
|
+
}
|
|
23
|
+
declare class NetworkError extends UploadNestError {
|
|
24
|
+
constructor(message?: string);
|
|
25
|
+
}
|
|
26
|
+
declare class InvalidFileError extends UploadNestError {
|
|
27
|
+
constructor(message?: string);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadNestError, ValidationError };
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var I=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var d=(t,s)=>{for(var r in s)I(t,r,{get:s[r],enumerable:!0})},_=(t,s,r,R)=>{if(s&&typeof s=="object"||typeof s=="function")for(let c of L(s))!a.call(t,c)&&c!==r&&I(t,c,{get:()=>s[c],enumerable:!(R=D(s,c))||R.enumerable});return t};var i=t=>_(I({},"__esModule",{value:!0}),t);var x={};d(x,{InvalidFileError:()=>O,NetworkError:()=>A,UnauthorizedError:()=>E,UploadError:()=>n,UploadErrorCode:()=>p,UploadNestError:()=>e,ValidationError:()=>u});module.exports=i(x);var p=(o=>(o.VALIDATION_ERROR="VALIDATION_ERROR",o.UNAUTHORIZED="UNAUTHORIZED",o.UPLOAD_FAILED="UPLOAD_FAILED",o.REQUEST_FAILED="REQUEST_FAILED",o.INVALID_FILE="INVALID_FILE",o.NETWORK_ERROR="NETWORK_ERROR",o))(p||{}),e=class extends Error{statusCode;errorCode;constructor(s,r=500,R){super(s),this.statusCode=r,this.errorCode=R,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},u=class extends e{constructor(s="Validation Error"){super(s,400,"VALIDATION_ERROR")}},E=class extends e{constructor(s="Unauthorized - Invalid API Key"){super(s,401,"UNAUTHORIZED")}},n=class extends e{constructor(s="Upload failed"){super(s,500,"UPLOAD_FAILED")}},A=class extends e{constructor(s="Network request failed"){super(s,503,"NETWORK_ERROR")}},O=class extends e{constructor(s="Invalid file input"){super(s,400,"INVALID_FILE")}};0&&(module.exports={InvalidFileError,NetworkError,UnauthorizedError,UploadError,UploadErrorCode,UploadNestError,ValidationError});
|
|
2
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export enum UploadErrorCode {\r\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\r\n UNAUTHORIZED = \"UNAUTHORIZED\",\r\n UPLOAD_FAILED = \"UPLOAD_FAILED\",\r\n REQUEST_FAILED = \"REQUEST_FAILED\",\r\n INVALID_FILE = \"INVALID_FILE\",\r\n NETWORK_ERROR = \"NETWORK_ERROR\",\r\n}\r\n\r\nexport class UploadNestError extends Error {\r\n public statusCode: number;\r\n public errorCode: UploadErrorCode;\r\n\r\n constructor(message: string, statusCode = 500, errorCode: UploadErrorCode) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n this.errorCode = errorCode;\r\n this.name = this.constructor.name;\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n}\r\n\r\nexport class ValidationError extends UploadNestError {\r\n constructor(message = \"Validation Error\") {\r\n super(message, 400, UploadErrorCode.VALIDATION_ERROR);\r\n }\r\n}\r\n\r\nexport class UnauthorizedError extends UploadNestError {\r\n constructor(message = \"Unauthorized - Invalid API Key\") {\r\n super(message, 401, UploadErrorCode.UNAUTHORIZED);\r\n }\r\n}\r\n\r\nexport class UploadError extends UploadNestError {\r\n constructor(message = \"Upload failed\") {\r\n super(message, 500, UploadErrorCode.UPLOAD_FAILED);\r\n }\r\n}\r\n\r\nexport class NetworkError extends UploadNestError {\r\n constructor(message = \"Network request failed\") {\r\n super(message, 503, UploadErrorCode.NETWORK_ERROR);\r\n }\r\n}\r\n\r\nexport class InvalidFileError extends UploadNestError {\r\n constructor(message = \"Invalid file input\") {\r\n super(message, 400, UploadErrorCode.INVALID_FILE);\r\n }\r\n}\r\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,gBAAAC,EAAA,oBAAAC,EAAA,oBAAAC,EAAA,oBAAAC,IAAA,eAAAC,EAAAT,GAAO,IAAKU,OACVA,EAAA,iBAAmB,mBACnBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBANNA,OAAA,IASCC,EAAN,cAA8B,KAAM,CAClC,WACA,UAEP,YAAYC,EAAiBC,EAAa,IAAKC,EAA4B,CACzE,MAAMF,CAAO,EACb,KAAK,WAAaC,EAClB,KAAK,UAAYC,EACjB,KAAK,KAAO,KAAK,YAAY,KAC7B,MAAM,kBAAkB,KAAM,KAAK,WAAW,CAChD,CACF,EAEaC,EAAN,cAA8BJ,CAAgB,CACnD,YAAYC,EAAU,mBAAoB,CACxC,MAAMA,EAAS,IAAK,kBAAgC,CACtD,CACF,EAEaI,EAAN,cAAgCL,CAAgB,CACrD,YAAYC,EAAU,iCAAkC,CACtD,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF,EAEaK,EAAN,cAA0BN,CAAgB,CAC/C,YAAYC,EAAU,gBAAiB,CACrC,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaM,EAAN,cAA2BP,CAAgB,CAChD,YAAYC,EAAU,yBAA0B,CAC9C,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaO,EAAN,cAA+BR,CAAgB,CACpD,YAAYC,EAAU,qBAAsB,CAC1C,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF","names":["errors_exports","__export","InvalidFileError","NetworkError","UnauthorizedError","UploadError","UploadErrorCode","UploadNestError","ValidationError","__toCommonJS","UploadErrorCode","UploadNestError","message","statusCode","errorCode","ValidationError","UnauthorizedError","UploadError","NetworkError","InvalidFileError"]}
|
package/dist/errors.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { UploadNestClientOptions, UploadInput, UploadResponseType } from './types.mjs';
|
|
2
|
+
export { UploadRequestOptions } from './types.mjs';
|
|
3
|
+
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadNestError, ValidationError } from './errors.mjs';
|
|
4
|
+
import 'form-data';
|
|
5
|
+
|
|
6
|
+
declare class UploadNestClient {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private shouldUseBrowser;
|
|
9
|
+
constructor(options: UploadNestClientOptions);
|
|
10
|
+
uploadFiles(files: UploadInput | UploadInput[]): Promise<UploadResponseType>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const ALLOWED_MIME_TYPES: readonly ["image/jpeg", "image/png", "image/webp", "image/svg+xml", "image/gif", "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "text/plain", "text/csv", "application/zip", "application/x-zip-compressed", "application/x-tar", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "audio/wav", "audio/webm", "video/mp4", "video/webm"];
|
|
14
|
+
type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];
|
|
15
|
+
|
|
16
|
+
export { ALLOWED_MIME_TYPES, type AllowedMimeType, UploadInput, UploadNestClient, UploadNestClientOptions, UploadResponseType, UploadNestClient as default };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { UploadNestClientOptions, UploadInput, UploadResponseType } from './types.js';
|
|
2
|
+
export { UploadRequestOptions } from './types.js';
|
|
3
|
+
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadNestError, ValidationError } from './errors.js';
|
|
4
|
+
import 'form-data';
|
|
5
|
+
|
|
6
|
+
declare class UploadNestClient {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private shouldUseBrowser;
|
|
9
|
+
constructor(options: UploadNestClientOptions);
|
|
10
|
+
uploadFiles(files: UploadInput | UploadInput[]): Promise<UploadResponseType>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const ALLOWED_MIME_TYPES: readonly ["image/jpeg", "image/png", "image/webp", "image/svg+xml", "image/gif", "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "text/plain", "text/csv", "application/zip", "application/x-zip-compressed", "application/x-tar", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "audio/wav", "audio/webm", "video/mp4", "video/webm"];
|
|
14
|
+
type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];
|
|
15
|
+
|
|
16
|
+
export { ALLOWED_MIME_TYPES, type AllowedMimeType, UploadInput, UploadNestClient, UploadNestClientOptions, UploadResponseType, UploadNestClient as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";var _=Object.create;var y=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var s in e)y(t,s,{get:e[s],enumerable:!0})},O=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of B(e))!M.call(t,p)&&p!==s&&y(t,p,{get:()=>e[p],enumerable:!(r=q(e,p))||r.enumerable});return t};var R=(t,e,s)=>(s=t!=null?_(v(t)):{},O(e||!t||!t.__esModule?y(s,"default",{value:t,enumerable:!0}):s,t)),P=t=>O(y({},"__esModule",{value:!0}),t);var K={};C(K,{ALLOWED_MIME_TYPES:()=>w,InvalidFileError:()=>c,NetworkError:()=>h,UnauthorizedError:()=>d,UploadError:()=>m,UploadErrorCode:()=>F,UploadNestClient:()=>U,UploadNestError:()=>i,ValidationError:()=>f,default:()=>U});module.exports=P(K);var F=(a=>(a.VALIDATION_ERROR="VALIDATION_ERROR",a.UNAUTHORIZED="UNAUTHORIZED",a.UPLOAD_FAILED="UPLOAD_FAILED",a.REQUEST_FAILED="REQUEST_FAILED",a.INVALID_FILE="INVALID_FILE",a.NETWORK_ERROR="NETWORK_ERROR",a))(F||{}),i=class extends Error{statusCode;errorCode;constructor(e,s=500,r){super(e),this.statusCode=s,this.errorCode=r,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},f=class extends i{constructor(e="Validation Error"){super(e,400,"VALIDATION_ERROR")}},d=class extends i{constructor(e="Unauthorized - Invalid API Key"){super(e,401,"UNAUTHORIZED")}},m=class extends i{constructor(e="Upload failed"){super(e,500,"UPLOAD_FAILED")}},h=class extends i{constructor(e="Network request failed"){super(e,503,"NETWORK_ERROR")}},c=class extends i{constructor(e="Invalid file input"){super(e,400,"INVALID_FILE")}};var g=R(require("form-data"));var w=["image/jpeg","image/png","image/webp","image/svg+xml","image/gif","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/plain","text/csv","application/zip","application/x-zip-compressed","application/x-tar","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.presentationml.presentation","audio/wav","audio/webm","video/mp4","video/webm"];var L=R(require("http")),N=R(require("https"));async function x(t,e){let s=e.body,r=new URL(t);return new Promise((p,o)=>{let a={method:e.method,hostname:r.hostname,path:r.pathname+r.search,port:r.port||(r.protocol==="https: "?443:80),headers:{...e.headers,...s.getHeaders?s.getHeaders():{}}},u=(t.startsWith("https")?N.default:L.default).request(a,n=>{let A="";n.on("data",E=>{A+=E}),n.on("end",()=>{let E={ok:n.statusCode?n.statusCode>=200&&n.statusCode<300:!1,status:n.statusCode||500,statusText:n.statusMessage||"",json:async()=>JSON.parse(A)};p(E)})});u.on("error",n=>{o(new Error(`Request failed: ${n.message}`))}),s&&typeof s.pipe=="function"?(s.on("end",()=>{}),u.on("finish",()=>{}),s.pipe(u)):u.end(),s.on("error",n=>{u.destroy(),o(new Error(`FormData error: ${n.message}`))})})}async function I(t,e){return fetch(t,{method:e.method,headers:{...e.headers},body:e.body})}function T(t){if(t&&!w.includes(t))throw new c(`File type '${t}' is not allowed.
|
|
2
|
+
Allowed types: ${w.join(", ")}
|
|
3
|
+
`)}async function b(t,e){let{shouldUseBrowser:s}=e,r;s?r=new FormData:r=new g.default;let p=Array.isArray(t)?t:[t];for(let o of p)if(typeof o=="string"&&!s){let{createReadStream:a}=await import("fs"),D=a(o);r.append("files",D)}else if(Buffer.isBuffer(o)&&!s&&r instanceof g.default){let a=o;a.type&&T(a.type),r.append("files",o,{filename:a.name||"file.bin",contentType:a.type||"application/octet-stream",knownLength:a.size})}else if(o instanceof Blob||o instanceof File)o instanceof File&&T(o.type),r.append("files",o);else{if(s&&typeof o=="string")throw new c("File paths are not supported when isBrowser is enabled. Use File objects instead.");if(s&&o instanceof Buffer)throw new c("Buffers are not supported when isBrowser is enabled")}try{let o=await(s?I:x)(`${e.apiUrl}/files/upload`,{method:"POST",headers:{Authorization:`Bearer ${e.apiKey}`},body:r});if(!o.ok)switch(o.status){case 400:throw new f("Invalid request format");case 401:throw new d("Unathorized Access");case 413:throw new m("File size too large");case 503:throw new h("Service temporarily unavailable");default:throw new m(`Upload failed: ${o.status}
|
|
4
|
+
${o.statusText}`)}return o.json()}catch(o){throw o instanceof i?o:new m(o instanceof Error?o.message:"Unknown error occurred")}}var U=class{apiKey;shouldUseBrowser;constructor(e){if(!e.apiKey)throw new d("API Key is required");this.apiKey=e.apiKey,this.shouldUseBrowser=e.shouldUseBrowser||!1}async uploadFiles(e){return b(e,{apiKey:this.apiKey,apiUrl:"http://localhost:3000/api/v1",shouldUseBrowser:this.shouldUseBrowser})}};0&&(module.exports={ALLOWED_MIME_TYPES,InvalidFileError,NetworkError,UnauthorizedError,UploadError,UploadErrorCode,UploadNestClient,UploadNestError,ValidationError});
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/uploadFile/index.ts","../src/constants/file-types.ts","../src/request/node.ts","../src/request/browser.ts","../src/upload-client.ts"],"sourcesContent":["// Main client class\r\nexport { UploadNestClient } from \"./upload-client\";\r\n\r\n// Error classes\r\nexport * from \"./errors\";\r\n\r\n// Types\r\nexport * from \"./types\";\r\n\r\n// Constants users might need\r\nexport { ALLOWED_MIME_TYPES, AllowedMimeType } from \"./constants/file-types\";\r\n\r\n// Default export\r\nexport { UploadNestClient as default } from \"./upload-client\";\r\n","export enum UploadErrorCode {\r\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\r\n UNAUTHORIZED = \"UNAUTHORIZED\",\r\n UPLOAD_FAILED = \"UPLOAD_FAILED\",\r\n REQUEST_FAILED = \"REQUEST_FAILED\",\r\n INVALID_FILE = \"INVALID_FILE\",\r\n NETWORK_ERROR = \"NETWORK_ERROR\",\r\n}\r\n\r\nexport class UploadNestError extends Error {\r\n public statusCode: number;\r\n public errorCode: UploadErrorCode;\r\n\r\n constructor(message: string, statusCode = 500, errorCode: UploadErrorCode) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n this.errorCode = errorCode;\r\n this.name = this.constructor.name;\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n}\r\n\r\nexport class ValidationError extends UploadNestError {\r\n constructor(message = \"Validation Error\") {\r\n super(message, 400, UploadErrorCode.VALIDATION_ERROR);\r\n }\r\n}\r\n\r\nexport class UnauthorizedError extends UploadNestError {\r\n constructor(message = \"Unauthorized - Invalid API Key\") {\r\n super(message, 401, UploadErrorCode.UNAUTHORIZED);\r\n }\r\n}\r\n\r\nexport class UploadError extends UploadNestError {\r\n constructor(message = \"Upload failed\") {\r\n super(message, 500, UploadErrorCode.UPLOAD_FAILED);\r\n }\r\n}\r\n\r\nexport class NetworkError extends UploadNestError {\r\n constructor(message = \"Network request failed\") {\r\n super(message, 503, UploadErrorCode.NETWORK_ERROR);\r\n }\r\n}\r\n\r\nexport class InvalidFileError extends UploadNestError {\r\n constructor(message = \"Invalid file input\") {\r\n super(message, 400, UploadErrorCode.INVALID_FILE);\r\n }\r\n}\r\n","import NodeFormData from \"form-data\";\r\nimport { ALLOWED_MIME_TYPES, AllowedMimeType } from \"../constants/file-types\";\r\nimport {\r\n InvalidFileError,\r\n NetworkError,\r\n UnauthorizedError,\r\n UploadError,\r\n UploadNestError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadNestClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadNestClientOptions {\r\n apiUrl: string;\r\n shouldUseBrowser?: boolean; // Ensure it's explicitly here if needed\r\n}\r\n\r\ntype BrowserFormData = FormData;\r\n\r\nfunction validateFileType(mimeType: string) {\r\n if (mimeType && !ALLOWED_MIME_TYPES.includes(mimeType as AllowedMimeType)) {\r\n throw new InvalidFileError(\r\n `File type '${mimeType}' is not allowed.\r\n Allowed types: ${ALLOWED_MIME_TYPES.join(\", \")}\r\n `,\r\n );\r\n }\r\n}\r\n\r\nexport async function uploadFiles(\r\n files: UploadInput | UploadInput[],\r\n options: UploadOptions,\r\n) {\r\n const { shouldUseBrowser } = options;\r\n\r\n let formData: BrowserFormData | NodeFormData;\r\n\r\n if (shouldUseBrowser) {\r\n formData = new FormData();\r\n } else {\r\n formData = new NodeFormData();\r\n }\r\n\r\n const fileArray = Array.isArray(files) ? files : [files];\r\n\r\n for (const file of fileArray) {\r\n if (typeof file === \"string\" && !shouldUseBrowser) {\r\n // For paths, validation will happen on the server or we need to infer mime type.\r\n // Removing validateFileType(file) as it expects a mime type, not a path.\r\n\r\n const { createReadStream } = await import(\"fs\");\r\n const stream = createReadStream(file);\r\n (formData as NodeFormData).append(\"files\", stream);\r\n } else if (\r\n Buffer.isBuffer(file) &&\r\n !shouldUseBrowser &&\r\n formData instanceof NodeFormData\r\n ) {\r\n const fileMetadata = file as any;\r\n if (fileMetadata.type) {\r\n validateFileType(fileMetadata.type);\r\n }\r\n\r\n formData.append(\"files\", file, {\r\n filename: fileMetadata.name || \"file.bin\",\r\n contentType: fileMetadata.type || \"application/octet-stream\",\r\n knownLength: fileMetadata.size,\r\n });\r\n } else if (file instanceof Blob || file instanceof File) {\r\n if (file instanceof File) {\r\n validateFileType(file.type);\r\n }\r\n (formData as FormData).append(\"files\", file);\r\n } else {\r\n if (shouldUseBrowser && typeof file === \"string\") {\r\n throw new InvalidFileError(\r\n \"File paths are not supported when isBrowser is enabled. Use File objects instead.\",\r\n );\r\n } else if (shouldUseBrowser && file instanceof Buffer) {\r\n throw new InvalidFileError(\r\n \"Buffers are not supported when isBrowser is enabled\",\r\n );\r\n }\r\n //throw new InvalidFileError(\"Invalid File\")\r\n }\r\n }\r\n\r\n try {\r\n const response = await (shouldUseBrowser ? browserRequest : nodeRequest)(\r\n `${options.apiUrl}/files/upload`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${options.apiKey}`,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n switch (response.status) {\r\n case 400:\r\n throw new ValidationError(\"Invalid request format\");\r\n case 401:\r\n throw new UnauthorizedError(\"Unathorized Access\");\r\n case 413:\r\n throw new UploadError(\"File size too large\");\r\n case 503:\r\n throw new NetworkError(\"Service temporarily unavailable\");\r\n default:\r\n throw new UploadError(\r\n `Upload failed: ${response.status}\r\n ${response.statusText}`,\r\n );\r\n }\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n if (error instanceof UploadNestError) {\r\n throw error;\r\n }\r\n throw new UploadError(\r\n error instanceof Error ? error.message : \"Unknown error occurred\",\r\n );\r\n }\r\n}\r\n","export const ALLOWED_MIME_TYPES = [\r\n // Images\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/svg+xml\",\r\n \"image/gif\",\r\n\r\n // Documents\r\n \"application/pdf\", // PDF files\r\n \"application/msword\", // .doc files\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", // .docx files\r\n\r\n // Text files\r\n \"text/plain\",\r\n \"text/csv\",\r\n\r\n // Archives\r\n \"application/zip\",\r\n \"application/x-zip-compressed\",\r\n \"application/x-tar\",\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", // .xlsx\r\n \"application/vnd.ms-excel\", // .xls\r\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", // .pptx\r\n\r\n // Audio\r\n \"audio/wav\",\r\n \"audio/webm\",\r\n\r\n // Video\r\n \"video/mp4\",\r\n \"video/webm\",\r\n] as const;\r\n\r\nexport type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];\r\n","import NodeFormData from \"form-data\";\r\nimport http, { IncomingMessage } from \"http\";\r\nimport https from \"https\";\r\nimport { UploadRequestOptions } from \"../types\";\r\n\r\nexport async function request(\r\n url: string,\r\n options: UploadRequestOptions\r\n): Promise<Response> {\r\n const formData = options.body as NodeFormData;\r\n\r\n const parsedUrl = new URL(url);\r\n\r\n return new Promise((resolve, reject) => {\r\n const requestOptions = {\r\n method: options.method, //POST\r\n hostname: parsedUrl.hostname, //\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n port: parsedUrl.port || (parsedUrl.protocol === \"https: \" ? 443 : 80),\r\n headers: {\r\n ...options.headers,\r\n ...(formData.getHeaders ? formData.getHeaders() : {}),\r\n },\r\n };\r\n\r\n const isHttps = url.startsWith(\"https\");\r\n const requestModule = isHttps ? https : http;\r\n\r\n const req = requestModule.request(\r\n requestOptions,\r\n (res: IncomingMessage) => {\r\n let data = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const response = {\r\n ok: res.statusCode\r\n ? res.statusCode >= 200 && res.statusCode < 300\r\n : false,\r\n status: res.statusCode || 500,\r\n statusText: res.statusMessage || \"\",\r\n json: async () => JSON.parse(data),\r\n } as Response;\r\n\r\n resolve(response);\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject(new Error(`Request failed: ${err.message}`));\r\n });\r\n\r\n if (formData && typeof formData.pipe === \"function\") {\r\n formData.on(\"end\", () => {});\r\n\r\n req.on(\"finish\", () => {});\r\n\r\n formData.pipe(req);\r\n } else {\r\n req.end();\r\n }\r\n\r\n formData.on(\"error\", (err) => {\r\n //console.error(\"FormData error\", err);\r\n req.destroy();\r\n reject(new Error(`FormData error: ${err.message}`));\r\n });\r\n });\r\n}\r\n","import type { UploadRequestOptions } from \"../types\";\r\n\r\nexport async function request(\r\n url: string,\r\n options: UploadRequestOptions\r\n): Promise<Response> {\r\n return fetch(url, {\r\n method: options.method,\r\n headers: {\r\n ...options.headers,\r\n },\r\n body: options.body as FormData, // Browser's native FormData\r\n });\r\n}\r\n","import { UnauthorizedError } from \"./errors\";\r\nimport {\r\n UploadInput,\r\n UploadNestClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadnest.onrender.com/api/v1\";\r\n\r\nexport class UploadNestClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n\r\n constructor(options: UploadNestClientOptions) {\r\n if (!options.apiKey) throw new UnauthorizedError(\"API Key is required\");\r\n this.apiKey = options.apiKey;\r\n this.shouldUseBrowser = options.shouldUseBrowser || false;\r\n }\r\n\r\n async uploadFiles(\r\n files: UploadInput | UploadInput[],\r\n ): Promise<UploadResponseType> {\r\n return uploadFiles(files, {\r\n apiKey: this.apiKey,\r\n apiUrl: \"http://localhost:3000/api/v1\",\r\n shouldUseBrowser: this.shouldUseBrowser,\r\n });\r\n }\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","ALLOWED_MIME_TYPES","InvalidFileError","NetworkError","UnauthorizedError","UploadError","UploadErrorCode","UploadNestClient","UploadNestError","ValidationError","__toCommonJS","UploadErrorCode","UploadNestError","message","statusCode","errorCode","ValidationError","UnauthorizedError","UploadError","NetworkError","InvalidFileError","import_form_data","ALLOWED_MIME_TYPES","import_http","import_https","request","url","options","formData","parsedUrl","resolve","reject","requestOptions","req","https","http","res","data","chunk","response","err","request","url","options","validateFileType","mimeType","ALLOWED_MIME_TYPES","InvalidFileError","uploadFiles","files","options","shouldUseBrowser","formData","NodeFormData","fileArray","file","createReadStream","stream","fileMetadata","response","request","ValidationError","UnauthorizedError","UploadError","NetworkError","error","UploadNestError","UploadNestClient","options","UnauthorizedError","files","uploadFiles"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as O,b as F,c as E,d,e as m,f as q,g as f}from"./chunk-E3AP57KG.mjs";import"./chunk-JZJWUVD7.mjs";import D from"form-data";var c=["image/jpeg","image/png","image/webp","image/svg+xml","image/gif","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/plain","text/csv","application/zip","application/x-zip-compressed","application/x-tar","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.presentationml.presentation","audio/wav","audio/webm","video/mp4","video/webm"];import M from"http";import A from"https";async function y(r,o){let t=o.body,s=new URL(r);return new Promise((w,e)=>{let n={method:o.method,hostname:s.hostname,path:s.pathname+s.search,port:s.port||(s.protocol==="https: "?443:80),headers:{...o.headers,...t.getHeaders?t.getHeaders():{}}},l=(r.startsWith("https")?A:M).request(n,a=>{let x="";a.on("data",h=>{x+=h}),a.on("end",()=>{let h={ok:a.statusCode?a.statusCode>=200&&a.statusCode<300:!1,status:a.statusCode||500,statusText:a.statusMessage||"",json:async()=>JSON.parse(x)};w(h)})});l.on("error",a=>{e(new Error(`Request failed: ${a.message}`))}),t&&typeof t.pipe=="function"?(t.on("end",()=>{}),l.on("finish",()=>{}),t.pipe(l)):l.end(),t.on("error",a=>{l.destroy(),e(new Error(`FormData error: ${a.message}`))})})}async function U(r,o){return fetch(r,{method:o.method,headers:{...o.headers},body:o.body})}function b(r){if(r&&!c.includes(r))throw new f(`File type '${r}' is not allowed.
|
|
2
|
+
Allowed types: ${c.join(", ")}
|
|
3
|
+
`)}async function v(r,o){let{shouldUseBrowser:t}=o,s;t?s=new FormData:s=new D;let w=Array.isArray(r)?r:[r];for(let e of w)if(typeof e=="string"&&!t){let{createReadStream:n}=await import("fs"),g=n(e);s.append("files",g)}else if(Buffer.isBuffer(e)&&!t&&s instanceof D){let n=e;n.type&&b(n.type),s.append("files",e,{filename:n.name||"file.bin",contentType:n.type||"application/octet-stream",knownLength:n.size})}else if(e instanceof Blob||e instanceof File)e instanceof File&&b(e.type),s.append("files",e);else{if(t&&typeof e=="string")throw new f("File paths are not supported when isBrowser is enabled. Use File objects instead.");if(t&&e instanceof Buffer)throw new f("Buffers are not supported when isBrowser is enabled")}try{let e=await(t?U:y)(`${o.apiUrl}/files/upload`,{method:"POST",headers:{Authorization:`Bearer ${o.apiKey}`},body:s});if(!e.ok)switch(e.status){case 400:throw new E("Invalid request format");case 401:throw new d("Unathorized Access");case 413:throw new m("File size too large");case 503:throw new q("Service temporarily unavailable");default:throw new m(`Upload failed: ${e.status}
|
|
4
|
+
${e.statusText}`)}return e.json()}catch(e){throw e instanceof F?e:new m(e instanceof Error?e.message:"Unknown error occurred")}}var u=class{apiKey;shouldUseBrowser;constructor(o){if(!o.apiKey)throw new d("API Key is required");this.apiKey=o.apiKey,this.shouldUseBrowser=o.shouldUseBrowser||!1}async uploadFiles(o){return v(o,{apiKey:this.apiKey,apiUrl:"http://localhost:3000/api/v1",shouldUseBrowser:this.shouldUseBrowser})}};export{c as ALLOWED_MIME_TYPES,f as InvalidFileError,q as NetworkError,d as UnauthorizedError,m as UploadError,O as UploadErrorCode,u as UploadNestClient,F as UploadNestError,E as ValidationError,u as default};
|
|
5
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/uploadFile/index.ts","../src/constants/file-types.ts","../src/request/node.ts","../src/request/browser.ts","../src/upload-client.ts"],"sourcesContent":["import NodeFormData from \"form-data\";\r\nimport { ALLOWED_MIME_TYPES, AllowedMimeType } from \"../constants/file-types\";\r\nimport {\r\n InvalidFileError,\r\n NetworkError,\r\n UnauthorizedError,\r\n UploadError,\r\n UploadNestError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadNestClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadNestClientOptions {\r\n apiUrl: string;\r\n shouldUseBrowser?: boolean; // Ensure it's explicitly here if needed\r\n}\r\n\r\ntype BrowserFormData = FormData;\r\n\r\nfunction validateFileType(mimeType: string) {\r\n if (mimeType && !ALLOWED_MIME_TYPES.includes(mimeType as AllowedMimeType)) {\r\n throw new InvalidFileError(\r\n `File type '${mimeType}' is not allowed.\r\n Allowed types: ${ALLOWED_MIME_TYPES.join(\", \")}\r\n `,\r\n );\r\n }\r\n}\r\n\r\nexport async function uploadFiles(\r\n files: UploadInput | UploadInput[],\r\n options: UploadOptions,\r\n) {\r\n const { shouldUseBrowser } = options;\r\n\r\n let formData: BrowserFormData | NodeFormData;\r\n\r\n if (shouldUseBrowser) {\r\n formData = new FormData();\r\n } else {\r\n formData = new NodeFormData();\r\n }\r\n\r\n const fileArray = Array.isArray(files) ? files : [files];\r\n\r\n for (const file of fileArray) {\r\n if (typeof file === \"string\" && !shouldUseBrowser) {\r\n // For paths, validation will happen on the server or we need to infer mime type.\r\n // Removing validateFileType(file) as it expects a mime type, not a path.\r\n\r\n const { createReadStream } = await import(\"fs\");\r\n const stream = createReadStream(file);\r\n (formData as NodeFormData).append(\"files\", stream);\r\n } else if (\r\n Buffer.isBuffer(file) &&\r\n !shouldUseBrowser &&\r\n formData instanceof NodeFormData\r\n ) {\r\n const fileMetadata = file as any;\r\n if (fileMetadata.type) {\r\n validateFileType(fileMetadata.type);\r\n }\r\n\r\n formData.append(\"files\", file, {\r\n filename: fileMetadata.name || \"file.bin\",\r\n contentType: fileMetadata.type || \"application/octet-stream\",\r\n knownLength: fileMetadata.size,\r\n });\r\n } else if (file instanceof Blob || file instanceof File) {\r\n if (file instanceof File) {\r\n validateFileType(file.type);\r\n }\r\n (formData as FormData).append(\"files\", file);\r\n } else {\r\n if (shouldUseBrowser && typeof file === \"string\") {\r\n throw new InvalidFileError(\r\n \"File paths are not supported when isBrowser is enabled. Use File objects instead.\",\r\n );\r\n } else if (shouldUseBrowser && file instanceof Buffer) {\r\n throw new InvalidFileError(\r\n \"Buffers are not supported when isBrowser is enabled\",\r\n );\r\n }\r\n //throw new InvalidFileError(\"Invalid File\")\r\n }\r\n }\r\n\r\n try {\r\n const response = await (shouldUseBrowser ? browserRequest : nodeRequest)(\r\n `${options.apiUrl}/files/upload`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${options.apiKey}`,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n switch (response.status) {\r\n case 400:\r\n throw new ValidationError(\"Invalid request format\");\r\n case 401:\r\n throw new UnauthorizedError(\"Unathorized Access\");\r\n case 413:\r\n throw new UploadError(\"File size too large\");\r\n case 503:\r\n throw new NetworkError(\"Service temporarily unavailable\");\r\n default:\r\n throw new UploadError(\r\n `Upload failed: ${response.status}\r\n ${response.statusText}`,\r\n );\r\n }\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n if (error instanceof UploadNestError) {\r\n throw error;\r\n }\r\n throw new UploadError(\r\n error instanceof Error ? error.message : \"Unknown error occurred\",\r\n );\r\n }\r\n}\r\n","export const ALLOWED_MIME_TYPES = [\r\n // Images\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/svg+xml\",\r\n \"image/gif\",\r\n\r\n // Documents\r\n \"application/pdf\", // PDF files\r\n \"application/msword\", // .doc files\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", // .docx files\r\n\r\n // Text files\r\n \"text/plain\",\r\n \"text/csv\",\r\n\r\n // Archives\r\n \"application/zip\",\r\n \"application/x-zip-compressed\",\r\n \"application/x-tar\",\r\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", // .xlsx\r\n \"application/vnd.ms-excel\", // .xls\r\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", // .pptx\r\n\r\n // Audio\r\n \"audio/wav\",\r\n \"audio/webm\",\r\n\r\n // Video\r\n \"video/mp4\",\r\n \"video/webm\",\r\n] as const;\r\n\r\nexport type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];\r\n","import NodeFormData from \"form-data\";\r\nimport http, { IncomingMessage } from \"http\";\r\nimport https from \"https\";\r\nimport { UploadRequestOptions } from \"../types\";\r\n\r\nexport async function request(\r\n url: string,\r\n options: UploadRequestOptions\r\n): Promise<Response> {\r\n const formData = options.body as NodeFormData;\r\n\r\n const parsedUrl = new URL(url);\r\n\r\n return new Promise((resolve, reject) => {\r\n const requestOptions = {\r\n method: options.method, //POST\r\n hostname: parsedUrl.hostname, //\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n port: parsedUrl.port || (parsedUrl.protocol === \"https: \" ? 443 : 80),\r\n headers: {\r\n ...options.headers,\r\n ...(formData.getHeaders ? formData.getHeaders() : {}),\r\n },\r\n };\r\n\r\n const isHttps = url.startsWith(\"https\");\r\n const requestModule = isHttps ? https : http;\r\n\r\n const req = requestModule.request(\r\n requestOptions,\r\n (res: IncomingMessage) => {\r\n let data = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n data += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const response = {\r\n ok: res.statusCode\r\n ? res.statusCode >= 200 && res.statusCode < 300\r\n : false,\r\n status: res.statusCode || 500,\r\n statusText: res.statusMessage || \"\",\r\n json: async () => JSON.parse(data),\r\n } as Response;\r\n\r\n resolve(response);\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject(new Error(`Request failed: ${err.message}`));\r\n });\r\n\r\n if (formData && typeof formData.pipe === \"function\") {\r\n formData.on(\"end\", () => {});\r\n\r\n req.on(\"finish\", () => {});\r\n\r\n formData.pipe(req);\r\n } else {\r\n req.end();\r\n }\r\n\r\n formData.on(\"error\", (err) => {\r\n //console.error(\"FormData error\", err);\r\n req.destroy();\r\n reject(new Error(`FormData error: ${err.message}`));\r\n });\r\n });\r\n}\r\n","import type { UploadRequestOptions } from \"../types\";\r\n\r\nexport async function request(\r\n url: string,\r\n options: UploadRequestOptions\r\n): Promise<Response> {\r\n return fetch(url, {\r\n method: options.method,\r\n headers: {\r\n ...options.headers,\r\n },\r\n body: options.body as FormData, // Browser's native FormData\r\n });\r\n}\r\n","import { UnauthorizedError } from \"./errors\";\r\nimport {\r\n UploadInput,\r\n UploadNestClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadnest.onrender.com/api/v1\";\r\n\r\nexport class UploadNestClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n\r\n constructor(options: UploadNestClientOptions) {\r\n if (!options.apiKey) throw new UnauthorizedError(\"API Key is required\");\r\n this.apiKey = options.apiKey;\r\n this.shouldUseBrowser = options.shouldUseBrowser || false;\r\n }\r\n\r\n async uploadFiles(\r\n files: UploadInput | UploadInput[],\r\n ): Promise<UploadResponseType> {\r\n return uploadFiles(files, {\r\n apiKey: this.apiKey,\r\n apiUrl: \"http://localhost:3000/api/v1\",\r\n shouldUseBrowser: this.shouldUseBrowser,\r\n });\r\n }\r\n}\r\n"],"mappings":"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","names":["NodeFormData","ALLOWED_MIME_TYPES","http","https","request","url","options","formData","parsedUrl","resolve","reject","requestOptions","req","res","data","chunk","response","err","request","url","options","validateFileType","mimeType","ALLOWED_MIME_TYPES","InvalidFileError","uploadFiles","files","options","shouldUseBrowser","formData","NodeFormData","fileArray","file","createReadStream","stream","fileMetadata","response","request","ValidationError","UnauthorizedError","UploadError","NetworkError","error","UploadNestError","UploadNestClient","options","UnauthorizedError","files","uploadFiles"]}
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import NodeFormData from 'form-data';
|
|
2
|
+
|
|
3
|
+
interface UploadNestClientOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
shouldUseBrowser?: boolean;
|
|
6
|
+
}
|
|
7
|
+
type UploadInput = File | Blob | Buffer | string;
|
|
8
|
+
interface UploadResponseType {
|
|
9
|
+
message: string;
|
|
10
|
+
data: {
|
|
11
|
+
fileId: string;
|
|
12
|
+
originalName: string;
|
|
13
|
+
size: number;
|
|
14
|
+
ext: string;
|
|
15
|
+
mimeType: string;
|
|
16
|
+
}[];
|
|
17
|
+
}
|
|
18
|
+
interface UploadRequestOptions {
|
|
19
|
+
method: string;
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
body: FormData | NodeFormData;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type { UploadInput, UploadNestClientOptions, UploadRequestOptions, UploadResponseType };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import NodeFormData from 'form-data';
|
|
2
|
+
|
|
3
|
+
interface UploadNestClientOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
shouldUseBrowser?: boolean;
|
|
6
|
+
}
|
|
7
|
+
type UploadInput = File | Blob | Buffer | string;
|
|
8
|
+
interface UploadResponseType {
|
|
9
|
+
message: string;
|
|
10
|
+
data: {
|
|
11
|
+
fileId: string;
|
|
12
|
+
originalName: string;
|
|
13
|
+
size: number;
|
|
14
|
+
ext: string;
|
|
15
|
+
mimeType: string;
|
|
16
|
+
}[];
|
|
17
|
+
}
|
|
18
|
+
interface UploadRequestOptions {
|
|
19
|
+
method: string;
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
body: FormData | NodeFormData;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type { UploadInput, UploadNestClientOptions, UploadRequestOptions, UploadResponseType };
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var d=(t,e,s,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of n(e))!p.call(t,r)&&r!==s&&i(t,r,{get:()=>e[r],enumerable:!(o=a(e,r))||o.enumerable});return t};var g=t=>d(i({},"__esModule",{value:!0}),t);var l={};module.exports=g(l);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import NodeFormData from \"form-data\";\r\n\r\nexport interface UploadNestClientOptions {\r\n apiKey: string;\r\n shouldUseBrowser?: boolean;\r\n}\r\n\r\nexport type UploadInput = File | Blob | Buffer | string;\r\n\r\nexport interface UploadResponseType {\r\n message: string;\r\n data: {\r\n fileId: string;\r\n originalName: string;\r\n size: number;\r\n ext: string;\r\n mimeType: string;\r\n }[];\r\n}\r\n\r\nexport interface UploadRequestOptions {\r\n method: string;\r\n headers: Record<string, string>;\r\n body: FormData | NodeFormData;\r\n}\r\n"],"mappings":"+WAAA,IAAAA,EAAA,kBAAAC,EAAAD","names":["types_exports","__toCommonJS"]}
|
package/dist/types.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "uploadkit-sdk",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "The official TypeScript library for the Uploadkit API",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "/dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.cjs"
|
|
12
|
+
},
|
|
13
|
+
"./errors": {
|
|
14
|
+
"import": "./dist/errors.mjs",
|
|
15
|
+
"require": "./dist/errors.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./types": {
|
|
18
|
+
"import": "./dist/types.mjs",
|
|
19
|
+
"require": "./dist/types.cjs"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"clean": "rimraf dist",
|
|
25
|
+
"changeset": "npx changeset",
|
|
26
|
+
"version-packages": "npx changeset version",
|
|
27
|
+
"release": "npm run build && npm run version-packages && npx changeset publish",
|
|
28
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"url": "https://github.com/clemdevlin/uploadkit"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"uploadkit",
|
|
38
|
+
"file-upload",
|
|
39
|
+
"storage",
|
|
40
|
+
"typescript",
|
|
41
|
+
"nodejs",
|
|
42
|
+
"nextjs"
|
|
43
|
+
],
|
|
44
|
+
"author": "Clement",
|
|
45
|
+
"license": "Apache-2.0",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"form-data": "^4.0.4"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^24.3.0",
|
|
51
|
+
"rimraf": "^6.0.1",
|
|
52
|
+
"tsup": "^8.5.0",
|
|
53
|
+
"typescript": "^5.9.2"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
Binary file
|