uploadkit-sdk 1.0.3 → 1.1.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/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +3 -4
- package/dist/types.d.ts +3 -4
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { UploadKitClientOptions, UploadInput, UploadResponseType } from './types.mjs';
|
|
2
2
|
export { UploadRequestOptions } from './types.mjs';
|
|
3
3
|
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadKitError, ValidationError } from './errors.mjs';
|
|
4
|
-
import 'form-data';
|
|
5
4
|
|
|
6
5
|
declare class UploadKitClient {
|
|
7
6
|
private apiKey;
|
|
8
7
|
private shouldUseBrowser;
|
|
8
|
+
private allowedOrigins?;
|
|
9
9
|
constructor(options: UploadKitClientOptions);
|
|
10
10
|
uploadFiles(files: UploadInput | UploadInput[]): Promise<UploadResponseType>;
|
|
11
11
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { UploadKitClientOptions, UploadInput, UploadResponseType } from './types.js';
|
|
2
2
|
export { UploadRequestOptions } from './types.js';
|
|
3
3
|
export { InvalidFileError, NetworkError, UnauthorizedError, UploadError, UploadErrorCode, UploadKitError, ValidationError } from './errors.js';
|
|
4
|
-
import 'form-data';
|
|
5
4
|
|
|
6
5
|
declare class UploadKitClient {
|
|
7
6
|
private apiKey;
|
|
8
7
|
private shouldUseBrowser;
|
|
8
|
+
private allowedOrigins?;
|
|
9
9
|
constructor(options: UploadKitClientOptions);
|
|
10
10
|
uploadFiles(files: UploadInput | UploadInput[]): Promise<UploadResponseType>;
|
|
11
11
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
Allowed types: ${
|
|
3
|
-
`)}async function
|
|
4
|
-
${
|
|
1
|
+
"use strict";var _=Object.create;var U=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var M=(t,e)=>{for(var o in e)U(t,o,{get:e[o],enumerable:!0})},A=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of B(e))!K.call(t,p)&&p!==o&&U(t,p,{get:()=>e[p],enumerable:!(a=q(e,p))||a.enumerable});return t};var y=(t,e,o)=>(o=t!=null?_(v(t)):{},A(e||!t||!t.__esModule?U(o,"default",{value:t,enumerable:!0}):o,t)),N=t=>A(U({},"__esModule",{value:!0}),t);var P={};M(P,{ALLOWED_MIME_TYPES:()=>h,InvalidFileError:()=>u,NetworkError:()=>w,UnauthorizedError:()=>d,UploadError:()=>c,UploadErrorCode:()=>D,UploadKitClient:()=>g,UploadKitError:()=>n,ValidationError:()=>m,default:()=>g});module.exports=N(P);var D=(r=>(r.VALIDATION_ERROR="VALIDATION_ERROR",r.UNAUTHORIZED="UNAUTHORIZED",r.UPLOAD_FAILED="UPLOAD_FAILED",r.REQUEST_FAILED="REQUEST_FAILED",r.INVALID_FILE="INVALID_FILE",r.NETWORK_ERROR="NETWORK_ERROR",r))(D||{}),n=class extends Error{statusCode;errorCode;constructor(e,o=500,a){super(e),this.statusCode=o,this.errorCode=a,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},m=class extends n{constructor(e="Validation Error"){super(e,400,"VALIDATION_ERROR")}},d=class extends n{constructor(e="Unauthorized - Invalid API Key"){super(e,401,"UNAUTHORIZED")}},c=class extends n{constructor(e="Upload failed"){super(e,500,"UPLOAD_FAILED")}},w=class extends n{constructor(e="Network request failed"){super(e,503,"NETWORK_ERROR")}},u=class extends n{constructor(e="Invalid file input"){super(e,400,"INVALID_FILE")}};var h=["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=y(require("http")),T=y(require("https"));async function R(t,e){let o=e.body,a=new URL(t);return new Promise((p,s)=>{let r={method:e.method,hostname:a.hostname,path:a.pathname+a.search,port:a.port||(a.protocol==="https:"?443:80),headers:{...e.headers,...o.getHeaders?o.getHeaders():{}}},f=(t.startsWith("https")?T.default:L.default).request(r,i=>{let I="";i.on("data",O=>{I+=O}),i.on("end",()=>{let O={ok:i.statusCode?i.statusCode>=200&&i.statusCode<300:!1,status:i.statusCode||500,statusText:i.statusMessage||"",json:async()=>JSON.parse(I)};p(O)})});f.on("error",i=>{s(new Error(`Request failed: ${i.message}`))}),o&&typeof o.pipe=="function"?(o.on("end",()=>{}),f.on("finish",()=>{}),o.pipe(f)):f.end(),o.on("error",i=>{f.destroy(),s(new Error(`FormData error: ${i.message}`))})})}async function E(t,e){return fetch(t,{method:e.method,headers:{...e.headers},body:e.body})}function F(t){if(t&&!h.includes(t))throw new u(`File type '${t}' is not allowed.
|
|
2
|
+
Allowed types: ${h.join(", ")}
|
|
3
|
+
`)}async function b(t,e){let{shouldUseBrowser:o}=e,a;if(o)a=new FormData;else{let s=(await import("form-data")).default;a=new s}let p=Array.isArray(t)?t:[t];for(let s of p)if(typeof s=="string"&&!o){let{createReadStream:r}=await import("fs"),x=r(s);a.append("files",x)}else if(!o&&typeof Buffer<"u"&&Buffer.isBuffer(s)){let r=s;r.type&&F(r.type),a.append("files",s,{filename:r.name||"file.bin",contentType:r.type||"application/octet-stream",knownLength:r.size})}else if(s instanceof Blob||s instanceof File)s instanceof File&&F(s.type),a.append("files",s);else{if(o&&typeof s=="string")throw new u("File paths are not supported when isBrowser is enabled. Use File objects instead.");if(o&&typeof Buffer<"u"&&s instanceof Buffer)throw new u("Buffers are not supported when isBrowser is enabled")}try{let s={Authorization:`Bearer ${e.apiKey}`};e.allowedOrigins&&e.allowedOrigins.length>0&&(s["X-Allowed-Origins"]=e.allowedOrigins.join(","));let r=await(o?E:R)(`${e.apiUrl}/files/upload`,{method:"POST",headers:s,body:a});if(!r.ok)switch(r.status){case 400:throw new m("Invalid request format");case 401:throw new d("Unathorized Access");case 413:throw new c("File size too large");case 503:throw new w("Service temporarily unavailable");default:throw new c(`Upload failed: ${r.status}
|
|
4
|
+
${r.statusText}`)}return r.json()}catch(s){throw s instanceof n?s:new c(s instanceof Error?s.message:"Unknown error occurred")}}var C="https://uploadkit.onrender.com/api/v1",g=class{apiKey;shouldUseBrowser;allowedOrigins;constructor(e){if(!e.apiKey)throw new d("API Key is required");this.apiKey=e.apiKey,this.shouldUseBrowser=e.shouldUseBrowser||!1,this.allowedOrigins=e.allowedOrigins}async uploadFiles(e){return b(e,{apiKey:this.apiKey,apiUrl:C,shouldUseBrowser:this.shouldUseBrowser,allowedOrigins:this.allowedOrigins})}};0&&(module.exports={ALLOWED_MIME_TYPES,InvalidFileError,NetworkError,UnauthorizedError,UploadError,UploadErrorCode,UploadKitClient,UploadKitError,ValidationError});
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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 { UploadKitClient } 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 { UploadKitClient 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 UploadKitError 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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\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 UploadKitError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadKitClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadKitClientOptions {\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 UploadKitError) {\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 UploadKitClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadkit.onrender.com/api/v1\";\r\n\r\nexport class UploadKitClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n\r\n constructor(options: UploadKitClientOptions) {\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: DEFAULT_API_URL,\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","UploadKitClient","UploadKitError","ValidationError","__toCommonJS","UploadErrorCode","UploadKitError","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","UploadKitError","DEFAULT_API_URL","UploadKitClient","options","UnauthorizedError","files","uploadFiles"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/constants/file-types.ts","../src/request/node.ts","../src/request/browser.ts","../src/uploadFile/index.ts","../src/upload-client.ts"],"sourcesContent":["// Main client class\r\nexport { UploadKitClient } 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 { UploadKitClient 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 UploadKitError 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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\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 UploadKitError {\r\n constructor(message = \"Invalid file input\") {\r\n super(message, 400, UploadErrorCode.INVALID_FILE);\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 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;\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: { message: any }) => {\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 { ALLOWED_MIME_TYPES, AllowedMimeType } from \"../constants/file-types\";\r\nimport {\r\n InvalidFileError,\r\n NetworkError,\r\n UnauthorizedError,\r\n UploadError,\r\n UploadKitError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadKitClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadKitClientOptions {\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: any;\r\n\r\n if (shouldUseBrowser) {\r\n formData = new FormData();\r\n } else {\r\n const NodeFormData = (await import(\"form-data\")).default;\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.append(\"files\", stream);\r\n } else if (\r\n !shouldUseBrowser &&\r\n typeof Buffer !== \"undefined\" &&\r\n Buffer.isBuffer(file)\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 (\r\n shouldUseBrowser &&\r\n typeof Buffer !== \"undefined\" &&\r\n file instanceof Buffer\r\n ) {\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 headers: Record<string, string> = {\r\n Authorization: `Bearer ${options.apiKey}`,\r\n };\r\n\r\n // Add allowed origins as a header if provided\r\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\r\n headers['X-Allowed-Origins'] = options.allowedOrigins.join(',');\r\n }\r\n\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 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 UploadKitError) {\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","import { UnauthorizedError } from \"./errors\";\r\nimport {\r\n UploadInput,\r\n UploadKitClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadkit.onrender.com/api/v1\";\r\n\r\nexport class UploadKitClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n private allowedOrigins?: string[];\r\n\r\n constructor(options: UploadKitClientOptions) {\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 this.allowedOrigins = options.allowedOrigins;\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: DEFAULT_API_URL,\r\n shouldUseBrowser: this.shouldUseBrowser,\r\n allowedOrigins: this.allowedOrigins,\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","UploadKitClient","UploadKitError","ValidationError","__toCommonJS","UploadErrorCode","UploadKitError","message","statusCode","errorCode","ValidationError","UnauthorizedError","UploadError","NetworkError","InvalidFileError","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","headers","response","request","ValidationError","UnauthorizedError","UploadError","NetworkError","error","UploadKitError","DEFAULT_API_URL","UploadKitClient","options","UnauthorizedError","files","uploadFiles"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{a as R,b as
|
|
2
|
-
Allowed types: ${
|
|
3
|
-
`)}async function
|
|
4
|
-
${
|
|
1
|
+
import{a as R,b as x,c as E,d,e as f,f as q,g as m}from"./chunk-7JY23M55.mjs";import"./chunk-JZJWUVD7.mjs";var u=["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 v from"http";import A from"https";async function y(s,o){let r=o.body,a=new URL(s);return new Promise((w,e)=>{let t={method:o.method,hostname:a.hostname,path:a.pathname+a.search,port:a.port||(a.protocol==="https:"?443:80),headers:{...o.headers,...r.getHeaders?r.getHeaders():{}}},l=(s.startsWith("https")?A:v).request(t,i=>{let O="";i.on("data",h=>{O+=h}),i.on("end",()=>{let h={ok:i.statusCode?i.statusCode>=200&&i.statusCode<300:!1,status:i.statusCode||500,statusText:i.statusMessage||"",json:async()=>JSON.parse(O)};w(h)})});l.on("error",i=>{e(new Error(`Request failed: ${i.message}`))}),r&&typeof r.pipe=="function"?(r.on("end",()=>{}),l.on("finish",()=>{}),r.pipe(l)):l.end(),r.on("error",i=>{l.destroy(),e(new Error(`FormData error: ${i.message}`))})})}async function g(s,o){return fetch(s,{method:o.method,headers:{...o.headers},body:o.body})}function F(s){if(s&&!u.includes(s))throw new m(`File type '${s}' is not allowed.
|
|
2
|
+
Allowed types: ${u.join(", ")}
|
|
3
|
+
`)}async function b(s,o){let{shouldUseBrowser:r}=o,a;if(r)a=new FormData;else{let e=(await import("form-data")).default;a=new e}let w=Array.isArray(s)?s:[s];for(let e of w)if(typeof e=="string"&&!r){let{createReadStream:t}=await import("fs"),U=t(e);a.append("files",U)}else if(!r&&typeof Buffer<"u"&&Buffer.isBuffer(e)){let t=e;t.type&&F(t.type),a.append("files",e,{filename:t.name||"file.bin",contentType:t.type||"application/octet-stream",knownLength:t.size})}else if(e instanceof Blob||e instanceof File)e instanceof File&&F(e.type),a.append("files",e);else{if(r&&typeof e=="string")throw new m("File paths are not supported when isBrowser is enabled. Use File objects instead.");if(r&&typeof Buffer<"u"&&e instanceof Buffer)throw new m("Buffers are not supported when isBrowser is enabled")}try{let e={Authorization:`Bearer ${o.apiKey}`};o.allowedOrigins&&o.allowedOrigins.length>0&&(e["X-Allowed-Origins"]=o.allowedOrigins.join(","));let t=await(r?g:y)(`${o.apiUrl}/files/upload`,{method:"POST",headers:e,body:a});if(!t.ok)switch(t.status){case 400:throw new E("Invalid request format");case 401:throw new d("Unathorized Access");case 413:throw new f("File size too large");case 503:throw new q("Service temporarily unavailable");default:throw new f(`Upload failed: ${t.status}
|
|
4
|
+
${t.statusText}`)}return t.json()}catch(e){throw e instanceof x?e:new f(e instanceof Error?e.message:"Unknown error occurred")}}var B="https://uploadkit.onrender.com/api/v1",c=class{apiKey;shouldUseBrowser;allowedOrigins;constructor(o){if(!o.apiKey)throw new d("API Key is required");this.apiKey=o.apiKey,this.shouldUseBrowser=o.shouldUseBrowser||!1,this.allowedOrigins=o.allowedOrigins}async uploadFiles(o){return b(o,{apiKey:this.apiKey,apiUrl:B,shouldUseBrowser:this.shouldUseBrowser,allowedOrigins:this.allowedOrigins})}};export{u as ALLOWED_MIME_TYPES,m as InvalidFileError,q as NetworkError,d as UnauthorizedError,f as UploadError,R as UploadErrorCode,c as UploadKitClient,x as UploadKitError,E as ValidationError,c as default};
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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 UploadKitError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadKitClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadKitClientOptions {\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 UploadKitError) {\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 UploadKitClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadkit.onrender.com/api/v1\";\r\n\r\nexport class UploadKitClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n\r\n constructor(options: UploadKitClientOptions) {\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: DEFAULT_API_URL,\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","UploadKitError","DEFAULT_API_URL","UploadKitClient","options","UnauthorizedError","files","uploadFiles"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/file-types.ts","../src/request/node.ts","../src/request/browser.ts","../src/uploadFile/index.ts","../src/upload-client.ts"],"sourcesContent":["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 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;\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: { message: any }) => {\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 { ALLOWED_MIME_TYPES, AllowedMimeType } from \"../constants/file-types\";\r\nimport {\r\n InvalidFileError,\r\n NetworkError,\r\n UnauthorizedError,\r\n UploadError,\r\n UploadKitError,\r\n ValidationError,\r\n} from \"../errors\";\r\nimport { UploadInput, UploadKitClientOptions } from \"../types\";\r\nimport { browserRequest, nodeRequest } from \"../request\";\r\n\r\ninterface UploadOptions extends UploadKitClientOptions {\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: any;\r\n\r\n if (shouldUseBrowser) {\r\n formData = new FormData();\r\n } else {\r\n const NodeFormData = (await import(\"form-data\")).default;\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.append(\"files\", stream);\r\n } else if (\r\n !shouldUseBrowser &&\r\n typeof Buffer !== \"undefined\" &&\r\n Buffer.isBuffer(file)\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 (\r\n shouldUseBrowser &&\r\n typeof Buffer !== \"undefined\" &&\r\n file instanceof Buffer\r\n ) {\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 headers: Record<string, string> = {\r\n Authorization: `Bearer ${options.apiKey}`,\r\n };\r\n\r\n // Add allowed origins as a header if provided\r\n if (options.allowedOrigins && options.allowedOrigins.length > 0) {\r\n headers['X-Allowed-Origins'] = options.allowedOrigins.join(',');\r\n }\r\n\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 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 UploadKitError) {\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","import { UnauthorizedError } from \"./errors\";\r\nimport {\r\n UploadInput,\r\n UploadKitClientOptions,\r\n UploadResponseType,\r\n} from \"./types\";\r\nimport { uploadFiles } from \"./uploadFile\";\r\n\r\nconst DEFAULT_API_URL = \"https://uploadkit.onrender.com/api/v1\";\r\n\r\nexport class UploadKitClient {\r\n private apiKey: string;\r\n private shouldUseBrowser: boolean;\r\n private allowedOrigins?: string[];\r\n\r\n constructor(options: UploadKitClientOptions) {\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 this.allowedOrigins = options.allowedOrigins;\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: DEFAULT_API_URL,\r\n shouldUseBrowser: this.shouldUseBrowser,\r\n allowedOrigins: this.allowedOrigins,\r\n });\r\n }\r\n}\r\n"],"mappings":"2GAAO,IAAMA,EAAqB,CAEhC,aACA,YACA,aACA,gBACA,YAGA,kBACA,qBACA,0EAGA,aACA,WAGA,kBACA,+BACA,oBACA,oEACA,2BACA,4EAGA,YACA,aAGA,YACA,YACF,EChCA,OAAOC,MAA+B,OACtC,OAAOC,MAAW,QAGlB,eAAsBC,EACpBC,EACAC,EACmB,CACnB,IAAMC,EAAWD,EAAQ,KAEnBE,EAAY,IAAI,IAAIH,CAAG,EAE7B,OAAO,IAAI,QAAQ,CAACI,EAASC,IAAW,CACtC,IAAMC,EAAiB,CACrB,OAAQL,EAAQ,OAChB,SAAUE,EAAU,SACpB,KAAMA,EAAU,SAAWA,EAAU,OACrC,KAAMA,EAAU,OAASA,EAAU,WAAa,SAAW,IAAM,IACjE,QAAS,CACP,GAAGF,EAAQ,QACX,GAAIC,EAAS,WAAaA,EAAS,WAAW,EAAI,CAAC,CACrD,CACF,EAKMK,GAHUP,EAAI,WAAW,OAAO,EACNF,EAAQD,GAEd,QACxBS,EACCE,GAAyB,CACxB,IAAIC,EAAO,GAEXD,EAAI,GAAG,OAASE,GAAU,CACxBD,GAAQC,CACV,CAAC,EAEDF,EAAI,GAAG,MAAO,IAAM,CAClB,IAAMG,EAAW,CACf,GAAIH,EAAI,WACJA,EAAI,YAAc,KAAOA,EAAI,WAAa,IAC1C,GACJ,OAAQA,EAAI,YAAc,IAC1B,WAAYA,EAAI,eAAiB,GACjC,KAAM,SAAY,KAAK,MAAMC,CAAI,CACnC,EAEAL,EAAQO,CAAQ,CAClB,CAAC,CACH,CACF,EAEAJ,EAAI,GAAG,QAAUK,GAAQ,CACvBP,EAAO,IAAI,MAAM,mBAAmBO,EAAI,OAAO,EAAE,CAAC,CACpD,CAAC,EAEGV,GAAY,OAAOA,EAAS,MAAS,YACvCA,EAAS,GAAG,MAAO,IAAM,CAAC,CAAC,EAE3BK,EAAI,GAAG,SAAU,IAAM,CAAC,CAAC,EAEzBL,EAAS,KAAKK,CAAG,GAEjBA,EAAI,IAAI,EAGVL,EAAS,GAAG,QAAUU,GAA0B,CAE9CL,EAAI,QAAQ,EACZF,EAAO,IAAI,MAAM,mBAAmBO,EAAI,OAAO,EAAE,CAAC,CACpD,CAAC,CACH,CAAC,CACH,CCrEA,eAAsBC,EACpBC,EACAC,EACmB,CACnB,OAAO,MAAMD,EAAK,CAChB,OAAQC,EAAQ,OAChB,QAAS,CACP,GAAGA,EAAQ,OACb,EACA,KAAMA,EAAQ,IAChB,CAAC,CACH,CCMA,SAASC,EAAiBC,EAAkB,CAC1C,GAAIA,GAAY,CAACC,EAAmB,SAASD,CAA2B,EACtE,MAAM,IAAIE,EACR,cAAcF,CAAQ;AAAA,uBACLC,EAAmB,KAAK,IAAI,CAAC;AAAA,OAEhD,CAEJ,CAEA,eAAsBE,EACpBC,EACAC,EACA,CACA,GAAM,CAAE,iBAAAC,CAAiB,EAAID,EAEzBE,EAEJ,GAAID,EACFC,EAAW,IAAI,aACV,CACL,IAAMC,GAAgB,KAAM,QAAO,WAAW,GAAG,QACjDD,EAAW,IAAIC,CACjB,CAEA,IAAMC,EAAY,MAAM,QAAQL,CAAK,EAAIA,EAAQ,CAACA,CAAK,EAEvD,QAAWM,KAAQD,EACjB,GAAI,OAAOC,GAAS,UAAY,CAACJ,EAAkB,CAIjD,GAAM,CAAE,iBAAAK,CAAiB,EAAI,KAAM,QAAO,IAAI,EACxCC,EAASD,EAAiBD,CAAI,EACpCH,EAAS,OAAO,QAASK,CAAM,CACjC,SACE,CAACN,GACD,OAAO,OAAW,KAClB,OAAO,SAASI,CAAI,EACpB,CACA,IAAMG,EAAeH,EACjBG,EAAa,MACfd,EAAiBc,EAAa,IAAI,EAGpCN,EAAS,OAAO,QAASG,EAAM,CAC7B,SAAUG,EAAa,MAAQ,WAC/B,YAAaA,EAAa,MAAQ,2BAClC,YAAaA,EAAa,IAC5B,CAAC,CACH,SAAWH,aAAgB,MAAQA,aAAgB,KAC7CA,aAAgB,MAClBX,EAAiBW,EAAK,IAAI,EAE3BH,EAAsB,OAAO,QAASG,CAAI,MACtC,CACL,GAAIJ,GAAoB,OAAOI,GAAS,SACtC,MAAM,IAAIR,EACR,mFACF,EACK,GACLI,GACA,OAAO,OAAW,KAClBI,aAAgB,OAEhB,MAAM,IAAIR,EACR,qDACF,CAGJ,CAGF,GAAI,CACF,IAAMY,EAAkC,CACtC,cAAe,UAAUT,EAAQ,MAAM,EACzC,EAGIA,EAAQ,gBAAkBA,EAAQ,eAAe,OAAS,IAC5DS,EAAQ,mBAAmB,EAAIT,EAAQ,eAAe,KAAK,GAAG,GAGhE,IAAMU,EAAW,MAAOT,EAAmBU,EAAiBA,GAC1D,GAAGX,EAAQ,MAAM,gBACjB,CACE,OAAQ,OACR,QAAAS,EACA,KAAMP,CACR,CACF,EAEA,GAAI,CAACQ,EAAS,GACZ,OAAQA,EAAS,OAAQ,CACvB,IAAK,KACH,MAAM,IAAIE,EAAgB,wBAAwB,EACpD,IAAK,KACH,MAAM,IAAIC,EAAkB,oBAAoB,EAClD,IAAK,KACH,MAAM,IAAIC,EAAY,qBAAqB,EAC7C,IAAK,KACH,MAAM,IAAIC,EAAa,iCAAiC,EAC1D,QACE,MAAM,IAAID,EACR,kBAAkBJ,EAAS,MAAM;AAAA,cAC/BA,EAAS,UAAU,EACvB,CACJ,CAGF,OAAOA,EAAS,KAAK,CACvB,OAASM,EAAO,CACd,MAAIA,aAAiBC,EACbD,EAEF,IAAIF,EACRE,aAAiB,MAAQA,EAAM,QAAU,wBAC3C,CACF,CACF,CClIA,IAAME,EAAkB,wCAEXC,EAAN,KAAsB,CACnB,OACA,iBACA,eAER,YAAYC,EAAiC,CAC3C,GAAI,CAACA,EAAQ,OAAQ,MAAM,IAAIC,EAAkB,qBAAqB,EACtE,KAAK,OAASD,EAAQ,OACtB,KAAK,iBAAmBA,EAAQ,kBAAoB,GACpD,KAAK,eAAiBA,EAAQ,cAChC,CAEA,MAAM,YACJE,EAC6B,CAC7B,OAAOC,EAAYD,EAAO,CACxB,OAAQ,KAAK,OACb,OAAQJ,EACR,iBAAkB,KAAK,iBACvB,eAAgB,KAAK,cACvB,CAAC,CACH,CACF","names":["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","headers","response","request","ValidationError","UnauthorizedError","UploadError","NetworkError","error","UploadKitError","DEFAULT_API_URL","UploadKitClient","options","UnauthorizedError","files","uploadFiles"]}
|
package/dist/types.d.mts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import NodeFormData from 'form-data';
|
|
2
|
-
|
|
3
1
|
interface UploadKitClientOptions {
|
|
4
2
|
apiKey: string;
|
|
5
3
|
shouldUseBrowser?: boolean;
|
|
4
|
+
allowedOrigins?: string[];
|
|
6
5
|
}
|
|
7
|
-
type UploadInput = File | Blob |
|
|
6
|
+
type UploadInput = File | Blob | any | string;
|
|
8
7
|
interface UploadResponseType {
|
|
9
8
|
message: string;
|
|
10
9
|
data: {
|
|
@@ -18,7 +17,7 @@ interface UploadResponseType {
|
|
|
18
17
|
interface UploadRequestOptions {
|
|
19
18
|
method: string;
|
|
20
19
|
headers: Record<string, string>;
|
|
21
|
-
body:
|
|
20
|
+
body: any;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
export type { UploadInput, UploadKitClientOptions, UploadRequestOptions, UploadResponseType };
|
package/dist/types.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import NodeFormData from 'form-data';
|
|
2
|
-
|
|
3
1
|
interface UploadKitClientOptions {
|
|
4
2
|
apiKey: string;
|
|
5
3
|
shouldUseBrowser?: boolean;
|
|
4
|
+
allowedOrigins?: string[];
|
|
6
5
|
}
|
|
7
|
-
type UploadInput = File | Blob |
|
|
6
|
+
type UploadInput = File | Blob | any | string;
|
|
8
7
|
interface UploadResponseType {
|
|
9
8
|
message: string;
|
|
10
9
|
data: {
|
|
@@ -18,7 +17,7 @@ interface UploadResponseType {
|
|
|
18
17
|
interface UploadRequestOptions {
|
|
19
18
|
method: string;
|
|
20
19
|
headers: Record<string, string>;
|
|
21
|
-
body:
|
|
20
|
+
body: any;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
export type { UploadInput, UploadKitClientOptions, UploadRequestOptions, UploadResponseType };
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var g=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of a(e))!p.call(t,i)&&i!==s&&r(t,i,{get:()=>e[i],enumerable:!(n=o(e,i))||n.enumerable});return t};var l=t=>g(r({},"__esModule",{value:!0}),t);var d={};module.exports=l(d);
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export interface UploadKitClientOptions {\r\n apiKey: string;\r\n shouldUseBrowser?: boolean;\r\n allowedOrigins?: string[];\r\n}\r\n\r\nexport type UploadInput = File | Blob | any | 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: any;\r\n}\r\n"],"mappings":"+WAAA,IAAAA,EAAA,kBAAAC,EAAAD","names":["types_exports","__toCommonJS"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uploadkit-sdk",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "The official TypeScript library for the Uploadkit API",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -43,9 +43,6 @@
|
|
|
43
43
|
],
|
|
44
44
|
"author": "Clement",
|
|
45
45
|
"license": "Apache-2.0",
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"form-data": "^4.0.4"
|
|
48
|
-
},
|
|
49
46
|
"devDependencies": {
|
|
50
47
|
"@types/node": "^24.3.0",
|
|
51
48
|
"rimraf": "^6.0.1",
|