diff --git a/dist/imgix-js-core.umd.js b/dist/imgix-js-core.umd.js index b9e07c65..ee5e9126 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 i(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>>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}),g={utf8:{stringToBytes:function(t){return g.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString:function(t){return decodeURIComponent(escape(g.bin.bytesToString(t)))}},bin:{stringToBytes:function(t){for(var e=[],r=0;r>>24)|4278255360&(t[i]<<24|t[i]>>>8);t[f>>>5]|=128<>>9<<4)]=f;for(var a=g._ff,u=g._gg,s=g._hh,c=g._ii,i=0;i>>0,r=r+h>>>0,n=n+y>>>0,o=o+b>>>0}return p.endian([e,r,n,o])}var p,v,m,w;p=x,v=P.utf8,m=A,w=P.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=p.wordsToBytes(g(t,e));return e&&e.asBytes?t:e&&e.asString?w.bytesToString(t):p.bytesToHex(t)}}),m="3.7.2",w="function"==typeof atob,t="function"==typeof btoa,e="function"==typeof Buffer;const S="function"==typeof TextDecoder?new TextDecoder:void 0,T="function"==typeof TextEncoder?new TextEncoder:void 0;const u=Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="),a=(t=>{let r={};return t.forEach((t,e)=>r[t]=e),r})(u),B=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,s=String.fromCharCode.bind(String),C="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):(t,e=t=>t)=>new Uint8Array(Array.prototype.slice.call(t,0).map(e)),j=t=>t.replace(/=/g,"").replace(/[+\/]/g,t=>"+"==t?"-":"_"),E=t=>t.replace(/[^A-Za-z0-9\+\/]/g,"");var U=e=>{let r,n,o,i,a="";var t=e.length%3;for(let t=0;t>18&63]+u[r>>12&63]+u[r>>6&63]+u[63&r]}return t?a.slice(0,t-3)+"===".substring(t):a};const R=t?t=>btoa(t):e?t=>Buffer.from(t,"binary").toString("base64"):U,O=e?t=>Buffer.from(t).toString("base64"):r=>{let n=[];for(let t=0,e=r.length;te?j(O(t)):O(t),I=t=>{var e;return t.length<2?(e=t.charCodeAt(0))<128?t:e<2048?s(192|e>>>6)+s(128|63&e):s(224|e>>>12&15)+s(128|e>>>6&63)+s(128|63&e):(e=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320),s(240|e>>>18&7)+s(128|e>>>12&63)+s(128|e>>>6&63)+s(128|63&e))},_=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,F=t=>t.replace(_,I),k=e?t=>Buffer.from(t,"utf8").toString("base64"):T?t=>O(T.encode(t)):t=>R(F(t)),o=(t,e=!1)=>e?j(k(t)):k(t);t=t=>o(t,!0);const z=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,D=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 s(55296+(e>>>10))+s(56320+(1023&e));case 3:return s((15&t.charCodeAt(0))<<12|(63&t.charCodeAt(1))<<6|63&t.charCodeAt(2));default:return s((31&t.charCodeAt(0))<<6|63&t.charCodeAt(1))}},L=t=>t.replace(z,D);var W=e=>{if(e=e.replace(/\s+/g,""),!B.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?s(r>>16&255,r>>8&255):s(r>>16&255,r>>8&255,255&r);return n};const M=w?t=>atob(E(t)):e?t=>Buffer.from(t,"base64").toString("binary"):W,Z=e?t=>C(Buffer.from(t,"base64")):t=>C(M(t),t=>t.charCodeAt(0)),N=t=>Z(q(t)),Q=e?t=>Buffer.from(t,"base64").toString("utf8"):S?t=>S.decode(Z(t)):t=>L(M(t)),q=t=>E(t.replace(/[-_]/g,t=>"-"==t?"+":"/")),H=t=>Q(q(t));function V(){var t=(t,e)=>Object.defineProperty(String.prototype,t,G(e));t("fromBase64",function(){return H(this)}),t("toBase64",function(t){return o(this,t)}),t("toBase64URI",function(){return o(this,!0)}),t("toBase64URL",function(){return o(this,!0)}),t("toUint8Array",function(){return N(this)})}function $(){var t=(t,e)=>Object.defineProperty(Uint8Array.prototype,t,G(e));t("toBase64",function(t){return r(this,t)}),t("toBase64URI",function(){return r(this,!0)}),t("toBase64URL",function(){return r(this,!0)})}const G=t=>({value:t,enumerable:!1,writable:!0,configurable:!0});const J={version:m,VERSION:"3.7.2",atob:M,atobPolyfill:W,btoa:R,btoaPolyfill:U,fromBase64:H,toBase64:o,encode:o,encodeURI:t,encodeURL:t,utob:F,btou:L,decode:H,isValid:t=>{if("string"!=typeof t)return!1;t=t.replace(/\s+/g,"").replace(/={0,2}$/,"");return!/[^\s0-9a-zA-Z\+/]/.test(t)||!/[^\s0-9a-zA-Z\-_]/.test(t)},fromUint8Array:r,toUint8Array:N,extendString:V,extendUint8Array:$,extendBuiltins:()=>{V(),$()}};var K=/^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i,X={1:75,2:50,3:35,4:23,5:20},Y=[1,2,3,4,5],tt={domain:null,useHTTPS:!0,includeLibraryParam:!0,urlPrefix:"https://",secureURLToken:null};function et(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})(u),m=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,s=String.fromCharCode.bind(String),w="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):(t,e=t=>t)=>new Uint8Array(Array.prototype.slice.call(t,0).map(e)),A=t=>t.replace(/=/g,"").replace(/[+\/]/g,t=>"+"==t?"-":"_"),S=t=>t.replace(/[^A-Za-z0-9\+\/]/g,"");var x=e=>{let r,n,o,i,a="";var t=e.length%3;for(let t=0;t>18&63]+u[r>>12&63]+u[r>>6&63]+u[63&r]}return t?a.slice(0,t-3)+"===".substring(t):a};const T=t?t=>btoa(t):e?t=>Buffer.from(t,"binary").toString("base64"):x,P=e?t=>Buffer.from(t).toString("base64"):r=>{let n=[];for(let t=0,e=r.length;te?A(P(t)):P(t),U=t=>{var e;return t.length<2?(e=t.charCodeAt(0))<128?t:e<2048?s(192|e>>>6)+s(128|63&e):s(224|e>>>12&15)+s(128|e>>>6&63)+s(128|63&e):(e=65536+1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320),s(240|e>>>18&7)+s(128|e>>>12&63)+s(128|e>>>6&63)+s(128|63&e))},B=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,C=t=>t.replace(B,U),R=e?t=>Buffer.from(t,"utf8").toString("base64"):v?t=>P(v.encode(t)):t=>T(C(t)),o=(t,e=!1)=>e?A(R(t)):R(t);t=t=>o(t,!0);const E=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,j=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 s(55296+(e>>>10))+s(56320+(1023&e));case 3:return s((15&t.charCodeAt(0))<<12|(63&t.charCodeAt(1))<<6|63&t.charCodeAt(2));default:return s((31&t.charCodeAt(0))<<6|63&t.charCodeAt(1))}},_=t=>t.replace(E,j);var O=e=>{if(e=e.replace(/\s+/g,""),!m.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?s(r>>16&255,r>>8&255):s(r>>16&255,r>>8&255,255&r);return n};const I=g?t=>atob(S(t)):e?t=>Buffer.from(t,"base64").toString("binary"):O,L=e?t=>w(Buffer.from(t,"base64")):t=>w(I(t),t=>t.charCodeAt(0)),k=t=>L(z(t)),F=e?t=>Buffer.from(t,"base64").toString("utf8"):b?t=>b.decode(L(t)):t=>_(I(t)),z=t=>S(t.replace(/[-_]/g,t=>"-"==t?"+":"/")),D=t=>F(z(t));function W(){var t=(t,e)=>Object.defineProperty(String.prototype,t,M(e));t("fromBase64",function(){return D(this)}),t("toBase64",function(t){return o(this,t)}),t("toBase64URI",function(){return o(this,!0)}),t("toBase64URL",function(){return o(this,!0)}),t("toUint8Array",function(){return k(this)})}function H(){var t=(t,e)=>Object.defineProperty(Uint8Array.prototype,t,M(e));t("toBase64",function(t){return r(this,t)}),t("toBase64URI",function(){return r(this,!0)}),t("toBase64URL",function(){return r(this,!0)})}const M=t=>({value:t,enumerable:!1,writable:!0,configurable:!0});const Z={version:p,VERSION:"3.7.2",atob:I,atobPolyfill:O,btoa:T,btoaPolyfill:x,fromBase64:D,toBase64:o,encode:o,encodeURI:t,encodeURL:t,utob:C,btou:_,decode:D,isValid:t=>{if("string"!=typeof t)return!1;t=t.replace(/\s+/g,"").replace(/={0,2}$/,"");return!/[^\s0-9a-zA-Z\+/]/.test(t)||!/[^\s0-9a-zA-Z\-_]/.test(t)},fromUint8Array:r,toUint8Array:k,extendString:W,extendUint8Array:H,extendBuiltins:()=>{W(),H()}};function q(t,e){return t(e={exports:{}},e.exports),e.exports}function N(t){return null!=t&&(G(t)||"function"==typeof(e=t).readFloatLE&&"function"==typeof e.slice&&G(e.slice(0,0))||!!t._isBuffer);var e}var Q=q(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}),V={utf8:{stringToBytes:function(t){return V.bin.stringToBytes(unescape(encodeURIComponent(t)))},bytesToString:function(t){return decodeURIComponent(escape(V.bin.bytesToString(t)))}},bin:{stringToBytes:function(t){for(var e=[],r=0;r>>24)|4278255360&(t[i]<<24|t[i]>>>8);t[f>>>5]|=128<>>9<<4)]=f;for(var a=g._ff,u=g._gg,s=g._hh,c=g._ii,i=0;i>>0,r=r+d>>>0,n=n+y>>>0,o=o+p>>>0}return b.endian([e,r,n,o])}var b,v,m,w;b=Q,v=$.utf8,m=N,w=$.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 K=/\+/g;function X(e=""){try{return decodeURIComponent(""+e)}catch(t){return""+e}}function Y(t=""){const e={};for(const o of(t="?"===t[0]?t.substr(1):t).split("&")){var r,n=o.match(/([^=]+)=?(.*)/)||[];n.length<2||"__proto__"!==(r=X(n[1]))&&"constructor"!==r&&(n=X((n[2]||"").replace(K," ")),e[r]?Array.isArray(e[r])?e[r].push(n):e[r]=[e[r],n]:e[r]=n)}return e}function tt(t,e=!1){return/^\w+:\/\/.+/.test(t)||e&&/^\/\/[^/]+/.test(t)}function et(t){return Y(rt(t).search)}function rt(t="",e){if(!tt(t,!0))return e?rt(e+t):nt(t);const[r="",n,o]=(t.replace(/\\/g,"/").match(/([^:/]+:)?\/\/([^/@]+@)?(.*)/)||[]).splice(1);var[e="",t=""]=(o.match(/([^/?]*)(.*)?/)||[]).splice(1),{pathname:t,search:i,hash:a}=nt(t);return{protocol:r,auth:n?n.substr(0,n.length-1):"",host:e,pathname:t,search:i,hash:a}}function nt(t=""){var[t="",e="",r=""]=(t.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:e,hash:r}}var ot=/^(?:[a-z\d\-_]{1,62}\.){0,125}(?:[a-z\d](?:\-(?=\-*[a-z\d])|[a-z]|\d){0,62}\.)[a-z\d]{1,63}$/i,it={1:75,2:50,3:35,4:23,5:20},at=[1,2,3,4,5],ut={domain:null,useHTTPS:!0,includeLibraryParam:!0,urlPrefix:"https://",secureURLToken:null};function st(t){var e=t.url,e=void 0===e?"":e,t=t.useHttps,t=void 0!==t&&t?"https://":"http://";return tt(e,!0)?rt(e):st({url:t+e})}function ct(t,e){if(!Number.isInteger(t)||!Number.isInteger(e)||t<=0||e<=0||e "https://sdk-test.imgix.net/amsterdam.jpg?h=100&w=100" + */ + }, { key: "_buildParams", value: function _buildParams() { @@ -368,7 +430,21 @@ var ImgixClient = /*#__PURE__*/function () { } else { return this._buildSrcSetPairs(path, params, options); } - } // returns an array of width values used during srcset generation + } + /** + * _buildSrcSet static method allows full URLs to be used when generating + * imgix formatted `srcset` string values. + * + * - If the source URL has included parameters, they are merged with + * the `params` passed in as an argument. + * - URL must match `{host}/{pathname}?{query}` otherwise an error is thrown. + * + * @param {String} url - full source URL path string, required + * @param {Object} params - imgix params object, optional + * @param {Object} srcsetModifiers - srcset modifiers, optional + * @param {Object} clientOptions - imgix client options, optional + * @returns imgix `srcset` for full URLs. + */ }, { key: "_buildSrcSetPairs", @@ -452,6 +528,70 @@ var ImgixClient = /*#__PURE__*/function () { value: function version() { return VERSION; } + }, { + key: "_buildURL", + 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 + + + if (!host.length || !pathname.length) { + throw new Error('_buildURL: URL must match {host}/{pathname}?{query}'); + } + + var client = new ImgixClient(_objectSpread2({ + domain: host + }, options)); + return client.buildURL(pathname, combinedParams); + } + }, { + key: "_buildSrcSet", + value: function _buildSrcSet(url) { + 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 + + + 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 + }, { key: "targetWidths", value: function targetWidths() { diff --git a/dist/index.d.ts b/dist/index.d.ts index b99f634a..5559976b 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -28,6 +28,13 @@ declare class ImgixClient { widthTolerance?: number, cache?: {}, ): number[]; + static _buildURL(path: string, params?: {}, options?: {}): string; + static _buildSrcSet( + path: string, + params?: {}, + srcSetOptions?: {}, + clientOptions?: {}, + ): string; } export type DevicePixelRatio = 1 | 2 | 3 | 4 | 5 | number; diff --git a/dist/index.esm.js b/dist/index.esm.js index 529343b1..7ab906de 100644 --- a/dist/index.esm.js +++ b/dist/index.esm.js @@ -1,5 +1,6 @@ -import md5 from 'md5'; import { Base64 } from 'js-base64'; +import md5 from 'md5'; +import { hasProtocol, parseURL, getQuery } from 'ufo'; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); @@ -153,7 +154,7 @@ function _nonIterableRest() { } // package version used in the ix-lib parameter -var VERSION = '3.5.0'; // regex pattern used to determine if a domain is valid +var VERSION = '3.5.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 @@ -179,6 +180,43 @@ var DEFAULT_OPTIONS = { secureURLToken: null }; +/** + * `extractUrl()` extracts URL components from a source URL string. + * It does this by matching the URL against regular expressions. The irrelevant + * (entire URL) matches are removed and the rest stored as their corresponding + * URL components. + * + * `url` can be a partial, full URL, or full proxy URL. `useHttps` boolean + * defaults to false. + * + * @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; + var defaultProto = useHttps ? 'https://' : 'http://'; + + if (!hasProtocol(url, true)) { + return extractUrl({ + url: defaultProto + url + }); + } + /** + * Regex are hard to parse. Leaving this breakdown here for reference. + * - `protocol`: ([^:/]+:)? - all not `:` or `/` & preceded by `:`, 0-1 times + * - `auth`: ([^/@]+@)? - all not `/` or `@` & preceded by `@`, 0-1 times + * - `domainAndPath`: (.*) /) - all except line breaks + * - `domain`: `([^/]*)` - all before a `/` token + */ + + + return parseURL(url); +} + function validateAndDestructureOptions(options) { var widthTolerance; @@ -289,6 +327,30 @@ var ImgixClient = /*#__PURE__*/function () { return this.settings.urlPrefix + this.settings.domain + path + finalParams; } + /** + *`_buildURL` static method allows full URLs to be formatted for use with + * imgix. + * + * - If the source URL has included parameters, they are merged with + * the `params` passed in as an argument. + * - URL must match `{host}/{pathname}?{query}` otherwise an error is thrown. + * + * @param {String} url - full source URL path string, required + * @param {Object} params - imgix params object, optional + * @param {Object} options - imgix client options, optional + * + * @returns URL string formatted to imgix specifications. + * + * @example + * const client = ImgixClient + * const params = { w: 100 } + * const opts = { useHttps: true } + * const src = "sdk-test.imgix.net/amsterdam.jpg?h=100" + * const url = client._buildURL(src, params, opts) + * console.log(url) + * // => "https://sdk-test.imgix.net/amsterdam.jpg?h=100&w=100" + */ + }, { key: "_buildParams", value: function _buildParams() { @@ -362,7 +424,21 @@ var ImgixClient = /*#__PURE__*/function () { } else { return this._buildSrcSetPairs(path, params, options); } - } // returns an array of width values used during srcset generation + } + /** + * _buildSrcSet static method allows full URLs to be used when generating + * imgix formatted `srcset` string values. + * + * - If the source URL has included parameters, they are merged with + * the `params` passed in as an argument. + * - URL must match `{host}/{pathname}?{query}` otherwise an error is thrown. + * + * @param {String} url - full source URL path string, required + * @param {Object} params - imgix params object, optional + * @param {Object} srcsetModifiers - srcset modifiers, optional + * @param {Object} clientOptions - imgix client options, optional + * @returns imgix `srcset` for full URLs. + */ }, { key: "_buildSrcSetPairs", @@ -446,6 +522,70 @@ var ImgixClient = /*#__PURE__*/function () { value: function version() { return VERSION; } + }, { + key: "_buildURL", + 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 + + + if (!host.length || !pathname.length) { + throw new Error('_buildURL: URL must match {host}/{pathname}?{query}'); + } + + var client = new ImgixClient(_objectSpread2({ + domain: host + }, options)); + return client.buildURL(pathname, combinedParams); + } + }, { + key: "_buildSrcSet", + value: function _buildSrcSet(url) { + 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 + + + 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 + }, { key: "targetWidths", value: function targetWidths() { diff --git a/package.json b/package.json index 7622bb0f..c76bc108 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.5.1", + "version": "3.6.0-rc.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 2b32ac84..b0ba38f8 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.5.1'; +export const VERSION = '3.6.0-rc.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