UNPKG

@opcotech/gulp-s3-upload

Version:

A gulp task to asynchronous upload/update assets to an AWS S3 Bucket.

3 lines (2 loc) 3.09 kB
import{S3Client as e,HeadObjectCommand as n}from"@aws-sdk/client-s3";import{Upload as t}from"@aws-sdk/lib-storage";import o from"ansi-colors";import a from"event-stream";import r from"fancy-log";import{hash as i}from"hasha";import s from"mime";import{join as c,extname as m,basename as u,dirname as l}from"path";import f from"plugin-error";const p="gulp-s3-upload";function d(e){const n=new Set(["Body","bucket","charset","ContentType","etag_hash","Key","keyTransform","metadataMap","manualContentEncoding","maps","mimeTypeLookup","nameTransform","onChange","onNoChange","onNew","uploadNewFilesOnly","verbose"]);return Object.fromEntries(Object.entries(e).filter((([e])=>!n.has(e))))}function h(e){const n=m(e);return{dirname:l(e),basename:u(e,n),extname:n}}function g(e,n){const t=n.keyTransform||n.nameTransform;return t?t(e.relative):(o=h(e.relative).dirname,a=h(e.relative).basename+h(e.relative).extname,c(o,a)).replace(/\\/g,"/");var o,a}async function y(e,a,c,m){if(a.isNull())return;const u=g(a,m),l=function(e,n){let t;return t=n.mimeTypeLookup?n.mimeTypeLookup(e):s.getType(e)||"application/octet-stream",n.charset&&(t+=`;charset=${n.charset}`),t}(u,m),{shouldUpload:h}=await async function(e,t,a,s,c){var m;let u=!0,l=null;try{if(l=await e.send(new n({Bucket:t,Key:a})),!s.isStream()&&"none"!==c.etag_hash&&s.isBuffer()){const e=await i(s.contents,{algorithm:c.etag_hash||"md5"});if((null===(m=l.ETag)||void 0===m?void 0:m.replace(/^"(.*)"$/,"$1"))===e)return r(o.gray("No Change ... "),a),c.onNoChange&&"function"==typeof c.onNoChange&&c.onNoChange(a),{shouldUpload:!1,headData:l}}c.uploadNewFilesOnly&&(u=!1)}catch(e){if("NotFound"!==e.name&&"Forbidden"!==e.name)throw new f(p,`S3 headObject Error: ${e.stack}`)}return{shouldUpload:u,headData:l}}(e,c,u,a,m);if(!h)return void r(o.gray("Skipping upload of existing file ... "),u);const y=function(e,n,t,o,a){const r="function"==typeof a.metadataMap?a.metadataMap(t):a.metadataMap,i="function"==typeof a.manualContentEncoding?a.manualContentEncoding(t):a.manualContentEncoding;if(null===e.contents)throw new f(p,"File contents cannot be null");const s={...d(a),Bucket:n,Key:t,ContentType:o,Metadata:r,ContentEncoding:i};if(e.isBuffer())s.Body=e.contents;else if(e.isStream()){if(s.Body=e.contents,!e.stat)throw new f(p,"S3 Upload of streamObject must have a ContentLength");s.ContentLength=e.stat.size}return a.maps&&Object.entries(a.maps).forEach((([e,n])=>{"function"==typeof n&&(s[e]=n(t))})),s}(a,c,u,l,m);await async function(e,n,a,i){r(o.yellow("Uploading ... "),a);const s=new t({client:e,queueSize:4,leavePartsOnError:!1,params:n});await s.done(),r(o.green("Uploaded! ... "),a),i.onNew&&"function"==typeof i.onNew&&i.onNew(a)}(e,y,u,m)}function w(n={},t={}){n.region&&(t.region=n.region,delete n.region);const o=function(n,t={}){return new e({...t,credentials:n})}(n.useIAM?{}:{...n},t);return(e=>n=>{const t=n.Bucket||n.bucket;if(!t)throw new f(p,"Missing S3 bucket name!");return a.map((async(o,a)=>{try{await y(e,o,t,n),a(null,o)}catch(e){a(new f(p,e))}}))})(o)}export{w as default}; //# sourceMappingURL=index.esm.js.map