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