UNPKG

pushduck

Version:

The fastest way to add file uploads to any web application. Enterprise security, edge-ready. Works with 16+ frameworks and 5+ storage providers. No heavy AWS SDK required.

4 lines 23.8 kB
let e=require(`aws4fetch`);function t(e){"@babel/helpers - typeof";return t=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},t(e)}function n(e,n){if(t(e)!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,n||`default`);if(t(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(e)}function r(e){var r=n(e,`string`);return t(r)==`symbol`?r:r+``}function i(e,t,n){return(t=r(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var a=class e extends Error{constructor(t,n,r={}){super(n),i(this,`code`,void 0),i(this,`context`,void 0),i(this,`timestamp`,void 0),this.name=`PushduckError`,this.code=t,this.context=r,this.timestamp=new Date,Error.captureStackTrace&&Error.captureStackTrace(this,e)}getUserMessage(){switch(this.code){case`CONFIG_MISSING`:return`Upload configuration is missing. Please set up your S3 provider configuration.`;case`CONFIG_INVALID`:return`Upload configuration is invalid. Please check your provider settings.`;case`PROVIDER_UNSUPPORTED`:return`Provider "${this.context.provider}" is not supported yet.`;case`S3_CONNECTION_FAILED`:return`Failed to connect to S3. Please check your credentials and network connection.`;case`S3_BUCKET_NOT_FOUND`:return`Bucket "${this.context.bucket}" not found. Please check the bucket name and permissions.`;case`S3_ACCESS_DENIED`:return`Access denied. Please check your S3 credentials and bucket permissions.`;case`FILE_NOT_FOUND`:return`File "${this.context.key}" not found.`;case`FILE_TOO_LARGE`:return`File is too large. Please choose a smaller file.`;case`FILE_TYPE_NOT_ALLOWED`:return`File type is not allowed. Please choose a different file type.`;case`UPLOAD_FAILED`:return`Upload failed. Please try again.`;case`DOWNLOAD_FAILED`:return`Download failed. Please try again.`;case`NETWORK_ERROR`:return`Network error. Please check your internet connection.`;case`TIMEOUT_ERROR`:return`Operation timed out. Please try again.`;default:return this.message||`An unexpected error occurred.`}}getDebugInfo(){return{code:this.code,message:this.message,context:this.context,timestamp:this.timestamp.toISOString(),stack:this.stack}}toJSON(){return{name:this.name,code:this.code,message:this.message,context:this.context,timestamp:this.timestamp.toISOString()}}};const o=(e,t)=>new a(`CONFIG_INVALID`,e,t),s=(e,t)=>new a(`S3_CONNECTION_FAILED`,e,t),c=(e,t,n)=>new a(e,t,n),l=(e,t)=>new a(`NETWORK_ERROR`,e,t),u=e=>e instanceof a,d=e=>u(e)&&(e.code===`CONFIG_INVALID`||e.code===`CONFIG_MISSING`),f=e=>u(e)&&e.code.startsWith(`S3_`),p=e=>u(e)&&e.code.startsWith(`FILE_`),m=e=>({success:!0,data:e}),h=e=>({success:!1,error:e}),g=async(e,t,n)=>{try{return m(await e())}catch(e){return h(e instanceof a?e:new a(t,e instanceof Error?e.message:`Unknown error`,{...n,originalError:e instanceof Error?e:void 0}))}};var _=class{constructor(e={}){i(this,`isDebugMode`,void 0),this.isDebugMode=e.debug??!1}setDebugMode(e){this.isDebugMode=e}formatMessage(e,t,n){return`${new Date().toISOString()} ${this.getLogPrefix(e)} ${t}${n?` ${JSON.stringify(n)}`:``}`}getLogPrefix(e){switch(e){case`debug`:return`🔧`;case`info`:return`📦`;case`warn`:return`⚠️`;case`error`:return`❌`;default:return`📝`}}debug(e,t){this.isDebugMode&&console.log(this.formatMessage(`debug`,e,t))}info(e,t){console.log(this.formatMessage(`info`,e,t))}warn(e,t){console.warn(this.formatMessage(`warn`,e,t))}error(e,t,n){let r={...n,error:t instanceof Error?{message:t.message,stack:t.stack,name:t.name}:t};console.error(this.formatMessage(`error`,e,r))}s3Operation(e,t){this.debug(`S3 Operation: ${e}`,t)}configInit(e,t){this.info(`Upload configuration initialized with provider: ${e}`,t)}presignedUrl(e,t){this.debug(`Generated presigned URL for ${e}`,t)}fileOperation(e,t,n){this.debug(`File ${e}: ${t}`,n)}};const v=new _;function y(e,t={}){let n={bucket:e.bucket,acl:e.acl,customDomain:e.customDomain,forcePathStyle:e.forcePathStyle,debug:t.debug??!1};switch(e.provider){case`aws`:return{...n,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,region:e.region,forcePathStyle:e.forcePathStyle};case`cloudflare-r2`:return{...n,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,region:e.region||`auto`,endpoint:e.endpoint,forcePathStyle:!0};case`digitalocean-spaces`:return{...n,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,region:e.region||`us-east-1`,endpoint:e.endpoint,forcePathStyle:!1};case`minio`:return{...n,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,region:e.region||`us-east-1`,endpoint:e.endpoint,forcePathStyle:!0};case`azure-blob`:throw Error(`Azure Blob Storage support coming soon. Azure uses a different authentication model that requires additional implementation.`);case`ibm-cloud`:throw Error(`IBM Cloud Object Storage support coming soon. Requires IBM-specific endpoint configuration.`);case`oracle-oci`:throw Error(`Oracle Cloud Infrastructure Object Storage support coming soon.`);case`wasabi`:throw Error(`Wasabi Hot Cloud Storage support coming soon. Single-tier storage with no egress fees.`);case`backblaze-b2`:throw Error(`Backblaze B2 support coming soon. Competitive pricing with free Cloudflare egress.`);case`storj-dcs`:throw Error(`Storj DCS (Decentralized Cloud Storage) support coming soon. End-to-end encrypted, decentralized storage.`);case`telnyx-storage`:throw Error(`Telnyx Storage support coming soon. Global edge network with private backbone.`);case`tigris-data`:throw Error(`Tigris Data support coming soon. Globally distributed storage with single endpoint.`);case`cloudian-hyperstore`:throw Error(`Cloudian HyperStore support coming soon. On-premises and hybrid cloud object storage.`);case`gcs`:throw Error(`Google Cloud Storage is not S3-compatible for authentication. Use Google Cloud Storage client libraries instead, or consider Google Cloud Storage S3 interoperability (limited compatibility).`);case`s3-compatible`:if(!e.endpoint)throw Error(`Generic S3-compatible provider requires an endpoint URL.`);return{...n,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,region:e.region||`us-east-1`,endpoint:e.endpoint,forcePathStyle:e.forcePathStyle??!0};default:throw Error(`Unsupported provider: ${e.provider}. Supported providers: aws, cloudflare-r2, digitalocean-spaces, minio. Coming soon: wasabi, backblaze-b2, azure-blob, ibm-cloud, oracle-oci, storj-dcs, telnyx-storage, tigris-data, cloudian-hyperstore. For other providers, use "s3-compatible" with a custom endpoint.`)}}let b=null;function x(t){if(b&&!t)return b;if(!t)throw Error(`UploadConfig is required`);let n=y(t.provider,{debug:t.debug});if(!n.accessKeyId||!n.secretAccessKey||!n.bucket)throw o(`Missing required S3 configuration. Please check your upload configuration.`,{operation:`create-s3-client`,provider:t.provider.provider,bucket:n.bucket});let r={accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,region:n.region};return n.endpoint?(r.service=`s3`,t.provider.provider===`cloudflare-r2`?r.region=n.region:r.region=n.region===`auto`?`us-east-1`:n.region):r.region=n.region,b=new e.AwsClient(r),n.debug&&v.s3Operation(`client-created`,{region:n.region,endpoint:n.endpoint||`default`,bucket:n.bucket,forcePathStyle:n.forcePathStyle}),b}function S(){b=null}function C(e,t){if(t.endpoint){let n=t.endpoint.replace(/\/$/,``);if(t.forcePathStyle!==!1)return`${n}/${t.bucket}/${e}`;{let r=new URL(n);return r.hostname=`${t.bucket}.${r.hostname}`,`${r.origin}/${e}`}}return t.forcePathStyle?`https://s3.${t.region}.amazonaws.com/${t.bucket}/${e}`:`https://${t.bucket}.s3.${t.region}.amazonaws.com/${e}`}function w(e,t){if(t.customDomain)return`${t.customDomain.replace(/\/$/,``)}/${e}`;if(t.endpoint){let n=t.endpoint.replace(/\/$/,``);if(t.forcePathStyle!==!1)return`${n}/${t.bucket}/${e}`;{let r=new URL(n);return r.hostname=`${t.bucket}.${r.hostname}`,`${r.origin}/${e}`}}return t.forcePathStyle?`https://s3.${t.region}.amazonaws.com/${t.bucket}/${e}`:`https://${t.bucket}.s3.${t.region}.amazonaws.com/${e}`}async function T(e,t,n=3600){let r=x(e),i=y(e.provider);try{let e=w(t,i),a=new URL(e);a.searchParams.set(`X-Amz-Expires`,n.toString());let o=await r.sign(new Request(a.toString(),{method:`GET`}),{aws:{signQuery:!0}});return i.debug&&v.presignedUrl(t,{signedUrl:o.url,expiresIn:n}),o.url}catch(e){throw v.error(`Failed to generate presigned download URL`,e,{operation:`generate-presigned-download-url`,key:t}),s(`Failed to generate presigned download URL: ${e instanceof Error?e.message:`Unknown error`}`,{operation:`generate-presigned-download-url`,key:t,originalError:e instanceof Error?e:void 0})}}async function E(e,t){let n=x(e),r=y(e.provider),i=t.expiresIn||3600;try{let e=w(t.key,r),a=new URL(e);a.searchParams.set(`X-Amz-Expires`,i.toString());let o=await n.sign(new Request(a.toString(),{method:`PUT`}),{aws:{signQuery:!0}});return r.debug&&v.presignedUrl(t.key,{originalUrl:e,signedUrl:o.url,config:{region:r.region,endpoint:r.endpoint,bucket:r.bucket,forcePathStyle:r.forcePathStyle}}),{url:o.url,key:t.key}}catch(e){throw v.error(`Failed to generate presigned URL`,e,{operation:`generate-presigned-upload-url`,key:t.key}),s(`Failed to generate presigned URL: ${e instanceof Error?e.message:`Unknown error`}`,{operation:`generate-presigned-upload-url`,key:t.key,originalError:e instanceof Error?e:void 0})}}async function D(e,t){let n=await Promise.allSettled(t.map(t=>E(e,t))),r=[],i=[];if(n.forEach((e,t)=>{e.status===`fulfilled`?r.push(e.value):i.push(`File ${t}: ${e.reason.message}`)}),i.length>0)throw Error(`Failed to generate some presigned URLs: ${i.join(`, `)}`);return r}async function O(e,t){let n=x(e),r=y(e.provider);try{let e=C(t,r);return(await n.fetch(e,{method:`HEAD`})).ok}catch(e){if(e.status===404)return!1;throw e}}function k(e,t){return w(t,y(e.provider))}function A(e,t){let n=e.paths?.prefix||`uploads`,{originalName:r,userId:i=`anonymous`,prefix:a=n,preserveExtension:o=!0,addTimestamp:s=!0,addRandomId:c=!0}=t,l=[a,i];s&&l.push(Date.now().toString()),c&&l.push(Math.random().toString(36).substring(2,15));let u=r.replace(/[^a-zA-Z0-9.-]/g,`_`);return o||(u=u.replace(/\.[^/.]+$/,``)),l.push(u),l.join(`/`)}async function j(e,t,n,r={}){let i=x(e),a=y(e.provider);try{let o=C(n,a),s={};r.contentType&&(s[`Content-Type`]=r.contentType),a.acl&&(s[`x-amz-acl`]=a.acl),r.metadata&&Object.entries(r.metadata).forEach(([e,t])=>{s[`x-amz-meta-${e}`]=t});let c,l;if(t instanceof File)c=await t.arrayBuffer(),l=c.byteLength;else{let e=new Uint8Array(t);c=e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),l=t.byteLength}s[`Content-Length`]=l.toString(),r.onProgress&&r.onProgress({loaded:0,total:l,percentage:0,key:n});let u=Date.now(),d=await i.fetch(o,{method:`PUT`,headers:s,body:c});if(!d.ok)throw Error(`Upload failed: ${d.status} ${d.statusText}`);if(r.onProgress){let e=(Date.now()-u)/1e3,t=l/e;r.onProgress({loaded:l,total:l,percentage:100,key:n,uploadSpeed:t,eta:0})}return a.debug&&v.fileOperation(`upload-success`,n),k(e,n)}catch(e){throw console.error(`Failed to upload file:`,e),Error(`Failed to upload file: ${e instanceof Error?e.message:`Unknown error`}`)}}async function ee(e){try{let t=x(e),n=y(e.provider),r=n.endpoint?`${n.endpoint}/${n.bucket}`:`https://${n.bucket}.s3.${n.region}.amazonaws.com/`;return await t.fetch(r,{method:`HEAD`}),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:`Unknown error`}}}async function M(e,t={}){return(await N(e,{...t,pageSize:t.maxFiles||1e3})).files}async function N(e,t={}){let n=x(e),r=y(e.provider),{prefix:i=``,pageSize:a=100,maxFiles:o=1e3,includeMetadata:s=!0,sortBy:c=`key`,sortOrder:l=`asc`,continuationToken:u}=t;try{let t=r.endpoint?`${r.endpoint}/${r.bucket}`:`https://${r.bucket}.s3.${r.region}.amazonaws.com/`,d=new URL(t);d.searchParams.set(`list-type`,`2`),i&&d.searchParams.set(`prefix`,i);let f=Math.min(a,o);d.searchParams.set(`max-keys`,f.toString()),u&&d.searchParams.set(`continuation-token`,u);let p=await n.fetch(d.toString(),{method:`GET`});if(!p.ok)throw Error(`Failed to list files: ${p.status} ${p.statusText}`);let m=await p.text(),h=Y(m,r,e,s),g=m.includes(`<IsTruncated>true</IsTruncated>`),_=Z(m,`NextContinuationToken`),y=Q(h,c,l);return r.debug&&v.fileOperation(`list-files`,i||`(none)`,{count:h.length}),{files:y,continuationToken:_||void 0,isTruncated:g,totalCount:h.length}}catch(e){throw console.error(`Failed to list files:`,e),Error(`Failed to list files: ${e instanceof Error?e.message:`Unknown error`}`)}}async function P(e,t,n){let r=await M(e,{prefix:n,maxFiles:1e4}),i=t.startsWith(`.`)?t:`.${t}`;return r.filter(e=>e.key.endsWith(i))}async function F(e,t,n,r){return(await M(e,{prefix:r,maxFiles:1e4})).filter(e=>!(t&&e.size<t||n&&e.size>n))}async function I(e,t,n,r){return(await M(e,{prefix:r,maxFiles:1e4})).filter(e=>!(t&&e.lastModified<t||n&&e.lastModified>n))}async function L(e,t=``){let n=x(e),r=y(e.provider);try{let e=r.endpoint?`${r.endpoint}/${r.bucket}`:`https://${r.bucket}.s3.${r.region}.amazonaws.com/`,i=new URL(e);i.searchParams.set(`list-type`,`2`),i.searchParams.set(`delimiter`,`/`),t&&i.searchParams.set(`prefix`,t.endsWith(`/`)?t:`${t}/`);let a=await n.fetch(i.toString(),{method:`GET`});if(!a.ok)throw Error(`Failed to list directories: ${a.status} ${a.statusText}`);return X(await a.text())}catch(e){throw console.error(`Failed to list directories:`,e),Error(`Failed to list directories: ${e instanceof Error?e.message:`Unknown error`}`)}}async function*R(e,t={}){let n=t.continuationToken,r=!0;for(;r;){let i=await N(e,{...t,continuationToken:n});yield i.files,r=i.isTruncated,n=i.continuationToken}}async function z(e,t){let n=x(e),r=y(e.provider);try{let i=C(t,r),a=await n.fetch(i,{method:`HEAD`});if(!a.ok)throw Error(`File not found: ${t}`);let o=parseInt(a.headers.get(`content-length`)||`0`),s=a.headers.get(`content-type`)||`application/octet-stream`,c=a.headers.get(`last-modified`),l=a.headers.get(`etag`)?.replace(/"/g,``)||``,u={};return a.headers.forEach((e,t)=>{if(t.startsWith(`x-amz-meta-`)){let n=t.substring(11);u[n]=e}}),{key:t,url:k(e,t),size:o,contentType:s,lastModified:c?new Date(c):new Date,etag:l,metadata:u}}catch(e){throw Error(`Failed to get file info for ${t}: ${e instanceof Error?e.message:`Unknown error`}`)}}async function B(e,t){return(await Promise.allSettled(t.map(async t=>{try{return{key:t,info:await z(e,t)}}catch(e){return{key:t,info:null,error:e instanceof Error?e.message:`Unknown error`}}}))).map((e,n)=>e.status===`fulfilled`?e.value:{key:t[n],info:null,error:e.reason instanceof Error?e.reason.message:`Unknown error`})}async function V(e,t){return(await z(e,t)).size}async function H(e,t){return(await z(e,t)).contentType}async function U(e,t){return(await z(e,t)).lastModified}async function W(e,t){return(await z(e,t)).metadata||{}}async function G(e,t,n){let r=x(e),i=y(e.provider);try{let a=await z(e,t),o=`${i.bucket}/${t}`,s=C(t,i),c={"x-amz-copy-source":o,"x-amz-metadata-directive":`REPLACE`};Object.entries(n).forEach(([e,t])=>{c[`x-amz-meta-${e}`]=t}),a.contentType&&(c[`Content-Type`]=a.contentType);let l=await r.fetch(s,{method:`PUT`,headers:c});if(!l.ok)throw Error(`Failed to set metadata: ${l.status} ${l.statusText}`)}catch(e){throw Error(`Failed to set metadata for ${t}: ${e instanceof Error?e.message:`Unknown error`}`)}}async function K(e,t){try{return await z(e,t)}catch{return null}}async function q(e,t,n){try{let r=await z(e,t),i=[],a=[];if(n.maxSize&&r.size>n.maxSize&&i.push(`File size ${r.size} exceeds maximum ${n.maxSize}`),n.minSize&&r.size<n.minSize&&i.push(`File size ${r.size} is below minimum ${n.minSize}`),n.allowedTypes&&!n.allowedTypes.includes(r.contentType)&&i.push(`Content type ${r.contentType} not in allowed types: ${n.allowedTypes.join(`, `)}`),n.requiredExtensions){let e=r.key.split(`.`).pop()?.toLowerCase();(!e||!n.requiredExtensions.includes(e))&&i.push(`File extension .${e} not in required extensions: ${n.requiredExtensions.join(`, `)}`)}if(n.customValidators)for(let e of n.customValidators){let t=e(r);t===!1?i.push(`Custom validation failed`):typeof t==`string`&&i.push(t)}return{valid:i.length===0,errors:i,warnings:a,info:r}}catch(e){return{valid:!1,errors:[`Failed to validate file: ${e instanceof Error?e.message:`Unknown error`}`],warnings:[],info:{key:t,url:``,size:0,contentType:``,lastModified:new Date,etag:``}}}}async function J(e,t,n){return(await Promise.allSettled(t.map(t=>q(e,t,n)))).map((e,n)=>e.status===`fulfilled`?e.value:{valid:!1,errors:[`Failed to validate: ${e.reason instanceof Error?e.reason.message:`Unknown error`}`],warnings:[],info:{key:t[n],url:``,size:0,contentType:``,lastModified:new Date,etag:``}})}function Y(e,t,n,r){let i=[],a=/<Contents>(.*?)<\/Contents>/gs,o;for(;(o=a.exec(e))!==null;){let e=o[1],t=Z(e,`Key`),r=parseInt(Z(e,`Size`)||`0`),a=new Date(Z(e,`LastModified`)||Date.now()),s=Z(e,`ETag`)?.replace(/"/g,``)||``;t&&i.push({key:t,url:k(n,t),size:r,contentType:`application/octet-stream`,lastModified:a,etag:s})}return i}function X(e){let t=[],n=/<CommonPrefixes>.*?<Prefix>(.*?)<\/Prefix>.*?<\/CommonPrefixes>/gs,r;for(;(r=n.exec(e))!==null;){let e=r[1];e&&t.push(e)}return t}function Z(e,t){let n=RegExp(`<${t}>(.*?)</${t}>`,`s`),r=e.match(n);return r?r[1]:null}function Q(e,t,n){return[...e].sort((e,r)=>{let i=0;switch(t){case`key`:i=e.key.localeCompare(r.key);break;case`size`:i=e.size-r.size;break;case`modified`:i=e.lastModified.getTime()-r.lastModified.getTime();break}return n===`desc`?-i:i})}async function te(e,t){let n=x(e),r=e.provider;try{let e=y(r),i=C(t,e),a=await n.fetch(i,{method:`DELETE`});if(!a.ok){if(a.status===404){v.warn(`File not found during delete`,{operation:`delete-file`,key:t,status:a.status});return}throw s(`Failed to delete file: ${a.status} ${a.statusText}`,{operation:`delete-file`,key:t,statusCode:a.status})}e.debug&&v.fileOperation(`delete-success`,t)}catch(e){throw v.error(`Failed to delete file`,e,{operation:`delete-file`,key:t}),s(`Failed to delete file: ${e instanceof Error?e.message:`Unknown error`}`,{operation:`delete-file`,key:t,originalError:e instanceof Error?e:void 0})}}async function $(e,t){if(t.length===0)return{deleted:[],errors:[]};let n=x(e),r=e.provider;try{let e=y(r),i=1e3,a=[];for(let e=0;e<t.length;e+=i)a.push(t.slice(e,e+i));let o={deleted:[],errors:[]};for(let t of a){let r=await re(n,e,t);o.deleted.push(...r.deleted),o.errors.push(...r.errors)}return e.debug&&v.fileOperation(`batch-delete`,`multiple`,{total:t.length,deleted:o.deleted.length,errors:o.errors.length}),o}catch(e){throw v.error(`Failed to delete files batch`,e,{operation:`delete-files-batch`,count:t.length}),s(`Failed to delete files: ${e instanceof Error?e.message:`Unknown error`}`,{operation:`delete-files-batch`,originalError:e instanceof Error?e:void 0})}}async function ne(e,t,n={}){let{dryRun:r=!1,maxFiles:i=1e4}=n;try{let n=(await M(e,{prefix:t,maxFiles:i})).map(e=>e.key);if(n.length===0)return{filesFound:0,deleted:[],errors:[],dryRun:r};if(r)return{filesFound:n.length,deleted:n,errors:[],dryRun:!0};let a=await $(e,n);return{filesFound:n.length,deleted:a.deleted,errors:a.errors,dryRun:!1}}catch(e){throw Error(`Failed to delete files by prefix: ${e instanceof Error?e.message:`Unknown error`}`)}}async function re(e,t,n){let r=`<?xml version="1.0" encoding="UTF-8"?> <Delete> ${n.map(e=>`<Object><Key>${oe(e)}</Key></Object>`).join(``)} </Delete>`,i=`${t.endpoint?`${t.endpoint.replace(/\/$/,``)}/${t.bucket}`:`https://${t.bucket}.s3.amazonaws.com`}/?delete`,a=await e.fetch(i,{method:`POST`,headers:{"Content-Type":`application/xml`,"Content-MD5":await ae(r)},body:r});if(!a.ok)throw Error(`Batch delete failed: ${a.status} ${a.statusText}`);return ie(await a.text())}function ie(e){let t=[],n=[],r=e.match(/<Deleted>[\s\S]*?<\/Deleted>/g)||[];for(let e of r){let n=Z(e,`Key`);n&&t.push(n)}let i=e.match(/<Error>[\s\S]*?<\/Error>/g)||[];for(let e of i){let t=Z(e,`Key`),r=Z(e,`Code`),i=Z(e,`Message`);t&&n.push({key:t,code:r||`UnknownError`,message:i||`Unknown error occurred`})}return{deleted:t,errors:n}}async function ae(e){if(typeof crypto<`u`&&crypto.subtle){let t=new TextEncoder().encode(e),n=await crypto.subtle.digest(`MD5`,t),r=Array.from(new Uint8Array(n));return btoa(String.fromCharCode.apply(null,r))}else{let{createHash:t}=await import(`crypto`);return t(`md5`).update(e).digest(`base64`)}}function oe(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#039;`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return u}});