From 0029f968ab106a4a54da4d5e23224abdcbb1b6af Mon Sep 17 00:00:00 2001 From: imgix-git-robot Date: Fri, 23 Dec 2022 23:35:23 +0000 Subject: [PATCH] chore(release): 3.7.1 ## [3.7.1](https://github.com/imgix/js-core/compare/v3.7.0...v3.7.1) (2022-12-23) ### Bug Fixes * **deps:** update ufo to 1.x ([da24edf](https://github.com/imgix/js-core/commit/da24edfd87774088c106b8c57cd71b5b63b62b12)) [skip ci] --- dist/imgix-js-core.umd.js | 2 +- dist/index.cjs.js | 254 +++++++++++++++----------------------- dist/index.esm.js | 254 +++++++++++++++----------------------- package.json | 2 +- src/constants.js | 2 +- 5 files changed, 199 insertions(+), 315 deletions(-) diff --git a/dist/imgix-js-core.umd.js b/dist/imgix-js-core.umd.js index 5e1ba915..87781ca8 100644 --- a/dist/imgix-js-core.umd.js +++ b/dist/imgix-js-core.umd.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).ImgixClient=e()}(this,function(){"use strict";function e(e,t){var r,n=Object.keys(e);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(e),t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)),n}function c(n){for(var t=1;tt.length)&&(e=t.length);for(var r=0,n=new Array(e);r{let r={};return t.forEach((t,e)=>r[t]=e),r})(s),z=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,y=String.fromCharCode.bind(String),p="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):(t,e=t=>t)=>new Uint8Array(Array.prototype.slice.call(t,0).map(e)),g=t=>t.replace(/=/g,"").replace(/[+\/]/g,t=>"+"==t?"-":"_"),b=t=>t.replace(/[^A-Za-z0-9\+\/]/g,"");var v=e=>{let r,n,o,i,a="";var t=e.length%3;for(let t=0;t>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r]}return t?a.slice(0,t-3)+"===".substring(t):a};const m=t?t=>btoa(t):i?t=>Buffer.from(t,"binary").toString("base64"):v,w=i?t=>Buffer.from(t).toString("base64"):r=>{var n=[];for(let t=0,e=r.length;te?g(w(t)):w(t),D=t=>{var e;return t.length<2?(e=t.charCodeAt(0))<128?t:e<2048?y(192|e>>>6)+y(128|63&e):y(224|e>>>12&15)+y(128|e>>>6&63)+y(128|63&e):(e=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320),y(240|e>>>18&7)+y(128|e>>>12&63)+y(128|e>>>6&63)+y(128|63&e))},W=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,S=t=>t.replace(W,D),x=i?t=>Buffer.from(t,"utf8").toString("base64"):u?t=>w(u.encode(t)):t=>m(S(t)),T=(t,e=!1)=>e?g(x(t)):x(t);t=t=>T(t,!0);const H=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,M=t=>{switch(t.length){case 4:var e=((7&t.charCodeAt(0))<<18|(63&t.charCodeAt(1))<<12|(63&t.charCodeAt(2))<<6|63&t.charCodeAt(3))-65536;return y(55296+(e>>>10))+y(56320+(1023&e));case 3:return y((15&t.charCodeAt(0))<<12|(63&t.charCodeAt(1))<<6|63&t.charCodeAt(2));default:return y((31&t.charCodeAt(0))<<6|63&t.charCodeAt(1))}},P=t=>t.replace(H,M);var U=e=>{if(e=e.replace(/\s+/g,""),!z.test(e))throw new TypeError("malformed base64.");e+="==".slice(2-(3&e.length));let r,n="",o,i;for(let t=0;t>16&255):64===i?y(r>>16&255,r>>8&255):y(r>>16&255,r>>8&255,255&r);return n};const B=F?t=>atob(b(t)):i?t=>Buffer.from(t,"base64").toString("binary"):U,C=i?t=>p(Buffer.from(t,"base64")):t=>p(B(t),t=>t.charCodeAt(0)),R=t=>C(j(t)),Z=i?t=>Buffer.from(t,"base64").toString("utf8"):a?t=>a.decode(C(t)):t=>P(B(t)),j=t=>b(t.replace(/[-_]/g,t=>"-"==t?"+":"/")),_=t=>Z(j(t));function O(){var t=(t,e)=>Object.defineProperty(String.prototype,t,N(e));t("fromBase64",function(){return _(this)}),t("toBase64",function(t){return T(this,t)}),t("toBase64URI",function(){return T(this,!0)}),t("toBase64URL",function(){return T(this,!0)}),t("toUint8Array",function(){return R(this)})}function q(){var t=(t,e)=>Object.defineProperty(Uint8Array.prototype,t,N(e));t("toBase64",function(t){return A(this,t)}),t("toBase64URI",function(){return A(this,!0)}),t("toBase64URL",function(){return A(this,!0)})}const N=t=>({value:t,enumerable:!1,writable:!0,configurable:!0});const Q={version:k,VERSION:"3.7.2",atob:B,atobPolyfill:U,btoa:m,btoaPolyfill:v,fromBase64:_,toBase64:T,encode:T,encodeURI:t,encodeURL:t,utob:S,btou:P,decode:_,isValid:t=>{return"string"==typeof t&&(t=t.replace(/\s+/g,"").replace(/={0,2}$/,""),!/[^\s0-9a-zA-Z\+/]/.test(t)||!/[^\s0-9a-zA-Z\-_]/.test(t))},fromUint8Array:A,toUint8Array:R,extendString:O,extendUint8Array:q,extendBuiltins:()=>{O(),q()}};function V(t,e){return t(e={exports:{}},e.exports),e.exports}function $(t){return null!=t&&(K(t)||"function"==typeof(e=t).readFloatLE&&"function"==typeof e.slice&&K(e.slice(0,0))||!!t._isBuffer);var e}var G=V(function(t){var i,r;i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r={rotl:function(t,e){return t<>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&r.rotl(t,8)|4278255360&r.rotl(t,24);for(var e=0;e>>5]|=t[r]<<24-n%32;return e},wordsToBytes:function(t){for(var e=[],r=0;r<32*t.length;r+=8)e.push(t[r>>>5]>>>24-r%32&255);return e},bytesToHex:function(t){for(var e=[],r=0;r>>4).toString(16)),e.push((15&t[r]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],r=0;r>>6*(3-o)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],r=0,n=0;r>>6-2*n);return e}},t.exports=r}),E={utf8:{stringToBytes:function(t){return E.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString:function(t){return decodeURIComponent(escape(E.bin.bytesToString(t)))}},bin:{stringToBytes:function(t){for(var e=[],r=0;r>>24)|4278255360&(r[u]<<24|r[u]>>>8);r[e>>>5]|=128<>>9<<4)]=e;for(var s=g._ff,c=g._gg,l=g._hh,f=g._ii,u=0;u>>0,o=o+d>>>0,i=i+y>>>0,a=a+p>>>0}return b.endian([n,o,i,a])}var b,v,m,w;b=G,v=J.utf8,m=$,w=J.bin,g._ff=function(t,e,r,n,o,i,a){t=t+(e&r|~e&n)+(o>>>0)+a;return(t<>>32-i)+e},g._gg=function(t,e,r,n,o,i,a){t=t+(e&n|r&~n)+(o>>>0)+a;return(t<>>32-i)+e},g._hh=function(t,e,r,n,o,i,a){t=t+(e^r^n)+(o>>>0)+a;return(t<>>32-i)+e},g._ii=function(t,e,r,n,o,i,a){t=t+(r^(e|~n))+(o>>>0)+a;return(t<>>32-i)+e},g._blocksize=16,g._digestsize=16,t.exports=function(t,e){if(null==t)throw new Error("Illegal argument "+t);t=b.wordsToBytes(g(t,e));return e&&e.asBytes?t:e&&e.asString?w.bytesToString(t):b.bytesToHex(t)}});const Y=/\+/g;function tt(e=""){try{return decodeURIComponent(""+e)}catch(t){return""+e}}function et(t=""){var e={};for(const o of(t="?"===t[0]?t.substr(1):t).split("&")){var r,n=o.match(/([^=]+)=?(.*)/)||[];n.length<2||"__proto__"!==(r=tt(n[1]))&&"constructor"!==r&&(n=tt((n[2]||"").replace(Y," ")),e[r]?Array.isArray(e[r])?e[r].push(n):e[r]=[e[r],n]:e[r]=n)}return e}const rt=/^\w+:(\/\/)?/,nt=/^\/\/[^/]+/;function ot(t,e=!1){return rt.test(t)||e&&nt.test(t)}function it(t){return et(I(t).search)}function I(t="",e){var r,n,o,i,a,u;return ot(t,!0)?([r="",n,o=""]=(t.replace(/\\/g,"/").match(/([^:/]+:)?\/\/([^/@]+@)?(.*)/)||[]).splice(1),[o="",i=""]=(o.match(/([^/?#]*)(.*)?/)||[]).splice(1),{pathname:i,search:a,hash:u}=at(i),{protocol:r,auth:n?n.substr(0,n.length-1):"",host:o,pathname:i,search:a,hash:u}):e?I(e+t):at(t)}function at(t=""){var[t="",e="",r=""]=(t.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:e,hash:r}}var ut=/^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i,st={1:75,2:50,3:35,4:23,5:20},ct=[1,2,3,4,5],lt={domain:null,useHTTPS:!0,includeLibraryParam:!0,urlPrefix:"https://",secureURLToken:null};function L(t){var e=t.url,e=void 0===e?"":e,t=t.useHttps,t=void 0!==t&&t?"https://":"http://";return ot(e,!0)?I(e):L({url:t+e})}function ft(t,e){if(!Number.isInteger(t)||!Number.isInteger(e)||t<=0||e<=0||et.length)&&(e=t.length);for(var r=0,n=new Array(e);r{let r={};return t.forEach((t,e)=>r[t]=e),r})(d),F=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,p=String.fromCharCode.bind(String),g="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):(t,e=t=>t)=>new Uint8Array(Array.prototype.slice.call(t,0).map(e)),b=t=>t.replace(/=/g,"").replace(/[+\/]/g,t=>"+"==t?"-":"_"),v=t=>t.replace(/[^A-Za-z0-9\+\/]/g,"");var m=e=>{let r,n,o,i,a="";var t=e.length%3;for(let t=0;t>18&63]+d[r>>12&63]+d[r>>6&63]+d[63&r]}return t?a.slice(0,t-3)+"===".substring(t):a};const w=t?t=>btoa(t):a?t=>Buffer.from(t,"binary").toString("base64"):m,A=a?t=>Buffer.from(t).toString("base64"):r=>{var n=[];for(let t=0,e=r.length;te?b(A(t)):A(t),D=t=>{var e;return t.length<2?(e=t.charCodeAt(0))<128?t:e<2048?p(192|e>>>6)+p(128|63&e):p(224|e>>>12&15)+p(128|e>>>6&63)+p(128|63&e):(e=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320),p(240|e>>>18&7)+p(128|e>>>12&63)+p(128|e>>>6&63)+p(128|63&e))},W=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,x=t=>t.replace(W,D),T=a?t=>Buffer.from(t,"utf8").toString("base64"):c?t=>A(c.encode(t)):t=>w(x(t)),P=(t,e=!1)=>e?b(T(t)):T(t);t=t=>P(t,!0);const H=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,M=t=>{switch(t.length){case 4:var e=((7&t.charCodeAt(0))<<18|(63&t.charCodeAt(1))<<12|(63&t.charCodeAt(2))<<6|63&t.charCodeAt(3))-65536;return p(55296+(e>>>10))+p(56320+(1023&e));case 3:return p((15&t.charCodeAt(0))<<12|(63&t.charCodeAt(1))<<6|63&t.charCodeAt(2));default:return p((31&t.charCodeAt(0))<<6|63&t.charCodeAt(1))}},U=t=>t.replace(H,M);var j=e=>{if(e=e.replace(/\s+/g,""),!F.test(e))throw new TypeError("malformed base64.");e+="==".slice(2-(3&e.length));let r,n="",o,i;for(let t=0;t>16&255):64===i?p(r>>16&255,r>>8&255):p(r>>16&255,r>>8&255,255&r);return n};const B=z?t=>atob(v(t)):a?t=>Buffer.from(t,"base64").toString("binary"):j,C=a?t=>g(Buffer.from(t,"base64")):t=>g(B(t),t=>t.charCodeAt(0)),R=t=>C(O(t)),Z=a?t=>Buffer.from(t,"base64").toString("utf8"):u?t=>u.decode(C(t)):t=>U(B(t)),O=t=>v(t.replace(/[-_]/g,t=>"-"==t?"+":"/")),_=t=>Z(O(t));function N(){var t=(t,e)=>Object.defineProperty(String.prototype,t,Q(e));t("fromBase64",function(){return _(this)}),t("toBase64",function(t){return P(this,t)}),t("toBase64URI",function(){return P(this,!0)}),t("toBase64URL",function(){return P(this,!0)}),t("toUint8Array",function(){return R(this)})}function q(){var t=(t,e)=>Object.defineProperty(Uint8Array.prototype,t,Q(e));t("toBase64",function(t){return S(this,t)}),t("toBase64URI",function(){return S(this,!0)}),t("toBase64URL",function(){return S(this,!0)})}const Q=t=>({value:t,enumerable:!1,writable:!0,configurable:!0});const V={version:k,VERSION:"3.7.2",atob:B,atobPolyfill:j,btoa:w,btoaPolyfill:m,fromBase64:_,toBase64:P,encode:P,encodeURI:t,encodeURL:t,utob:x,btou:U,decode:_,isValid:t=>{return"string"==typeof t&&(t=t.replace(/\s+/g,"").replace(/={0,2}$/,""),!/[^\s0-9a-zA-Z\+/]/.test(t)||!/[^\s0-9a-zA-Z\-_]/.test(t))},fromUint8Array:S,toUint8Array:R,extendString:N,extendUint8Array:q,extendBuiltins:()=>{N(),q()}};function $(t,e){return t(e={exports:{}},e.exports),e.exports}function G(t){return null!=t&&(X(t)||"function"==typeof(e=t).readFloatLE&&"function"==typeof e.slice&&X(e.slice(0,0))||!!t._isBuffer);var e}var J=$(function(t){var i,r;i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r={rotl:function(t,e){return t<>>32-e},rotr:function(t,e){return t<<32-e|t>>>e},endian:function(t){if(t.constructor==Number)return 16711935&r.rotl(t,8)|4278255360&r.rotl(t,24);for(var e=0;e>>5]|=t[r]<<24-n%32;return e},wordsToBytes:function(t){for(var e=[],r=0;r<32*t.length;r+=8)e.push(t[r>>>5]>>>24-r%32&255);return e},bytesToHex:function(t){for(var e=[],r=0;r>>4).toString(16)),e.push((15&t[r]).toString(16));return e.join("")},hexToBytes:function(t){for(var e=[],r=0;r>>6*(3-o)&63)):e.push("=");return e.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/gi,"");for(var e=[],r=0,n=0;r>>6-2*n);return e}},t.exports=r}),E={utf8:{stringToBytes:function(t){return E.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString:function(t){return decodeURIComponent(escape(E.bin.bytesToString(t)))}},bin:{stringToBytes:function(t){for(var e=[],r=0;r>>24)|4278255360&(r[u]<<24|r[u]>>>8);r[e>>>5]|=128<>>9<<4)]=e;for(var c=g._ff,s=g._gg,l=g._hh,f=g._ii,u=0;u>>0,o=o+d>>>0,i=i+y>>>0,a=a+p>>>0}return b.endian([n,o,i,a])}var b,v,m,w;b=J,v=K.utf8,m=G,w=K.bin,g._ff=function(t,e,r,n,o,i,a){t=t+(e&r|~e&n)+(o>>>0)+a;return(t<>>32-i)+e},g._gg=function(t,e,r,n,o,i,a){t=t+(e&n|r&~n)+(o>>>0)+a;return(t<>>32-i)+e},g._hh=function(t,e,r,n,o,i,a){t=t+(e^r^n)+(o>>>0)+a;return(t<>>32-i)+e},g._ii=function(t,e,r,n,o,i,a){t=t+(r^(e|~n))+(o>>>0)+a;return(t<>>32-i)+e},g._blocksize=16,g._digestsize=16,t.exports=function(t,e){if(null==t)throw new Error("Illegal argument "+t);t=b.wordsToBytes(g(t,e));return e&&e.asBytes?t:e&&e.asString?w.bytesToString(t):b.bytesToHex(t)}});const tt=/\+/g;function et(t=""){try{return decodeURIComponent(""+t)}catch{return""+t}}function rt(t=""){var e={};for(const o of(t="?"===t[0]?t.slice(1):t).split("&")){var r,n=o.match(/([^=]+)=?(.*)/)||[];n.length<2||"__proto__"!==(r=et(n[1]))&&"constructor"!==r&&(n=et((n[2]||"").replace(tt," ")),void 0!==e[r]?Array.isArray(e[r])?e[r].push(n):e[r]=[e[r],n]:e[r]=n)}return e}const nt=/^\w{2,}:(\/\/)?/,ot=/^\/\/[^/]+/;function it(t,e=!1){return nt.test(t)||e&&ot.test(t)}function at(t){return rt(I(t).search)}function I(t="",e){var r,n,o,i,a,u;return it(t,!0)?([r="",n,o=""]=(t.replace(/\\/g,"/").match(/([^/:]+:)?\/\/([^/@]+@)?(.*)/)||[]).splice(1),[o="",i=""]=(o.match(/([^#/?]*)(.*)?/)||[]).splice(1),{pathname:i,search:a,hash:u}=ut(i.replace(/\/(?=[A-Za-z]:)/,"")),{protocol:r,auth:n?n.slice(0,Math.max(0,n.length-1)):"",host:o,pathname:i,search:a,hash:u}):e?I(e+t):ut(t)}function ut(t=""){var[t="",e="",r=""]=(t.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:e,hash:r}}var ct=/^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i,st={1:75,2:50,3:35,4:23,5:20},lt=[1,2,3,4,5],ft={domain:null,useHTTPS:!0,includeLibraryParam:!0,urlPrefix:"https://",secureURLToken:null};function L(t){var e=t.url,e=void 0===e?"":e,t=t.useHttps,t=void 0!==t&&t?"https://":"http://";return it(e,!0)?I(e):L({url:t+e})}function ht(t,e){if(!Number.isInteger(t)||!Number.isInteger(e)||t<=0||e<=0||e arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); +} +function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); +} // package version used in the ix-lib parameter -var VERSION = '3.6.1'; // regex pattern used to determine if a domain is valid - -var DOMAIN_REGEX = /^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i; // minimum generated srcset width - -var MIN_SRCSET_WIDTH = 100; // maximum generated srcset width - -var MAX_SRCSET_WIDTH = 8192; // default tolerable percent difference between srcset pair widths - -var DEFAULT_SRCSET_WIDTH_TOLERANCE = 0.08; // default quality parameter values mapped by each dpr srcset entry - +var VERSION = '3.7.0'; +// regex pattern used to determine if a domain is valid +var DOMAIN_REGEX = /^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i; +// minimum generated srcset width +var MIN_SRCSET_WIDTH = 100; +// maximum generated srcset width +var MAX_SRCSET_WIDTH = 8192; +// default tolerable percent difference between srcset pair widths +var DEFAULT_SRCSET_WIDTH_TOLERANCE = 0.08; + +// default quality parameter values mapped by each dpr srcset entry var DPR_QUALITIES = { 1: 75, 2: 50, @@ -198,14 +190,12 @@ var DEFAULT_OPTIONS = { * @returns {Object} `{ protocol, auth, host, pathname, search, hash }` * extracted from the URL. */ - function extractUrl(_ref) { var _ref$url = _ref.url, - url = _ref$url === void 0 ? '' : _ref$url, - _ref$useHttps = _ref.useHttps, - useHttps = _ref$useHttps === void 0 ? false : _ref$useHttps; + url = _ref$url === void 0 ? '' : _ref$url, + _ref$useHttps = _ref.useHttps, + useHttps = _ref$useHttps === void 0 ? false : _ref$useHttps; var defaultProto = useHttps ? 'https://' : 'http://'; - if (!ufo.hasProtocol(url, true)) { return extractUrl({ url: defaultProto + url @@ -218,28 +208,24 @@ function extractUrl(_ref) { * - `domainAndPath`: (.*) /) - all except line breaks * - `domain`: `([^/]*)` - all before a `/` token */ - - return ufo.parseURL(url); } function validateAndDestructureOptions(options) { var widthTolerance; - if (options.widthTolerance !== undefined) { validateWidthTolerance(options.widthTolerance); widthTolerance = options.widthTolerance; } else { widthTolerance = DEFAULT_SRCSET_WIDTH_TOLERANCE; } - var minWidth = options.minWidth === undefined ? MIN_SRCSET_WIDTH : options.minWidth; - var maxWidth = options.maxWidth === undefined ? MAX_SRCSET_WIDTH : options.maxWidth; // Validate the range unless we're using defaults for both + var maxWidth = options.maxWidth === undefined ? MAX_SRCSET_WIDTH : options.maxWidth; + // Validate the range unless we're using defaults for both if (minWidth != MIN_SRCSET_WIDTH || maxWidth != MAX_SRCSET_WIDTH) { validateRange(minWidth, maxWidth); } - return [widthTolerance, minWidth, maxWidth]; } function validateRange(min, max) { @@ -259,7 +245,6 @@ function validateWidths(customWidths) { var allPositiveIntegers = customWidths.every(function (width) { return Number.isInteger(width) && width > 0; }); - if (!allPositiveIntegers) { throw new Error('A custom widths argument can only contain positive integer values'); } @@ -277,7 +262,6 @@ function validateDevicePixelRatios(devicePixelRatios) { var allValidDPR = devicePixelRatios.every(function (dpr) { return typeof dpr === 'number' && dpr >= 1 && dpr <= 5; }); - if (!allValidDPR) { throw new Error('The devicePixelRatios argument can only contain positive integer values between 1 and 5'); } @@ -292,45 +276,35 @@ function validateVariableQualities(variableQualities) { var ImgixClient = /*#__PURE__*/function () { function ImgixClient() { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - _classCallCheck(this, ImgixClient); - - this.settings = _objectSpread2(_objectSpread2({}, DEFAULT_OPTIONS), opts); // a cache to store memoized srcset width-pairs - + this.settings = _objectSpread2(_objectSpread2({}, DEFAULT_OPTIONS), opts); + // a cache to store memoized srcset width-pairs this.targetWidthsCache = {}; - if (typeof this.settings.domain != 'string') { throw new Error('ImgixClient must be passed a valid string domain'); } - if (DOMAIN_REGEX.exec(this.settings.domain) == null) { throw new Error('Domain must be passed in as fully-qualified ' + 'domain name and should not include a protocol or any path ' + 'element, i.e. "example.imgix.net".'); } - if (this.settings.includeLibraryParam) { this.settings.libraryParam = 'js-' + ImgixClient.version(); } - this.settings.urlPrefix = this.settings.useHTTPS ? 'https://' : 'http://'; } - _createClass(ImgixClient, [{ key: "buildURL", value: function buildURL() { var rawPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var path = this._sanitizePath(rawPath, options); - var finalParams = this._buildParams(params, options); - if (!!this.settings.secureURLToken) { finalParams = this._signParams(path, finalParams); } - return this.settings.urlPrefix + this.settings.domain + path + finalParams; } + /** *`_buildURL` static method allows full URLs to be formatted for use with * imgix. @@ -354,7 +328,6 @@ var ImgixClient = /*#__PURE__*/function () { * console.log(url) * // => "https://sdk-test.imgix.net/amsterdam.jpg?h=100&w=100" */ - }, { key: "_buildParams", value: function _buildParams() { @@ -365,13 +338,11 @@ var ImgixClient = /*#__PURE__*/function () { var encode = options.encoder || encodeURIComponent; var queryParams = [].concat(_toConsumableArray(this.settings.libraryParam ? ["ixlib=".concat(this.settings.libraryParam)] : []), _toConsumableArray(Object.entries(params).reduce(function (prev, _ref) { var _ref2 = _slicedToArray(_ref, 2), - key = _ref2[0], - value = _ref2[1]; - + key = _ref2[0], + value = _ref2[1]; if (value == null) { return prev; } - var encodedKey = encode(key); var encodedValue = key.substr(-2) === '64' ? jsBase64.Base64.encodeURI(value) : encode(value); prev.push("".concat(encodedKey, "=").concat(encodedValue)); @@ -386,6 +357,7 @@ var ImgixClient = /*#__PURE__*/function () { var signature = md5__default["default"](signatureBase); return queryParams.length > 0 ? queryParams + '&s=' + signature : '?s=' + signature; } + /** * "Sanitize" the path of the image URL. * Ensures that the path has a leading slash, and that the path is correctly @@ -396,19 +368,15 @@ var ImgixClient = /*#__PURE__*/function () { * @param {boolean} options.encode Whether to encode the path, default true * @returns {string} The sanitized path */ - }, { key: "_sanitizePath", value: function _sanitizePath(path) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Strip leading slash first (we'll re-add after encoding) var _path = path.replace(/^\//, ''); - if (options.disablePathEncoding) { return '/' + _path; } - if (options.encoder) { _path = options.encoder(_path); } else if (/^https?:\/\//.test(_path)) { @@ -420,7 +388,6 @@ var ImgixClient = /*#__PURE__*/function () { // so it leaves legal characters like '/' and '@' alone _path = encodeURI(_path).replace(/[#?:+]/g, encodeURIComponent); } - return '/' + _path; } }, { @@ -429,14 +396,14 @@ var ImgixClient = /*#__PURE__*/function () { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var w = params.w, - h = params.h; - + h = params.h; if (w || h) { return this._buildDPRSrcSet(path, params, options); } else { return this._buildSrcSetPairs(path, params, options); } } + /** * _buildSrcSet static method allows full URLs to be used when generating * imgix formatted `srcset` string values. @@ -451,30 +418,24 @@ var ImgixClient = /*#__PURE__*/function () { * @param {Object} clientOptions - imgix client options, optional * @returns imgix `srcset` for full URLs. */ - }, { key: "_buildSrcSetPairs", value: function _buildSrcSetPairs(path) { var _this = this; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var _validateAndDestructu = validateAndDestructureOptions(options), - _validateAndDestructu2 = _slicedToArray(_validateAndDestructu, 3), - widthTolerance = _validateAndDestructu2[0], - minWidth = _validateAndDestructu2[1], - maxWidth = _validateAndDestructu2[2]; - + _validateAndDestructu2 = _slicedToArray(_validateAndDestructu, 3), + widthTolerance = _validateAndDestructu2[0], + minWidth = _validateAndDestructu2[1], + maxWidth = _validateAndDestructu2[2]; var targetWidthValues; - if (options.widths) { validateWidths(options.widths); targetWidthValues = _toConsumableArray(options.widths); } else { targetWidthValues = ImgixClient.targetWidths(minWidth, maxWidth, widthTolerance, this.targetWidthsCache); } - var srcset = targetWidthValues.map(function (w) { return "".concat(_this.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { w: w @@ -486,34 +447,26 @@ var ImgixClient = /*#__PURE__*/function () { key: "_buildDPRSrcSet", value: function _buildDPRSrcSet(path) { var _this2 = this; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - if (options.devicePixelRatios) { validateDevicePixelRatios(options.devicePixelRatios); } - var targetRatios = options.devicePixelRatios || DEFAULT_DPR; var disableVariableQuality = options.disableVariableQuality || false; - if (!disableVariableQuality) { validateVariableQuality(disableVariableQuality); } - if (options.variableQualities) { validateVariableQualities(options.variableQualities); } - var qualities = _objectSpread2(_objectSpread2({}, DPR_QUALITIES), options.variableQualities); - var withQuality = function withQuality(path, params, dpr) { return "".concat(_this2.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { dpr: dpr, q: params.q || qualities[dpr] || qualities[Math.floor(dpr)] }), options), " ").concat(dpr, "x"); }; - var srcset = disableVariableQuality ? targetRatios.map(function (dpr) { return "".concat(_this2.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { dpr: dpr @@ -533,27 +486,23 @@ var ImgixClient = /*#__PURE__*/function () { value: function _buildURL(url) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - if (url == null) { return ''; } - var _extractUrl = extractUrl({ - url: url, - useHTTPS: options.useHTTPS - }), - host = _extractUrl.host, - pathname = _extractUrl.pathname, - search = _extractUrl.search; // merge source URL parameters with options parameters - - - var combinedParams = _objectSpread2(_objectSpread2({}, ufo.getQuery(search)), params); // throw error if no host or no pathname present - - + url: url, + useHTTPS: options.useHTTPS + }), + host = _extractUrl.host, + pathname = _extractUrl.pathname, + search = _extractUrl.search; + // merge source URL parameters with options parameters + var combinedParams = _objectSpread2(_objectSpread2({}, ufo.getQuery(search)), params); + + // throw error if no host or no pathname present if (!host.length || !pathname.length) { throw new Error('_buildURL: URL must match {host}/{pathname}?{query}'); } - var client = new ImgixClient(_objectSpread2({ domain: host }, options)); @@ -565,33 +514,30 @@ var ImgixClient = /*#__PURE__*/function () { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var srcsetModifiers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var clientOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - if (url == null) { return ''; } - var _extractUrl2 = extractUrl({ - url: url, - useHTTPS: clientOptions.useHTTPS - }), - host = _extractUrl2.host, - pathname = _extractUrl2.pathname, - search = _extractUrl2.search; // merge source URL parameters with options parameters - - - var combinedParams = _objectSpread2(_objectSpread2({}, ufo.getQuery(search)), params); // throw error if no host or no pathname present - - + url: url, + useHTTPS: clientOptions.useHTTPS + }), + host = _extractUrl2.host, + pathname = _extractUrl2.pathname, + search = _extractUrl2.search; + // merge source URL parameters with options parameters + var combinedParams = _objectSpread2(_objectSpread2({}, ufo.getQuery(search)), params); + + // throw error if no host or no pathname present if (!host.length || !pathname.length) { throw new Error('_buildOneStepURL: URL must match {host}/{pathname}?{query}'); } - var client = new ImgixClient(_objectSpread2({ domain: host }, clientOptions)); return client.buildSrcSet(pathname, combinedParams, srcsetModifiers); - } // returns an array of width values used during srcset generation + } + // returns an array of width values used during srcset generation }, { key: "targetWidths", value: function targetWidths() { @@ -603,40 +549,36 @@ var ImgixClient = /*#__PURE__*/function () { var maxW = Math.floor(maxWidth); validateRange(minWidth, maxWidth); validateWidthTolerance(widthTolerance); - var cacheKey = widthTolerance + '/' + minW + '/' + maxW; // First, check the cache. + var cacheKey = widthTolerance + '/' + minW + '/' + maxW; + // First, check the cache. if (cacheKey in cache) { return cache[cacheKey]; } - if (minW === maxW) { return [minW]; } - var resolutions = []; var currentWidth = minW; - while (currentWidth < maxW) { // While the currentWidth is less than the maxW, push the rounded // width onto the list of resolutions. resolutions.push(Math.round(currentWidth)); currentWidth *= 1 + widthTolerance * 2; - } // At this point, the last width in resolutions is less than the + } + + // At this point, the last width in resolutions is less than the // currentWidth that caused the loop to terminate. This terminating // currentWidth is greater than or equal to the maxW. We want to // to stop at maxW, so we make sure our maxW is larger than the last // width in resolutions before pushing it (if it's equal we're done). - - if (resolutions[resolutions.length - 1] < maxW) { resolutions.push(maxW); } - cache[cacheKey] = resolutions; return resolutions; } }]); - return ImgixClient; }(); diff --git a/dist/index.esm.js b/dist/index.esm.js index bf5c4a78..19ba6794 100644 --- a/dist/index.esm.js +++ b/dist/index.esm.js @@ -2,19 +2,43 @@ import { Base64 } from 'js-base64'; import md5 from 'md5'; import { hasProtocol, parseURL, getQuery } from 'ufo'; +function _iterableToArrayLimit(arr, i) { + var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; + if (null != _i) { + var _s, + _e, + _x, + _r, + _arr = [], + _n = !0, + _d = !1; + try { + if (_x = (_i = _i.call(arr)).next, 0 === i) { + if (Object(_i) !== _i) return; + _n = !1; + } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); + } catch (err) { + _d = !0, _e = err; + } finally { + try { + if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; + } finally { + if (_d) throw _e; + } + } + return _arr; + } +} function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } - return keys; } - function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; @@ -24,10 +48,8 @@ function _objectSpread2(target) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } - return target; } - function _typeof(obj) { "@babel/helpers - typeof"; @@ -37,23 +59,20 @@ function _typeof(obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); @@ -62,8 +81,8 @@ function _createClass(Constructor, protoProps, staticProps) { }); return Constructor; } - function _defineProperty(obj, key, value) { + key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, @@ -74,60 +93,23 @@ function _defineProperty(obj, key, value) { } else { obj[key] = value; } - return obj; } - function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - -function _iterableToArrayLimit(arr, i) { - var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; - - if (_i == null) return; - var _arr = []; - var _n = true; - var _d = false; - - var _s, _e; - - try { - for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -136,34 +118,44 @@ function _unsupportedIterableToArray(o, minLen) { if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); +} +function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); +} // package version used in the ix-lib parameter -var VERSION = '3.6.1'; // regex pattern used to determine if a domain is valid - -var DOMAIN_REGEX = /^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i; // minimum generated srcset width - -var MIN_SRCSET_WIDTH = 100; // maximum generated srcset width - -var MAX_SRCSET_WIDTH = 8192; // default tolerable percent difference between srcset pair widths - -var DEFAULT_SRCSET_WIDTH_TOLERANCE = 0.08; // default quality parameter values mapped by each dpr srcset entry - +var VERSION = '3.7.0'; +// regex pattern used to determine if a domain is valid +var DOMAIN_REGEX = /^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i; +// minimum generated srcset width +var MIN_SRCSET_WIDTH = 100; +// maximum generated srcset width +var MAX_SRCSET_WIDTH = 8192; +// default tolerable percent difference between srcset pair widths +var DEFAULT_SRCSET_WIDTH_TOLERANCE = 0.08; + +// default quality parameter values mapped by each dpr srcset entry var DPR_QUALITIES = { 1: 75, 2: 50, @@ -192,14 +184,12 @@ var DEFAULT_OPTIONS = { * @returns {Object} `{ protocol, auth, host, pathname, search, hash }` * extracted from the URL. */ - function extractUrl(_ref) { var _ref$url = _ref.url, - url = _ref$url === void 0 ? '' : _ref$url, - _ref$useHttps = _ref.useHttps, - useHttps = _ref$useHttps === void 0 ? false : _ref$useHttps; + url = _ref$url === void 0 ? '' : _ref$url, + _ref$useHttps = _ref.useHttps, + useHttps = _ref$useHttps === void 0 ? false : _ref$useHttps; var defaultProto = useHttps ? 'https://' : 'http://'; - if (!hasProtocol(url, true)) { return extractUrl({ url: defaultProto + url @@ -212,28 +202,24 @@ function extractUrl(_ref) { * - `domainAndPath`: (.*) /) - all except line breaks * - `domain`: `([^/]*)` - all before a `/` token */ - - return parseURL(url); } function validateAndDestructureOptions(options) { var widthTolerance; - if (options.widthTolerance !== undefined) { validateWidthTolerance(options.widthTolerance); widthTolerance = options.widthTolerance; } else { widthTolerance = DEFAULT_SRCSET_WIDTH_TOLERANCE; } - var minWidth = options.minWidth === undefined ? MIN_SRCSET_WIDTH : options.minWidth; - var maxWidth = options.maxWidth === undefined ? MAX_SRCSET_WIDTH : options.maxWidth; // Validate the range unless we're using defaults for both + var maxWidth = options.maxWidth === undefined ? MAX_SRCSET_WIDTH : options.maxWidth; + // Validate the range unless we're using defaults for both if (minWidth != MIN_SRCSET_WIDTH || maxWidth != MAX_SRCSET_WIDTH) { validateRange(minWidth, maxWidth); } - return [widthTolerance, minWidth, maxWidth]; } function validateRange(min, max) { @@ -253,7 +239,6 @@ function validateWidths(customWidths) { var allPositiveIntegers = customWidths.every(function (width) { return Number.isInteger(width) && width > 0; }); - if (!allPositiveIntegers) { throw new Error('A custom widths argument can only contain positive integer values'); } @@ -271,7 +256,6 @@ function validateDevicePixelRatios(devicePixelRatios) { var allValidDPR = devicePixelRatios.every(function (dpr) { return typeof dpr === 'number' && dpr >= 1 && dpr <= 5; }); - if (!allValidDPR) { throw new Error('The devicePixelRatios argument can only contain positive integer values between 1 and 5'); } @@ -286,45 +270,35 @@ function validateVariableQualities(variableQualities) { var ImgixClient = /*#__PURE__*/function () { function ImgixClient() { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - _classCallCheck(this, ImgixClient); - - this.settings = _objectSpread2(_objectSpread2({}, DEFAULT_OPTIONS), opts); // a cache to store memoized srcset width-pairs - + this.settings = _objectSpread2(_objectSpread2({}, DEFAULT_OPTIONS), opts); + // a cache to store memoized srcset width-pairs this.targetWidthsCache = {}; - if (typeof this.settings.domain != 'string') { throw new Error('ImgixClient must be passed a valid string domain'); } - if (DOMAIN_REGEX.exec(this.settings.domain) == null) { throw new Error('Domain must be passed in as fully-qualified ' + 'domain name and should not include a protocol or any path ' + 'element, i.e. "example.imgix.net".'); } - if (this.settings.includeLibraryParam) { this.settings.libraryParam = 'js-' + ImgixClient.version(); } - this.settings.urlPrefix = this.settings.useHTTPS ? 'https://' : 'http://'; } - _createClass(ImgixClient, [{ key: "buildURL", value: function buildURL() { var rawPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var path = this._sanitizePath(rawPath, options); - var finalParams = this._buildParams(params, options); - if (!!this.settings.secureURLToken) { finalParams = this._signParams(path, finalParams); } - return this.settings.urlPrefix + this.settings.domain + path + finalParams; } + /** *`_buildURL` static method allows full URLs to be formatted for use with * imgix. @@ -348,7 +322,6 @@ var ImgixClient = /*#__PURE__*/function () { * console.log(url) * // => "https://sdk-test.imgix.net/amsterdam.jpg?h=100&w=100" */ - }, { key: "_buildParams", value: function _buildParams() { @@ -359,13 +332,11 @@ var ImgixClient = /*#__PURE__*/function () { var encode = options.encoder || encodeURIComponent; var queryParams = [].concat(_toConsumableArray(this.settings.libraryParam ? ["ixlib=".concat(this.settings.libraryParam)] : []), _toConsumableArray(Object.entries(params).reduce(function (prev, _ref) { var _ref2 = _slicedToArray(_ref, 2), - key = _ref2[0], - value = _ref2[1]; - + key = _ref2[0], + value = _ref2[1]; if (value == null) { return prev; } - var encodedKey = encode(key); var encodedValue = key.substr(-2) === '64' ? Base64.encodeURI(value) : encode(value); prev.push("".concat(encodedKey, "=").concat(encodedValue)); @@ -380,6 +351,7 @@ var ImgixClient = /*#__PURE__*/function () { var signature = md5(signatureBase); return queryParams.length > 0 ? queryParams + '&s=' + signature : '?s=' + signature; } + /** * "Sanitize" the path of the image URL. * Ensures that the path has a leading slash, and that the path is correctly @@ -390,19 +362,15 @@ var ImgixClient = /*#__PURE__*/function () { * @param {boolean} options.encode Whether to encode the path, default true * @returns {string} The sanitized path */ - }, { key: "_sanitizePath", value: function _sanitizePath(path) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Strip leading slash first (we'll re-add after encoding) var _path = path.replace(/^\//, ''); - if (options.disablePathEncoding) { return '/' + _path; } - if (options.encoder) { _path = options.encoder(_path); } else if (/^https?:\/\//.test(_path)) { @@ -414,7 +382,6 @@ var ImgixClient = /*#__PURE__*/function () { // so it leaves legal characters like '/' and '@' alone _path = encodeURI(_path).replace(/[#?:+]/g, encodeURIComponent); } - return '/' + _path; } }, { @@ -423,14 +390,14 @@ var ImgixClient = /*#__PURE__*/function () { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var w = params.w, - h = params.h; - + h = params.h; if (w || h) { return this._buildDPRSrcSet(path, params, options); } else { return this._buildSrcSetPairs(path, params, options); } } + /** * _buildSrcSet static method allows full URLs to be used when generating * imgix formatted `srcset` string values. @@ -445,30 +412,24 @@ var ImgixClient = /*#__PURE__*/function () { * @param {Object} clientOptions - imgix client options, optional * @returns imgix `srcset` for full URLs. */ - }, { key: "_buildSrcSetPairs", value: function _buildSrcSetPairs(path) { var _this = this; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var _validateAndDestructu = validateAndDestructureOptions(options), - _validateAndDestructu2 = _slicedToArray(_validateAndDestructu, 3), - widthTolerance = _validateAndDestructu2[0], - minWidth = _validateAndDestructu2[1], - maxWidth = _validateAndDestructu2[2]; - + _validateAndDestructu2 = _slicedToArray(_validateAndDestructu, 3), + widthTolerance = _validateAndDestructu2[0], + minWidth = _validateAndDestructu2[1], + maxWidth = _validateAndDestructu2[2]; var targetWidthValues; - if (options.widths) { validateWidths(options.widths); targetWidthValues = _toConsumableArray(options.widths); } else { targetWidthValues = ImgixClient.targetWidths(minWidth, maxWidth, widthTolerance, this.targetWidthsCache); } - var srcset = targetWidthValues.map(function (w) { return "".concat(_this.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { w: w @@ -480,34 +441,26 @@ var ImgixClient = /*#__PURE__*/function () { key: "_buildDPRSrcSet", value: function _buildDPRSrcSet(path) { var _this2 = this; - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - if (options.devicePixelRatios) { validateDevicePixelRatios(options.devicePixelRatios); } - var targetRatios = options.devicePixelRatios || DEFAULT_DPR; var disableVariableQuality = options.disableVariableQuality || false; - if (!disableVariableQuality) { validateVariableQuality(disableVariableQuality); } - if (options.variableQualities) { validateVariableQualities(options.variableQualities); } - var qualities = _objectSpread2(_objectSpread2({}, DPR_QUALITIES), options.variableQualities); - var withQuality = function withQuality(path, params, dpr) { return "".concat(_this2.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { dpr: dpr, q: params.q || qualities[dpr] || qualities[Math.floor(dpr)] }), options), " ").concat(dpr, "x"); }; - var srcset = disableVariableQuality ? targetRatios.map(function (dpr) { return "".concat(_this2.buildURL(path, _objectSpread2(_objectSpread2({}, params), {}, { dpr: dpr @@ -527,27 +480,23 @@ var ImgixClient = /*#__PURE__*/function () { value: function _buildURL(url) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - if (url == null) { return ''; } - var _extractUrl = extractUrl({ - url: url, - useHTTPS: options.useHTTPS - }), - host = _extractUrl.host, - pathname = _extractUrl.pathname, - search = _extractUrl.search; // merge source URL parameters with options parameters - - - var combinedParams = _objectSpread2(_objectSpread2({}, getQuery(search)), params); // throw error if no host or no pathname present - - + url: url, + useHTTPS: options.useHTTPS + }), + host = _extractUrl.host, + pathname = _extractUrl.pathname, + search = _extractUrl.search; + // merge source URL parameters with options parameters + var combinedParams = _objectSpread2(_objectSpread2({}, getQuery(search)), params); + + // throw error if no host or no pathname present if (!host.length || !pathname.length) { throw new Error('_buildURL: URL must match {host}/{pathname}?{query}'); } - var client = new ImgixClient(_objectSpread2({ domain: host }, options)); @@ -559,33 +508,30 @@ var ImgixClient = /*#__PURE__*/function () { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var srcsetModifiers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var clientOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - if (url == null) { return ''; } - var _extractUrl2 = extractUrl({ - url: url, - useHTTPS: clientOptions.useHTTPS - }), - host = _extractUrl2.host, - pathname = _extractUrl2.pathname, - search = _extractUrl2.search; // merge source URL parameters with options parameters - - - var combinedParams = _objectSpread2(_objectSpread2({}, getQuery(search)), params); // throw error if no host or no pathname present - - + url: url, + useHTTPS: clientOptions.useHTTPS + }), + host = _extractUrl2.host, + pathname = _extractUrl2.pathname, + search = _extractUrl2.search; + // merge source URL parameters with options parameters + var combinedParams = _objectSpread2(_objectSpread2({}, getQuery(search)), params); + + // throw error if no host or no pathname present if (!host.length || !pathname.length) { throw new Error('_buildOneStepURL: URL must match {host}/{pathname}?{query}'); } - var client = new ImgixClient(_objectSpread2({ domain: host }, clientOptions)); return client.buildSrcSet(pathname, combinedParams, srcsetModifiers); - } // returns an array of width values used during srcset generation + } + // returns an array of width values used during srcset generation }, { key: "targetWidths", value: function targetWidths() { @@ -597,40 +543,36 @@ var ImgixClient = /*#__PURE__*/function () { var maxW = Math.floor(maxWidth); validateRange(minWidth, maxWidth); validateWidthTolerance(widthTolerance); - var cacheKey = widthTolerance + '/' + minW + '/' + maxW; // First, check the cache. + var cacheKey = widthTolerance + '/' + minW + '/' + maxW; + // First, check the cache. if (cacheKey in cache) { return cache[cacheKey]; } - if (minW === maxW) { return [minW]; } - var resolutions = []; var currentWidth = minW; - while (currentWidth < maxW) { // While the currentWidth is less than the maxW, push the rounded // width onto the list of resolutions. resolutions.push(Math.round(currentWidth)); currentWidth *= 1 + widthTolerance * 2; - } // At this point, the last width in resolutions is less than the + } + + // At this point, the last width in resolutions is less than the // currentWidth that caused the loop to terminate. This terminating // currentWidth is greater than or equal to the maxW. We want to // to stop at maxW, so we make sure our maxW is larger than the last // width in resolutions before pushing it (if it's equal we're done). - - if (resolutions[resolutions.length - 1] < maxW) { resolutions.push(maxW); } - cache[cacheKey] = resolutions; return resolutions; } }]); - return ImgixClient; }(); diff --git a/package.json b/package.json index 0128c590..6cb28c45 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@imgix/js-core", "description": "A JavaScript client library for generating image URLs with imgix", - "version": "3.7.0", + "version": "3.7.1", "repository": "https://github.com/imgix/js-core", "license": "BSD-2-Clause", "main": "dist/index.cjs.js", diff --git a/src/constants.js b/src/constants.js index b24b1bf5..614ff19e 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,5 +1,5 @@ // package version used in the ix-lib parameter -export const VERSION = '3.7.0'; +export const VERSION = '3.7.1'; // regex pattern used to determine if a domain is valid export const DOMAIN_REGEX = /^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i; // minimum generated srcset width