uploadkit-sdk 1.0.2 → 1.0.3
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 +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var q=Object.create;var y=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var M=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0})},O=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of B(e))!v.call(t,p)&&p!==r&&y(t,p,{get:()=>e[p],enumerable:!(s=N(e,p))||s.enumerable});return t};var R=(t,e,r)=>(r=t!=null?q(K(t)):{},O(e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r,t)),C=t=>O(y({},"__esModule",{value:!0}),t);var S={};M(S,{ALLOWED_MIME_TYPES:()=>w,InvalidFileError:()=>c,NetworkError:()=>h,UnauthorizedError:()=>l,UploadError:()=>m,UploadErrorCode:()=>F,UploadKitClient:()=>U,UploadKitError:()=>i,ValidationError:()=>f,default:()=>U});module.exports=C(S);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,r=500,s){super(e),this.statusCode=r,this.errorCode=s,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},f=class extends i{constructor(e="Validation Error"){super(e,400,"VALIDATION_ERROR")}},l=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")),T=R(require("https"));async function x(t,e){let r=e.body,s=new URL(t);return new Promise((p,o)=>{let a={method:e.method,hostname:s.hostname,path:s.pathname+s.search,port:s.port||(s.protocol==="https:
|
|
1
|
+
"use strict";var q=Object.create;var y=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var M=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0})},O=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of B(e))!v.call(t,p)&&p!==r&&y(t,p,{get:()=>e[p],enumerable:!(s=N(e,p))||s.enumerable});return t};var R=(t,e,r)=>(r=t!=null?q(K(t)):{},O(e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r,t)),C=t=>O(y({},"__esModule",{value:!0}),t);var S={};M(S,{ALLOWED_MIME_TYPES:()=>w,InvalidFileError:()=>c,NetworkError:()=>h,UnauthorizedError:()=>l,UploadError:()=>m,UploadErrorCode:()=>F,UploadKitClient:()=>U,UploadKitError:()=>i,ValidationError:()=>f,default:()=>U});module.exports=C(S);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,r=500,s){super(e),this.statusCode=r,this.errorCode=s,this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}},f=class extends i{constructor(e="Validation Error"){super(e,400,"VALIDATION_ERROR")}},l=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")),T=R(require("https"));async function x(t,e){let r=e.body,s=new URL(t);return new Promise((p,o)=>{let a={method:e.method,hostname:s.hostname,path:s.pathname+s.search,port:s.port||(s.protocol==="https:"?443:80),headers:{...e.headers,...r.getHeaders?r.getHeaders():{}}},u=(t.startsWith("https")?T.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}`))}),r&&typeof r.pipe=="function"?(r.on("end",()=>{}),u.on("finish",()=>{}),r.pipe(u)):u.end(),r.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 b(t){if(t&&!w.includes(t))throw new c(`File type '${t}' is not allowed.
|
|
2
2
|
Allowed types: ${w.join(", ")}
|
|
3
3
|
`)}async function _(t,e){let{shouldUseBrowser:r}=e,s;r?s=new FormData:s=new g.default;let p=Array.isArray(t)?t:[t];for(let o of p)if(typeof o=="string"&&!r){let{createReadStream:a}=await import("fs"),D=a(o);s.append("files",D)}else if(Buffer.isBuffer(o)&&!r&&s instanceof g.default){let a=o;a.type&&b(a.type),s.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&&b(o.type),s.append("files",o);else{if(r&&typeof o=="string")throw new c("File paths are not supported when isBrowser is enabled. Use File objects instead.");if(r&&o instanceof Buffer)throw new c("Buffers are not supported when isBrowser is enabled")}try{let o=await(r?I:x)(`${e.apiUrl}/files/upload`,{method:"POST",headers:{Authorization:`Bearer ${e.apiKey}`},body:s});if(!o.ok)switch(o.status){case 400:throw new f("Invalid request format");case 401:throw new l("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
4
|
${o.statusText}`)}return o.json()}catch(o){throw o instanceof i?o:new m(o instanceof Error?o.message:"Unknown error occurred")}}var P="https://uploadkit.onrender.com/api/v1",U=class{apiKey;shouldUseBrowser;constructor(e){if(!e.apiKey)throw new l("API Key is required");this.apiKey=e.apiKey,this.shouldUseBrowser=e.shouldUseBrowser||!1}async uploadFiles(e){return _(e,{apiKey:this.apiKey,apiUrl:P,shouldUseBrowser:this.shouldUseBrowser})}};0&&(module.exports={ALLOWED_MIME_TYPES,InvalidFileError,NetworkError,UnauthorizedError,UploadError,UploadErrorCode,UploadKitClient,UploadKitError,ValidationError});
|
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/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":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,EAAA,qBAAAC,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,gBAAAC,EAAA,oBAAAC,EAAA,oBAAAC,EAAA,mBAAAC,EAAA,oBAAAC,EAAA,YAAAF,IAAA,eAAAG,EAAAX,GCAO,IAAKY,OACVA,EAAA,iBAAmB,mBACnBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,cAAgB,gBANNA,OAAA,IASCC,EAAN,cAA6B,KAAM,CACjC,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,CAAe,CAClD,YAAYC,EAAU,mBAAoB,CACxC,MAAMA,EAAS,IAAK,kBAAgC,CACtD,CACF,EAEaI,EAAN,cAAgCL,CAAe,CACpD,YAAYC,EAAU,iCAAkC,CACtD,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF,EAEaK,EAAN,cAA0BN,CAAe,CAC9C,YAAYC,EAAU,gBAAiB,CACrC,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaM,EAAN,cAA2BP,CAAe,CAC/C,YAAYC,EAAU,yBAA0B,CAC9C,MAAMA,EAAS,IAAK,eAA6B,CACnD,CACF,EAEaO,EAAN,cAA+BR,CAAe,CACnD,YAAYC,EAAU,qBAAsB,CAC1C,MAAMA,EAAS,IAAK,cAA4B,CAClD,CACF,EClDA,IAAAQ,EAAyB,wBCAlB,IAAMC,EAAqB,CAEhC,aACA,YACA,aACA,gBACA,YAGA,kBACA,qBACA,0EAGA,aACA,WAGA,kBACA,+BACA,oBACA,oEACA,2BACA,4EAGA,YACA,aAGA,YACA,YACF,EC/BA,IAAAC,EAAsC,mBACtCC,EAAkB,oBAGlB,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,EACN,EAAAQ,QAAQ,EAAAC,SAEd,QACxBH,EACCI,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,EAEAP,EAAQS,CAAQ,CAClB,CAAC,CACH,CACF,EAEAN,EAAI,GAAG,QAAUO,GAAQ,CACvBT,EAAO,IAAI,MAAM,mBAAmBS,EAAI,OAAO,EAAE,CAAC,CACpD,CAAC,EAEGZ,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,QAAUY,GAAQ,CAE5BP,EAAI,QAAQ,EACZF,EAAO,IAAI,MAAM,mBAAmBS,EAAI,OAAO,EAAE,CAAC,CACpD,CAAC,CACH,CAAC,CACH,CCtEA,eAAsBC,EACpBC,EACAC,EACmB,CACnB,OAAO,MAAMD,EAAK,CAChB,OAAQC,EAAQ,OAChB,QAAS,CACP,GAAGA,EAAQ,OACb,EACA,KAAMA,EAAQ,IAChB,CAAC,CACH,CHOA,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,EAEAD,EACFC,EAAW,IAAI,SAEfA,EAAW,IAAI,EAAAC,QAGjB,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,EACnCH,EAA0B,OAAO,QAASK,CAAM,CACnD,SACE,OAAO,SAASF,CAAI,GACpB,CAACJ,GACDC,aAAoB,EAAAC,QACpB,CACA,IAAMK,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,GAAII,GAAoBI,aAAgB,OAC7C,MAAM,IAAIR,EACR,qDACF,CAGJ,CAGF,GAAI,CACF,IAAMY,EAAW,MAAOR,EAAmBS,EAAiBA,GAC1D,GAAGV,EAAQ,MAAM,gBACjB,CACE,OAAQ,OACR,QAAS,CACP,cAAe,UAAUA,EAAQ,MAAM,EACzC,EACA,KAAME,CACR,CACF,EAEA,GAAI,CAACO,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,CIvHA,IAAME,EAAkB,wCAEXC,EAAN,KAAsB,CACnB,OACA,iBAER,YAAYC,EAAiC,CAC3C,GAAI,CAACA,EAAQ,OAAQ,MAAM,IAAIC,EAAkB,qBAAqB,EACtE,KAAK,OAASD,EAAQ,OACtB,KAAK,iBAAmBA,EAAQ,kBAAoB,EACtD,CAEA,MAAM,YACJE,EAC6B,CAC7B,OAAOC,EAAYD,EAAO,CACxB,OAAQ,KAAK,OACb,OAAQJ,EACR,iBAAkB,KAAK,gBACzB,CAAC,CACH,CACF","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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as R,b as F,c as E,d,e as m,f as q,g as f}from"./chunk-7JY23M55.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 v 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 i={method:o.method,hostname:s.hostname,path:s.pathname+s.search,port:s.port||(s.protocol==="https:
|
|
1
|
+
import{a as R,b as F,c as E,d,e as m,f as q,g as f}from"./chunk-7JY23M55.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 v 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 i={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:v).request(i,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
2
|
Allowed types: ${c.join(", ")}
|
|
3
3
|
`)}async function M(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:i}=await import("fs"),g=i(e);s.append("files",g)}else if(Buffer.isBuffer(e)&&!t&&s instanceof D){let i=e;i.type&&b(i.type),s.append("files",e,{filename:i.name||"file.bin",contentType:i.type||"application/octet-stream",knownLength:i.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
4
|
${e.statusText}`)}return e.json()}catch(e){throw e instanceof F?e:new m(e instanceof Error?e.message:"Unknown error occurred")}}var B="https://uploadkit.onrender.com/api/v1",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 M(o,{apiKey:this.apiKey,apiUrl:B,shouldUseBrowser:this.shouldUseBrowser})}};export{c as ALLOWED_MIME_TYPES,f as InvalidFileError,q as NetworkError,d as UnauthorizedError,m as UploadError,R as UploadErrorCode,u as UploadKitClient,F as UploadKitError,E as ValidationError,u as default};
|
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/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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uploadkit-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "The official TypeScript library for the Uploadkit API",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsup",
|
|
24
24
|
"clean": "rimraf dist",
|
|
25
|
-
"changeset": "npx changeset",
|
|
25
|
+
"changeset": "npx changeset init",
|
|
26
26
|
"version-packages": "npx changeset version",
|
|
27
27
|
"release": "npm run build && npm run version-packages && npx changeset publish",
|
|
28
28
|
"prepublishOnly": "npm run clean && npm run build"
|