ru-se.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

url.js (27041B)


      1 this["wp"] = this["wp"] || {}; this["wp"]["url"] =
      2 /******/ (function(modules) { // webpackBootstrap
      3 /******/ 	// The module cache
      4 /******/ 	var installedModules = {};
      5 /******/
      6 /******/ 	// The require function
      7 /******/ 	function __webpack_require__(moduleId) {
      8 /******/
      9 /******/ 		// Check if module is in cache
     10 /******/ 		if(installedModules[moduleId]) {
     11 /******/ 			return installedModules[moduleId].exports;
     12 /******/ 		}
     13 /******/ 		// Create a new module (and put it into the cache)
     14 /******/ 		var module = installedModules[moduleId] = {
     15 /******/ 			i: moduleId,
     16 /******/ 			l: false,
     17 /******/ 			exports: {}
     18 /******/ 		};
     19 /******/
     20 /******/ 		// Execute the module function
     21 /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     22 /******/
     23 /******/ 		// Flag the module as loaded
     24 /******/ 		module.l = true;
     25 /******/
     26 /******/ 		// Return the exports of the module
     27 /******/ 		return module.exports;
     28 /******/ 	}
     29 /******/
     30 /******/
     31 /******/ 	// expose the modules object (__webpack_modules__)
     32 /******/ 	__webpack_require__.m = modules;
     33 /******/
     34 /******/ 	// expose the module cache
     35 /******/ 	__webpack_require__.c = installedModules;
     36 /******/
     37 /******/ 	// define getter function for harmony exports
     38 /******/ 	__webpack_require__.d = function(exports, name, getter) {
     39 /******/ 		if(!__webpack_require__.o(exports, name)) {
     40 /******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
     41 /******/ 		}
     42 /******/ 	};
     43 /******/
     44 /******/ 	// define __esModule on exports
     45 /******/ 	__webpack_require__.r = function(exports) {
     46 /******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
     47 /******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
     48 /******/ 		}
     49 /******/ 		Object.defineProperty(exports, '__esModule', { value: true });
     50 /******/ 	};
     51 /******/
     52 /******/ 	// create a fake namespace object
     53 /******/ 	// mode & 1: value is a module id, require it
     54 /******/ 	// mode & 2: merge all properties of value into the ns
     55 /******/ 	// mode & 4: return value when already ns object
     56 /******/ 	// mode & 8|1: behave like require
     57 /******/ 	__webpack_require__.t = function(value, mode) {
     58 /******/ 		if(mode & 1) value = __webpack_require__(value);
     59 /******/ 		if(mode & 8) return value;
     60 /******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
     61 /******/ 		var ns = Object.create(null);
     62 /******/ 		__webpack_require__.r(ns);
     63 /******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
     64 /******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
     65 /******/ 		return ns;
     66 /******/ 	};
     67 /******/
     68 /******/ 	// getDefaultExport function for compatibility with non-harmony modules
     69 /******/ 	__webpack_require__.n = function(module) {
     70 /******/ 		var getter = module && module.__esModule ?
     71 /******/ 			function getDefault() { return module['default']; } :
     72 /******/ 			function getModuleExports() { return module; };
     73 /******/ 		__webpack_require__.d(getter, 'a', getter);
     74 /******/ 		return getter;
     75 /******/ 	};
     76 /******/
     77 /******/ 	// Object.prototype.hasOwnProperty.call
     78 /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
     79 /******/
     80 /******/ 	// __webpack_public_path__
     81 /******/ 	__webpack_require__.p = "";
     82 /******/
     83 /******/
     84 /******/ 	// Load entry module and return exports
     85 /******/ 	return __webpack_require__(__webpack_require__.s = "lbya");
     86 /******/ })
     87 /************************************************************************/
     88 /******/ ({
     89 
     90 /***/ "YLtl":
     91 /***/ (function(module, exports) {
     92 
     93 (function() { module.exports = window["lodash"]; }());
     94 
     95 /***/ }),
     96 
     97 /***/ "lbya":
     98 /***/ (function(module, __webpack_exports__, __webpack_require__) {
     99 
    100 "use strict";
    101 // ESM COMPAT FLAG
    102 __webpack_require__.r(__webpack_exports__);
    103 
    104 // EXPORTS
    105 __webpack_require__.d(__webpack_exports__, "isURL", function() { return /* reexport */ isURL; });
    106 __webpack_require__.d(__webpack_exports__, "isEmail", function() { return /* reexport */ isEmail; });
    107 __webpack_require__.d(__webpack_exports__, "getProtocol", function() { return /* reexport */ getProtocol; });
    108 __webpack_require__.d(__webpack_exports__, "isValidProtocol", function() { return /* reexport */ isValidProtocol; });
    109 __webpack_require__.d(__webpack_exports__, "getAuthority", function() { return /* reexport */ getAuthority; });
    110 __webpack_require__.d(__webpack_exports__, "isValidAuthority", function() { return /* reexport */ isValidAuthority; });
    111 __webpack_require__.d(__webpack_exports__, "getPath", function() { return /* reexport */ getPath; });
    112 __webpack_require__.d(__webpack_exports__, "isValidPath", function() { return /* reexport */ isValidPath; });
    113 __webpack_require__.d(__webpack_exports__, "getQueryString", function() { return /* reexport */ getQueryString; });
    114 __webpack_require__.d(__webpack_exports__, "buildQueryString", function() { return /* reexport */ buildQueryString; });
    115 __webpack_require__.d(__webpack_exports__, "isValidQueryString", function() { return /* reexport */ isValidQueryString; });
    116 __webpack_require__.d(__webpack_exports__, "getPathAndQueryString", function() { return /* reexport */ getPathAndQueryString; });
    117 __webpack_require__.d(__webpack_exports__, "getFragment", function() { return /* reexport */ getFragment; });
    118 __webpack_require__.d(__webpack_exports__, "isValidFragment", function() { return /* reexport */ isValidFragment; });
    119 __webpack_require__.d(__webpack_exports__, "addQueryArgs", function() { return /* reexport */ addQueryArgs; });
    120 __webpack_require__.d(__webpack_exports__, "getQueryArg", function() { return /* reexport */ getQueryArg; });
    121 __webpack_require__.d(__webpack_exports__, "getQueryArgs", function() { return /* reexport */ getQueryArgs; });
    122 __webpack_require__.d(__webpack_exports__, "hasQueryArg", function() { return /* reexport */ hasQueryArg; });
    123 __webpack_require__.d(__webpack_exports__, "removeQueryArgs", function() { return /* reexport */ removeQueryArgs; });
    124 __webpack_require__.d(__webpack_exports__, "prependHTTP", function() { return /* reexport */ prependHTTP; });
    125 __webpack_require__.d(__webpack_exports__, "safeDecodeURI", function() { return /* reexport */ safeDecodeURI; });
    126 __webpack_require__.d(__webpack_exports__, "safeDecodeURIComponent", function() { return /* reexport */ safeDecodeURIComponent; });
    127 __webpack_require__.d(__webpack_exports__, "filterURLForDisplay", function() { return /* reexport */ filterURLForDisplay; });
    128 __webpack_require__.d(__webpack_exports__, "cleanForSlug", function() { return /* reexport */ cleanForSlug; });
    129 
    130 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-url.js
    131 /**
    132  * Determines whether the given string looks like a URL.
    133  *
    134  * @param {string} url The string to scrutinise.
    135  *
    136  * @example
    137  * ```js
    138  * const isURL = isURL( 'https://wordpress.org' ); // true
    139  * ```
    140  *
    141  * @see https://url.spec.whatwg.org/
    142  * @see https://url.spec.whatwg.org/#valid-url-string
    143  *
    144  * @return {boolean} Whether or not it looks like a URL.
    145  */
    146 function isURL(url) {
    147   // A URL can be considered value if the `URL` constructor is able to parse
    148   // it. The constructor throws an error for an invalid URL.
    149   try {
    150     new URL(url);
    151     return true;
    152   } catch {
    153     return false;
    154   }
    155 }
    156 
    157 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-email.js
    158 const EMAIL_REGEXP = /^(mailto:)?[a-z0-9._%+-]+@[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}$/i;
    159 /**
    160  * Determines whether the given string looks like an email.
    161  *
    162  * @param {string} email The string to scrutinise.
    163  *
    164  * @example
    165  * ```js
    166  * const isEmail = isEmail( 'hello@wordpress.org' ); // true
    167  * ```
    168  *
    169  * @return {boolean} Whether or not it looks like an email.
    170  */
    171 
    172 function isEmail(email) {
    173   return EMAIL_REGEXP.test(email);
    174 }
    175 
    176 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-protocol.js
    177 /**
    178  * Returns the protocol part of the URL.
    179  *
    180  * @param {string} url The full URL.
    181  *
    182  * @example
    183  * ```js
    184  * const protocol1 = getProtocol( 'tel:012345678' ); // 'tel:'
    185  * const protocol2 = getProtocol( 'https://wordpress.org' ); // 'https:'
    186  * ```
    187  *
    188  * @return {string|void} The protocol part of the URL.
    189  */
    190 function getProtocol(url) {
    191   const matches = /^([^\s:]+:)/.exec(url);
    192 
    193   if (matches) {
    194     return matches[1];
    195   }
    196 }
    197 
    198 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-valid-protocol.js
    199 /**
    200  * Tests if a url protocol is valid.
    201  *
    202  * @param {string} protocol The url protocol.
    203  *
    204  * @example
    205  * ```js
    206  * const isValid = isValidProtocol( 'https:' ); // true
    207  * const isNotValid = isValidProtocol( 'https :' ); // false
    208  * ```
    209  *
    210  * @return {boolean} True if the argument is a valid protocol (e.g. http:, tel:).
    211  */
    212 function isValidProtocol(protocol) {
    213   if (!protocol) {
    214     return false;
    215   }
    216 
    217   return /^[a-z\-.\+]+[0-9]*:$/i.test(protocol);
    218 }
    219 
    220 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-authority.js
    221 /**
    222  * Returns the authority part of the URL.
    223  *
    224  * @param {string} url The full URL.
    225  *
    226  * @example
    227  * ```js
    228  * const authority1 = getAuthority( 'https://wordpress.org/help/' ); // 'wordpress.org'
    229  * const authority2 = getAuthority( 'https://localhost:8080/test/' ); // 'localhost:8080'
    230  * ```
    231  *
    232  * @return {string|void} The authority part of the URL.
    233  */
    234 function getAuthority(url) {
    235   const matches = /^[^\/\s:]+:(?:\/\/)?\/?([^\/\s#?]+)[\/#?]{0,1}\S*$/.exec(url);
    236 
    237   if (matches) {
    238     return matches[1];
    239   }
    240 }
    241 
    242 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-valid-authority.js
    243 /**
    244  * Checks for invalid characters within the provided authority.
    245  *
    246  * @param {string} authority A string containing the URL authority.
    247  *
    248  * @example
    249  * ```js
    250  * const isValid = isValidAuthority( 'wordpress.org' ); // true
    251  * const isNotValid = isValidAuthority( 'wordpress#org' ); // false
    252  * ```
    253  *
    254  * @return {boolean} True if the argument contains a valid authority.
    255  */
    256 function isValidAuthority(authority) {
    257   if (!authority) {
    258     return false;
    259   }
    260 
    261   return /^[^\s#?]+$/.test(authority);
    262 }
    263 
    264 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-path.js
    265 /**
    266  * Returns the path part of the URL.
    267  *
    268  * @param {string} url The full URL.
    269  *
    270  * @example
    271  * ```js
    272  * const path1 = getPath( 'http://localhost:8080/this/is/a/test?query=true' ); // 'this/is/a/test'
    273  * const path2 = getPath( 'https://wordpress.org/help/faq/' ); // 'help/faq'
    274  * ```
    275  *
    276  * @return {string|void} The path part of the URL.
    277  */
    278 function getPath(url) {
    279   const matches = /^[^\/\s:]+:(?:\/\/)?[^\/\s#?]+[\/]([^\s#?]+)[#?]{0,1}\S*$/.exec(url);
    280 
    281   if (matches) {
    282     return matches[1];
    283   }
    284 }
    285 
    286 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-valid-path.js
    287 /**
    288  * Checks for invalid characters within the provided path.
    289  *
    290  * @param {string} path The URL path.
    291  *
    292  * @example
    293  * ```js
    294  * const isValid = isValidPath( 'test/path/' ); // true
    295  * const isNotValid = isValidPath( '/invalid?test/path/' ); // false
    296  * ```
    297  *
    298  * @return {boolean} True if the argument contains a valid path
    299  */
    300 function isValidPath(path) {
    301   if (!path) {
    302     return false;
    303   }
    304 
    305   return /^[^\s#?]+$/.test(path);
    306 }
    307 
    308 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-query-string.js
    309 /**
    310  * Returns the query string part of the URL.
    311  *
    312  * @param {string} url The full URL.
    313  *
    314  * @example
    315  * ```js
    316  * const queryString = getQueryString( 'http://localhost:8080/this/is/a/test?query=true#fragment' ); // 'query=true'
    317  * ```
    318  *
    319  * @return {string|void} The query string part of the URL.
    320  */
    321 function getQueryString(url) {
    322   let query;
    323 
    324   try {
    325     query = new URL(url, 'http://example.com').search.substring(1);
    326   } catch (error) {}
    327 
    328   if (query) {
    329     return query;
    330   }
    331 }
    332 
    333 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/build-query-string.js
    334 /**
    335  * Generates URL-encoded query string using input query data.
    336  *
    337  * It is intended to behave equivalent as PHP's `http_build_query`, configured
    338  * with encoding type PHP_QUERY_RFC3986 (spaces as `%20`).
    339  *
    340  * @example
    341  * ```js
    342  * const queryString = buildQueryString( {
    343  *    simple: 'is ok',
    344  *    arrays: [ 'are', 'fine', 'too' ],
    345  *    objects: {
    346  *       evenNested: {
    347  *          ok: 'yes',
    348  *       },
    349  *    },
    350  * } );
    351  * // "simple=is%20ok&arrays%5B0%5D=are&arrays%5B1%5D=fine&arrays%5B2%5D=too&objects%5BevenNested%5D%5Bok%5D=yes"
    352  * ```
    353  *
    354  * @param {Record<string,*>} data Data to encode.
    355  *
    356  * @return {string} Query string.
    357  */
    358 function buildQueryString(data) {
    359   let string = '';
    360   const stack = Object.entries(data);
    361   let pair;
    362 
    363   while (pair = stack.shift()) {
    364     let [key, value] = pair; // Support building deeply nested data, from array or object values.
    365 
    366     const hasNestedData = Array.isArray(value) || value && value.constructor === Object;
    367 
    368     if (hasNestedData) {
    369       // Push array or object values onto the stack as composed of their
    370       // original key and nested index or key, retaining order by a
    371       // combination of Array#reverse and Array#unshift onto the stack.
    372       const valuePairs = Object.entries(value).reverse();
    373 
    374       for (const [member, memberValue] of valuePairs) {
    375         stack.unshift([`${key}[${member}]`, memberValue]);
    376       }
    377     } else if (value !== undefined) {
    378       // Null is treated as special case, equivalent to empty string.
    379       if (value === null) {
    380         value = '';
    381       }
    382 
    383       string += '&' + [key, value].map(encodeURIComponent).join('=');
    384     }
    385   } // Loop will concatenate with leading `&`, but it's only expected for all
    386   // but the first query parameter. This strips the leading `&`, while still
    387   // accounting for the case that the string may in-fact be empty.
    388 
    389 
    390   return string.substr(1);
    391 }
    392 
    393 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-valid-query-string.js
    394 /**
    395  * Checks for invalid characters within the provided query string.
    396  *
    397  * @param {string} queryString The query string.
    398  *
    399  * @example
    400  * ```js
    401  * const isValid = isValidQueryString( 'query=true&another=false' ); // true
    402  * const isNotValid = isValidQueryString( 'query=true?another=false' ); // false
    403  * ```
    404  *
    405  * @return {boolean} True if the argument contains a valid query string.
    406  */
    407 function isValidQueryString(queryString) {
    408   if (!queryString) {
    409     return false;
    410   }
    411 
    412   return /^[^\s#?\/]+$/.test(queryString);
    413 }
    414 
    415 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-path-and-query-string.js
    416 /**
    417  * Internal dependencies
    418  */
    419 
    420 /**
    421  * Returns the path part and query string part of the URL.
    422  *
    423  * @param {string} url The full URL.
    424  *
    425  * @example
    426  * ```js
    427  * const pathAndQueryString1 = getPathAndQueryString( 'http://localhost:8080/this/is/a/test?query=true' ); // '/this/is/a/test?query=true'
    428  * const pathAndQueryString2 = getPathAndQueryString( 'https://wordpress.org/help/faq/' ); // '/help/faq'
    429  * ```
    430  *
    431  * @return {string} The path part and query string part of the URL.
    432  */
    433 
    434 function getPathAndQueryString(url) {
    435   const path = getPath(url);
    436   const queryString = getQueryString(url);
    437   let value = '/';
    438   if (path) value += path;
    439   if (queryString) value += `?${queryString}`;
    440   return value;
    441 }
    442 
    443 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-fragment.js
    444 /**
    445  * Returns the fragment part of the URL.
    446  *
    447  * @param {string} url The full URL
    448  *
    449  * @example
    450  * ```js
    451  * const fragment1 = getFragment( 'http://localhost:8080/this/is/a/test?query=true#fragment' ); // '#fragment'
    452  * const fragment2 = getFragment( 'https://wordpress.org#another-fragment?query=true' ); // '#another-fragment'
    453  * ```
    454  *
    455  * @return {string|void} The fragment part of the URL.
    456  */
    457 function getFragment(url) {
    458   const matches = /^\S+?(#[^\s\?]*)/.exec(url);
    459 
    460   if (matches) {
    461     return matches[1];
    462   }
    463 }
    464 
    465 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/is-valid-fragment.js
    466 /**
    467  * Checks for invalid characters within the provided fragment.
    468  *
    469  * @param {string} fragment The url fragment.
    470  *
    471  * @example
    472  * ```js
    473  * const isValid = isValidFragment( '#valid-fragment' ); // true
    474  * const isNotValid = isValidFragment( '#invalid-#fragment' ); // false
    475  * ```
    476  *
    477  * @return {boolean} True if the argument contains a valid fragment.
    478  */
    479 function isValidFragment(fragment) {
    480   if (!fragment) {
    481     return false;
    482   }
    483 
    484   return /^#[^\s#?\/]*$/.test(fragment);
    485 }
    486 
    487 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-query-args.js
    488 /**
    489  * Internal dependencies
    490  */
    491 
    492 /** @typedef {import('./get-query-arg').QueryArgParsed} QueryArgParsed */
    493 
    494 /**
    495  * @typedef {Record<string,QueryArgParsed>} QueryArgs
    496  */
    497 
    498 /**
    499  * Sets a value in object deeply by a given array of path segments. Mutates the
    500  * object reference.
    501  *
    502  * @param {Record<string,*>} object Object in which to assign.
    503  * @param {string[]}         path   Path segment at which to set value.
    504  * @param {*}                value  Value to set.
    505  */
    506 
    507 function setPath(object, path, value) {
    508   const length = path.length;
    509   const lastIndex = length - 1;
    510 
    511   for (let i = 0; i < length; i++) {
    512     let key = path[i];
    513 
    514     if (!key && Array.isArray(object)) {
    515       // If key is empty string and next value is array, derive key from
    516       // the current length of the array.
    517       key = object.length.toString();
    518     } // If the next key in the path is numeric (or empty string), it will be
    519     // created as an array. Otherwise, it will be created as an object.
    520 
    521 
    522     const isNextKeyArrayIndex = !isNaN(Number(path[i + 1]));
    523     object[key] = i === lastIndex ? // If at end of path, assign the intended value.
    524     value : // Otherwise, advance to the next object in the path, creating
    525     // it if it does not yet exist.
    526     object[key] || (isNextKeyArrayIndex ? [] : {});
    527 
    528     if (Array.isArray(object[key]) && !isNextKeyArrayIndex) {
    529       // If we current key is non-numeric, but the next value is an
    530       // array, coerce the value to an object.
    531       object[key] = { ...object[key]
    532       };
    533     } // Update working reference object to the next in the path.
    534 
    535 
    536     object = object[key];
    537   }
    538 }
    539 /**
    540  * Returns an object of query arguments of the given URL. If the given URL is
    541  * invalid or has no querystring, an empty object is returned.
    542  *
    543  * @param {string} url URL.
    544  *
    545  * @example
    546  * ```js
    547  * const foo = getQueryArgs( 'https://wordpress.org?foo=bar&bar=baz' );
    548  * // { "foo": "bar", "bar": "baz" }
    549  * ```
    550  *
    551  * @return {QueryArgs} Query args object.
    552  */
    553 
    554 
    555 function getQueryArgs(url) {
    556   return (getQueryString(url) || ''). // Normalize space encoding, accounting for PHP URL encoding
    557   // corresponding to `application/x-www-form-urlencoded`.
    558   //
    559   // See: https://tools.ietf.org/html/rfc1866#section-8.2.1
    560   replace(/\+/g, '%20').split('&').reduce((accumulator, keyValue) => {
    561     const [key, value = ''] = keyValue.split('=') // Filtering avoids decoding as `undefined` for value, where
    562     // default is restored in destructuring assignment.
    563     .filter(Boolean).map(decodeURIComponent);
    564 
    565     if (key) {
    566       const segments = key.replace(/\]/g, '').split('[');
    567       setPath(accumulator, segments, value);
    568     }
    569 
    570     return accumulator;
    571   }, {});
    572 }
    573 
    574 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/add-query-args.js
    575 /**
    576  * Internal dependencies
    577  */
    578 
    579 
    580 /**
    581  * Appends arguments as querystring to the provided URL. If the URL already
    582  * includes query arguments, the arguments are merged with (and take precedent
    583  * over) the existing set.
    584  *
    585  * @param {string} [url='']  URL to which arguments should be appended. If omitted,
    586  *                           only the resulting querystring is returned.
    587  * @param {Object} [args]    Query arguments to apply to URL.
    588  *
    589  * @example
    590  * ```js
    591  * const newURL = addQueryArgs( 'https://google.com', { q: 'test' } ); // https://google.com/?q=test
    592  * ```
    593  *
    594  * @return {string} URL with arguments applied.
    595  */
    596 
    597 function addQueryArgs(url = '', args) {
    598   // If no arguments are to be appended, return original URL.
    599   if (!args || !Object.keys(args).length) {
    600     return url;
    601   }
    602 
    603   let baseUrl = url; // Determine whether URL already had query arguments.
    604 
    605   const queryStringIndex = url.indexOf('?');
    606 
    607   if (queryStringIndex !== -1) {
    608     // Merge into existing query arguments.
    609     args = Object.assign(getQueryArgs(url), args); // Change working base URL to omit previous query arguments.
    610 
    611     baseUrl = baseUrl.substr(0, queryStringIndex);
    612   }
    613 
    614   return baseUrl + '?' + buildQueryString(args);
    615 }
    616 
    617 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/get-query-arg.js
    618 /**
    619  * Internal dependencies
    620  */
    621 
    622 /**
    623  * @typedef {{[key: string]: QueryArgParsed}} QueryArgObject
    624  */
    625 
    626 /**
    627  * @typedef {string|string[]|QueryArgObject} QueryArgParsed
    628  */
    629 
    630 /**
    631  * Returns a single query argument of the url
    632  *
    633  * @param {string} url URL.
    634  * @param {string} arg Query arg name.
    635  *
    636  * @example
    637  * ```js
    638  * const foo = getQueryArg( 'https://wordpress.org?foo=bar&bar=baz', 'foo' ); // bar
    639  * ```
    640  *
    641  * @return {QueryArgParsed|void} Query arg value.
    642  */
    643 
    644 function getQueryArg(url, arg) {
    645   return getQueryArgs(url)[arg];
    646 }
    647 
    648 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/has-query-arg.js
    649 /**
    650  * Internal dependencies
    651  */
    652 
    653 /**
    654  * Determines whether the URL contains a given query arg.
    655  *
    656  * @param {string} url URL.
    657  * @param {string} arg Query arg name.
    658  *
    659  * @example
    660  * ```js
    661  * const hasBar = hasQueryArg( 'https://wordpress.org?foo=bar&bar=baz', 'bar' ); // true
    662  * ```
    663  *
    664  * @return {boolean} Whether or not the URL contains the query arg.
    665  */
    666 
    667 function hasQueryArg(url, arg) {
    668   return getQueryArg(url, arg) !== undefined;
    669 }
    670 
    671 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/remove-query-args.js
    672 /**
    673  * Internal dependencies
    674  */
    675 
    676 
    677 /**
    678  * Removes arguments from the query string of the url
    679  *
    680  * @param {string}    url  URL.
    681  * @param {...string} args Query Args.
    682  *
    683  * @example
    684  * ```js
    685  * const newUrl = removeQueryArgs( 'https://wordpress.org?foo=bar&bar=baz&baz=foobar', 'foo', 'bar' ); // https://wordpress.org?baz=foobar
    686  * ```
    687  *
    688  * @return {string} Updated URL.
    689  */
    690 
    691 function removeQueryArgs(url, ...args) {
    692   const queryStringIndex = url.indexOf('?');
    693 
    694   if (queryStringIndex === -1) {
    695     return url;
    696   }
    697 
    698   const query = getQueryArgs(url);
    699   const baseURL = url.substr(0, queryStringIndex);
    700   args.forEach(arg => delete query[arg]);
    701   const queryString = buildQueryString(query);
    702   return queryString ? baseURL + '?' + queryString : baseURL;
    703 }
    704 
    705 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/prepend-http.js
    706 /**
    707  * Internal dependencies
    708  */
    709 
    710 const USABLE_HREF_REGEXP = /^(?:[a-z]+:|#|\?|\.|\/)/i;
    711 /**
    712  * Prepends "http://" to a url, if it looks like something that is meant to be a TLD.
    713  *
    714  * @param {string} url The URL to test.
    715  *
    716  * @example
    717  * ```js
    718  * const actualURL = prependHTTP( 'wordpress.org' ); // http://wordpress.org
    719  * ```
    720  *
    721  * @return {string} The updated URL.
    722  */
    723 
    724 function prependHTTP(url) {
    725   if (!url) {
    726     return url;
    727   }
    728 
    729   url = url.trim();
    730 
    731   if (!USABLE_HREF_REGEXP.test(url) && !isEmail(url)) {
    732     return 'http://' + url;
    733   }
    734 
    735   return url;
    736 }
    737 
    738 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/safe-decode-uri.js
    739 /**
    740  * Safely decodes a URI with `decodeURI`. Returns the URI unmodified if
    741  * `decodeURI` throws an error.
    742  *
    743  * @param {string} uri URI to decode.
    744  *
    745  * @example
    746  * ```js
    747  * const badUri = safeDecodeURI( '%z' ); // does not throw an Error, simply returns '%z'
    748  * ```
    749  *
    750  * @return {string} Decoded URI if possible.
    751  */
    752 function safeDecodeURI(uri) {
    753   try {
    754     return decodeURI(uri);
    755   } catch (uriError) {
    756     return uri;
    757   }
    758 }
    759 
    760 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/safe-decode-uri-component.js
    761 /**
    762  * Safely decodes a URI component with `decodeURIComponent`. Returns the URI component unmodified if
    763  * `decodeURIComponent` throws an error.
    764  *
    765  * @param {string} uriComponent URI component to decode.
    766  *
    767  * @return {string} Decoded URI component if possible.
    768  */
    769 function safeDecodeURIComponent(uriComponent) {
    770   try {
    771     return decodeURIComponent(uriComponent);
    772   } catch (uriComponentError) {
    773     return uriComponent;
    774   }
    775 }
    776 
    777 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/filter-url-for-display.js
    778 /**
    779  * Returns a URL for display.
    780  *
    781  * @param {string} url Original URL.
    782  * @param {number|null} maxLength URL length.
    783  *
    784  * @example
    785  * ```js
    786  * const displayUrl = filterURLForDisplay( 'https://www.wordpress.org/gutenberg/' ); // wordpress.org/gutenberg
    787  * const imageUrl = filterURLForDisplay( 'https://www.wordpress.org/wp-content/uploads/img.png', 20 ); // …ent/uploads/img.png
    788  * ```
    789  *
    790  * @return {string} Displayed URL.
    791  */
    792 function filterURLForDisplay(url, maxLength = null) {
    793   // Remove protocol and www prefixes.
    794   let filteredURL = url.replace(/^(?:https?:)\/\/(?:www\.)?/, ''); // Ends with / and only has that single slash, strip it.
    795 
    796   if (filteredURL.match(/^[^\/]+\/$/)) {
    797     filteredURL = filteredURL.replace('/', '');
    798   }
    799 
    800   const mediaRegexp = /([\w|:])*\.(?:jpg|jpeg|gif|png|svg)/;
    801 
    802   if (!maxLength || filteredURL.length <= maxLength || !filteredURL.match(mediaRegexp)) {
    803     return filteredURL;
    804   } // If the file is not greater than max length, return last portion of URL.
    805 
    806 
    807   filteredURL = filteredURL.split('?')[0];
    808   const urlPieces = filteredURL.split('/');
    809   const file = urlPieces[urlPieces.length - 1];
    810 
    811   if (file.length <= maxLength) {
    812     return '…' + filteredURL.slice(-maxLength);
    813   } // If the file is greater than max length, truncate the file.
    814 
    815 
    816   const index = file.lastIndexOf('.');
    817   const [fileName, extension] = [file.slice(0, index), file.slice(index + 1)];
    818   const truncatedFile = fileName.slice(-3) + '.' + extension;
    819   return file.slice(0, maxLength - truncatedFile.length - 1) + '…' + truncatedFile;
    820 }
    821 
    822 // EXTERNAL MODULE: external "lodash"
    823 var external_lodash_ = __webpack_require__("YLtl");
    824 
    825 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/clean-for-slug.js
    826 /**
    827  * External dependencies
    828  */
    829 
    830 /**
    831  * Performs some basic cleanup of a string for use as a post slug.
    832  *
    833  * This replicates some of what `sanitize_title()` does in WordPress core, but
    834  * is only designed to approximate what the slug will be.
    835  *
    836  * Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin
    837  * letters. Removes combining diacritical marks. Converts whitespace, periods,
    838  * and forward slashes to hyphens. Removes any remaining non-word characters
    839  * except hyphens. Converts remaining string to lowercase. It does not account
    840  * for octets, HTML entities, or other encoded characters.
    841  *
    842  * @param {string} string Title or slug to be processed.
    843  *
    844  * @return {string} Processed string.
    845  */
    846 
    847 function cleanForSlug(string) {
    848   if (!string) {
    849     return '';
    850   }
    851 
    852   return Object(external_lodash_["trim"])(Object(external_lodash_["deburr"])(string).replace(/[\s\./]+/g, '-').replace(/[^\w-]+/g, '').toLowerCase(), '-');
    853 }
    854 
    855 // CONCATENATED MODULE: ./node_modules/@wordpress/url/build-module/index.js
    856 
    857 
    858 
    859 
    860 
    861 
    862 
    863 
    864 
    865 
    866 
    867 
    868 
    869 
    870 
    871 
    872 
    873 
    874 
    875 
    876 
    877 
    878 
    879 
    880 
    881 
    882 /***/ })
    883 
    884 /******/ });