media-utils.js (24216B)
1 this["wp"] = this["wp"] || {}; this["wp"]["mediaUtils"] = 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 = "Lb+8"); 86 /******/ }) 87 /************************************************************************/ 88 /******/ ({ 89 90 /***/ "GRId": 91 /***/ (function(module, exports) { 92 93 (function() { module.exports = window["wp"]["element"]; }()); 94 95 /***/ }), 96 97 /***/ "Lb+8": 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__, "MediaUpload", function() { return /* reexport */ media_upload; }); 106 __webpack_require__.d(__webpack_exports__, "uploadMedia", function() { return /* reexport */ uploadMedia; }); 107 108 // EXTERNAL MODULE: external "lodash" 109 var external_lodash_ = __webpack_require__("YLtl"); 110 111 // EXTERNAL MODULE: external ["wp","element"] 112 var external_wp_element_ = __webpack_require__("GRId"); 113 114 // EXTERNAL MODULE: external ["wp","i18n"] 115 var external_wp_i18n_ = __webpack_require__("l3Sj"); 116 117 // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/components/media-upload/index.js 118 /** 119 * External dependencies 120 */ 121 122 /** 123 * WordPress dependencies 124 */ 125 126 127 128 const { 129 wp 130 } = window; 131 const DEFAULT_EMPTY_GALLERY = []; 132 /** 133 * Prepares the Featured Image toolbars and frames. 134 * 135 * @return {wp.media.view.MediaFrame.Select} The default media workflow. 136 */ 137 138 const getFeaturedImageMediaFrame = () => { 139 return wp.media.view.MediaFrame.Select.extend({ 140 /** 141 * Enables the Set Featured Image Button. 142 * 143 * @param {Object} toolbar toolbar for featured image state 144 * @return {void} 145 */ 146 featuredImageToolbar(toolbar) { 147 this.createSelectToolbar(toolbar, { 148 text: wp.media.view.l10n.setFeaturedImage, 149 state: this.options.state 150 }); 151 }, 152 153 /** 154 * Handle the edit state requirements of selected media item. 155 * 156 * @return {void} 157 */ 158 editState() { 159 const selection = this.state('featured-image').get('selection'); 160 const view = new wp.media.view.EditImage({ 161 model: selection.single(), 162 controller: this 163 }).render(); // Set the view to the EditImage frame using the selected image. 164 165 this.content.set(view); // After bringing in the frame, load the actual editor via an ajax call. 166 167 view.loadEditor(); 168 }, 169 170 /** 171 * Create the default states. 172 * 173 * @return {void} 174 */ 175 createStates: function createStates() { 176 this.on('toolbar:create:featured-image', this.featuredImageToolbar, this); 177 this.on('content:render:edit-image', this.editState, this); 178 this.states.add([new wp.media.controller.FeaturedImage(), new wp.media.controller.EditImage({ 179 model: this.options.editImage 180 })]); 181 } 182 }); 183 }; 184 /** 185 * Prepares the Gallery toolbars and frames. 186 * 187 * @return {wp.media.view.MediaFrame.Post} The default media workflow. 188 */ 189 190 191 const getGalleryDetailsMediaFrame = () => { 192 /** 193 * Custom gallery details frame. 194 * 195 * @see https://github.com/xwp/wp-core-media-widgets/blob/905edbccfc2a623b73a93dac803c5335519d7837/wp-admin/js/widgets/media-gallery-widget.js 196 * @class GalleryDetailsMediaFrame 197 * @class 198 */ 199 return wp.media.view.MediaFrame.Post.extend({ 200 /** 201 * Set up gallery toolbar. 202 * 203 * @return {void} 204 */ 205 galleryToolbar() { 206 const editing = this.state().get('editing'); 207 this.toolbar.set(new wp.media.view.Toolbar({ 208 controller: this, 209 items: { 210 insert: { 211 style: 'primary', 212 text: editing ? wp.media.view.l10n.updateGallery : wp.media.view.l10n.insertGallery, 213 priority: 80, 214 requires: { 215 library: true 216 }, 217 218 /** 219 * @fires wp.media.controller.State#update 220 */ 221 click() { 222 const controller = this.controller, 223 state = controller.state(); 224 controller.close(); 225 state.trigger('update', state.get('library')); // Restore and reset the default state. 226 227 controller.setState(controller.options.state); 228 controller.reset(); 229 } 230 231 } 232 } 233 })); 234 }, 235 236 /** 237 * Handle the edit state requirements of selected media item. 238 * 239 * @return {void} 240 */ 241 editState() { 242 const selection = this.state('gallery').get('selection'); 243 const view = new wp.media.view.EditImage({ 244 model: selection.single(), 245 controller: this 246 }).render(); // Set the view to the EditImage frame using the selected image. 247 248 this.content.set(view); // After bringing in the frame, load the actual editor via an ajax call. 249 250 view.loadEditor(); 251 }, 252 253 /** 254 * Create the default states. 255 * 256 * @return {void} 257 */ 258 createStates: function createStates() { 259 this.on('toolbar:create:main-gallery', this.galleryToolbar, this); 260 this.on('content:render:edit-image', this.editState, this); 261 this.states.add([new wp.media.controller.Library({ 262 id: 'gallery', 263 title: wp.media.view.l10n.createGalleryTitle, 264 priority: 40, 265 toolbar: 'main-gallery', 266 filterable: 'uploaded', 267 multiple: 'add', 268 editable: false, 269 library: wp.media.query(Object(external_lodash_["defaults"])({ 270 type: 'image' 271 }, this.options.library)) 272 }), new wp.media.controller.EditImage({ 273 model: this.options.editImage 274 }), new wp.media.controller.GalleryEdit({ 275 library: this.options.selection, 276 editing: this.options.editing, 277 menu: 'gallery', 278 displaySettings: false, 279 multiple: true 280 }), new wp.media.controller.GalleryAdd()]); 281 } 282 }); 283 }; // the media library image object contains numerous attributes 284 // we only need this set to display the image in the library 285 286 287 const slimImageObject = img => { 288 const attrSet = ['sizes', 'mime', 'type', 'subtype', 'id', 'url', 'alt', 'link', 'caption']; 289 return Object(external_lodash_["pick"])(img, attrSet); 290 }; 291 292 const getAttachmentsCollection = ids => { 293 return wp.media.query({ 294 order: 'ASC', 295 orderby: 'post__in', 296 post__in: ids, 297 posts_per_page: -1, 298 query: true, 299 type: 'image' 300 }); 301 }; 302 303 class media_upload_MediaUpload extends external_wp_element_["Component"] { 304 constructor({ 305 allowedTypes, 306 gallery = false, 307 unstableFeaturedImageFlow = false, 308 modalClass, 309 multiple = false, 310 title = Object(external_wp_i18n_["__"])('Select or Upload Media') 311 }) { 312 super(...arguments); 313 this.openModal = this.openModal.bind(this); 314 this.onOpen = this.onOpen.bind(this); 315 this.onSelect = this.onSelect.bind(this); 316 this.onUpdate = this.onUpdate.bind(this); 317 this.onClose = this.onClose.bind(this); 318 319 if (gallery) { 320 this.buildAndSetGalleryFrame(); 321 } else { 322 const frameConfig = { 323 title, 324 multiple 325 }; 326 327 if (!!allowedTypes) { 328 frameConfig.library = { 329 type: allowedTypes 330 }; 331 } 332 333 this.frame = wp.media(frameConfig); 334 } 335 336 if (modalClass) { 337 this.frame.$el.addClass(modalClass); 338 } 339 340 if (unstableFeaturedImageFlow) { 341 this.buildAndSetFeatureImageFrame(); 342 } 343 344 this.initializeListeners(); 345 } 346 347 initializeListeners() { 348 // When an image is selected in the media frame... 349 this.frame.on('select', this.onSelect); 350 this.frame.on('update', this.onUpdate); 351 this.frame.on('open', this.onOpen); 352 this.frame.on('close', this.onClose); 353 } 354 /** 355 * Sets the Gallery frame and initializes listeners. 356 * 357 * @return {void} 358 */ 359 360 361 buildAndSetGalleryFrame() { 362 const { 363 addToGallery = false, 364 allowedTypes, 365 multiple = false, 366 value = DEFAULT_EMPTY_GALLERY 367 } = this.props; // If the value did not changed there is no need to rebuild the frame, 368 // we can continue to use the existing one. 369 370 if (value === this.lastGalleryValue) { 371 return; 372 } 373 374 this.lastGalleryValue = value; // If a frame already existed remove it. 375 376 if (this.frame) { 377 this.frame.remove(); 378 } 379 380 let currentState; 381 382 if (addToGallery) { 383 currentState = 'gallery-library'; 384 } else { 385 currentState = value && value.length ? 'gallery-edit' : 'gallery'; 386 } 387 388 if (!this.GalleryDetailsMediaFrame) { 389 this.GalleryDetailsMediaFrame = getGalleryDetailsMediaFrame(); 390 } 391 392 const attachments = getAttachmentsCollection(value); 393 const selection = new wp.media.model.Selection(attachments.models, { 394 props: attachments.props.toJSON(), 395 multiple 396 }); 397 this.frame = new this.GalleryDetailsMediaFrame({ 398 mimeType: allowedTypes, 399 state: currentState, 400 multiple, 401 selection, 402 editing: value && value.length ? true : false 403 }); 404 wp.media.frame = this.frame; 405 this.initializeListeners(); 406 } 407 /** 408 * Initializes the Media Library requirements for the featured image flow. 409 * 410 * @return {void} 411 */ 412 413 414 buildAndSetFeatureImageFrame() { 415 const featuredImageFrame = getFeaturedImageMediaFrame(); 416 const attachments = getAttachmentsCollection(this.props.value); 417 const selection = new wp.media.model.Selection(attachments.models, { 418 props: attachments.props.toJSON() 419 }); 420 this.frame = new featuredImageFrame({ 421 mimeType: this.props.allowedTypes, 422 state: 'featured-image', 423 multiple: this.props.multiple, 424 selection, 425 editing: this.props.value ? true : false 426 }); 427 wp.media.frame = this.frame; 428 } 429 430 componentWillUnmount() { 431 this.frame.remove(); 432 } 433 434 onUpdate(selections) { 435 const { 436 onSelect, 437 multiple = false 438 } = this.props; 439 const state = this.frame.state(); 440 const selectedImages = selections || state.get('selection'); 441 442 if (!selectedImages || !selectedImages.models.length) { 443 return; 444 } 445 446 if (multiple) { 447 onSelect(selectedImages.models.map(model => slimImageObject(model.toJSON()))); 448 } else { 449 onSelect(slimImageObject(selectedImages.models[0].toJSON())); 450 } 451 } 452 453 onSelect() { 454 const { 455 onSelect, 456 multiple = false 457 } = this.props; // Get media attachment details from the frame state 458 459 const attachment = this.frame.state().get('selection').toJSON(); 460 onSelect(multiple ? attachment : attachment[0]); 461 } 462 463 onOpen() { 464 var _this$props$value; 465 466 this.updateCollection(); // Handle both this.props.value being either (number[]) multiple ids 467 // (for galleries) or a (number) singular id (e.g. image block). 468 469 const hasMedia = Array.isArray(this.props.value) ? !!((_this$props$value = this.props.value) !== null && _this$props$value !== void 0 && _this$props$value.length) : !!this.props.value; 470 471 if (!hasMedia) { 472 return; 473 } 474 475 if (!this.props.gallery) { 476 const selection = this.frame.state().get('selection'); 477 Object(external_lodash_["castArray"])(this.props.value).forEach(id => { 478 selection.add(wp.media.attachment(id)); 479 }); 480 } // load the images so they are available in the media modal. 481 482 483 getAttachmentsCollection(Object(external_lodash_["castArray"])(this.props.value)).more(); 484 } 485 486 onClose() { 487 const { 488 onClose 489 } = this.props; 490 491 if (onClose) { 492 onClose(); 493 } 494 } 495 496 updateCollection() { 497 const frameContent = this.frame.content.get(); 498 499 if (frameContent && frameContent.collection) { 500 const collection = frameContent.collection; // clean all attachments we have in memory. 501 502 collection.toArray().forEach(model => model.trigger('destroy', model)); // reset has more flag, if library had small amount of items all items may have been loaded before. 503 504 collection.mirroring._hasMore = true; // request items 505 506 collection.more(); 507 } 508 } 509 510 openModal() { 511 if (this.props.gallery) { 512 this.buildAndSetGalleryFrame(); 513 } 514 515 this.frame.open(); 516 } 517 518 render() { 519 return this.props.render({ 520 open: this.openModal 521 }); 522 } 523 524 } 525 526 /* harmony default export */ var media_upload = (media_upload_MediaUpload); 527 528 // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/components/index.js 529 530 531 // EXTERNAL MODULE: external ["wp","apiFetch"] 532 var external_wp_apiFetch_ = __webpack_require__("ywyh"); 533 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_); 534 535 // EXTERNAL MODULE: external ["wp","blob"] 536 var external_wp_blob_ = __webpack_require__("xTGt"); 537 538 // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/utils/upload-media.js 539 540 541 /** 542 * External dependencies 543 */ 544 545 /** 546 * WordPress dependencies 547 */ 548 549 550 551 552 /** 553 * Browsers may use unexpected mime types, and they differ from browser to browser. 554 * This function computes a flexible array of mime types from the mime type structured provided by the server. 555 * Converts { jpg|jpeg|jpe: "image/jpeg" } into [ "image/jpeg", "image/jpg", "image/jpeg", "image/jpe" ] 556 * The computation of this array instead of directly using the object, 557 * solves the problem in chrome where mp3 files have audio/mp3 as mime type instead of audio/mpeg. 558 * https://bugs.chromium.org/p/chromium/issues/detail?id=227004 559 * 560 * @param {?Object} wpMimeTypesObject Mime type object received from the server. 561 * Extensions are keys separated by '|' and values are mime types associated with an extension. 562 * 563 * @return {?Array} An array of mime types or the parameter passed if it was "falsy". 564 */ 565 566 function getMimeTypesArray(wpMimeTypesObject) { 567 if (!wpMimeTypesObject) { 568 return wpMimeTypesObject; 569 } 570 571 return Object(external_lodash_["flatMap"])(wpMimeTypesObject, (mime, extensionsString) => { 572 const [type] = mime.split('/'); 573 const extensions = extensionsString.split('|'); 574 return [mime, ...Object(external_lodash_["map"])(extensions, extension => `${type}/${extension}`)]; 575 }); 576 } 577 /** 578 * Media Upload is used by audio, image, gallery, video, and file blocks to 579 * handle uploading a media file when a file upload button is activated. 580 * 581 * TODO: future enhancement to add an upload indicator. 582 * 583 * @param {Object} $0 Parameters object passed to the function. 584 * @param {?Array} $0.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed. 585 * @param {?Object} $0.additionalData Additional data to include in the request. 586 * @param {Array} $0.filesList List of files. 587 * @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site. 588 * @param {Function} $0.onError Function called when an error happens. 589 * @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. 590 * @param {?Object} $0.wpAllowedMimeTypes List of allowed mime types and file extensions. 591 */ 592 593 async function uploadMedia({ 594 allowedTypes, 595 additionalData = {}, 596 filesList, 597 maxUploadFileSize, 598 onError = external_lodash_["noop"], 599 onFileChange, 600 wpAllowedMimeTypes = null 601 }) { 602 // Cast filesList to array 603 const files = [...filesList]; 604 const filesSet = []; 605 606 const setAndUpdateFiles = (idx, value) => { 607 Object(external_wp_blob_["revokeBlobURL"])(Object(external_lodash_["get"])(filesSet, [idx, 'url'])); 608 filesSet[idx] = value; 609 onFileChange(Object(external_lodash_["compact"])(filesSet)); 610 }; // Allowed type specified by consumer 611 612 613 const isAllowedType = fileType => { 614 if (!allowedTypes) { 615 return true; 616 } 617 618 return Object(external_lodash_["some"])(allowedTypes, allowedType => { 619 // If a complete mimetype is specified verify if it matches exactly the mime type of the file. 620 if (Object(external_lodash_["includes"])(allowedType, '/')) { 621 return allowedType === fileType; 622 } // Otherwise a general mime type is used and we should verify if the file mimetype starts with it. 623 624 625 return Object(external_lodash_["startsWith"])(fileType, `${allowedType}/`); 626 }); 627 }; // Allowed types for the current WP_User 628 629 630 const allowedMimeTypesForUser = getMimeTypesArray(wpAllowedMimeTypes); 631 632 const isAllowedMimeTypeForUser = fileType => { 633 return Object(external_lodash_["includes"])(allowedMimeTypesForUser, fileType); 634 }; // Build the error message including the filename 635 636 637 const triggerError = error => { 638 error.message = [Object(external_wp_element_["createElement"])("strong", { 639 key: "filename" 640 }, error.file.name), ': ', error.message]; 641 onError(error); 642 }; 643 644 const validFiles = []; 645 646 for (const mediaFile of files) { 647 // Verify if user is allowed to upload this mime type. 648 // Defer to the server when type not detected. 649 if (allowedMimeTypesForUser && mediaFile.type && !isAllowedMimeTypeForUser(mediaFile.type)) { 650 triggerError({ 651 code: 'MIME_TYPE_NOT_ALLOWED_FOR_USER', 652 message: Object(external_wp_i18n_["__"])('Sorry, this file type is not permitted for security reasons.'), 653 file: mediaFile 654 }); 655 continue; 656 } // Check if the block supports this mime type. 657 // Defer to the server when type not detected. 658 659 660 if (mediaFile.type && !isAllowedType(mediaFile.type)) { 661 triggerError({ 662 code: 'MIME_TYPE_NOT_SUPPORTED', 663 message: Object(external_wp_i18n_["__"])('Sorry, this file type is not supported here.'), 664 file: mediaFile 665 }); 666 continue; 667 } // verify if file is greater than the maximum file upload size allowed for the site. 668 669 670 if (maxUploadFileSize && mediaFile.size > maxUploadFileSize) { 671 triggerError({ 672 code: 'SIZE_ABOVE_LIMIT', 673 message: Object(external_wp_i18n_["__"])('This file exceeds the maximum upload size for this site.'), 674 file: mediaFile 675 }); 676 continue; 677 } // Don't allow empty files to be uploaded. 678 679 680 if (mediaFile.size <= 0) { 681 triggerError({ 682 code: 'EMPTY_FILE', 683 message: Object(external_wp_i18n_["__"])('This file is empty.'), 684 file: mediaFile 685 }); 686 continue; 687 } 688 689 validFiles.push(mediaFile); // Set temporary URL to create placeholder media file, this is replaced 690 // with final file from media gallery when upload is `done` below 691 692 filesSet.push({ 693 url: Object(external_wp_blob_["createBlobURL"])(mediaFile) 694 }); 695 onFileChange(filesSet); 696 } 697 698 for (let idx = 0; idx < validFiles.length; ++idx) { 699 const mediaFile = validFiles[idx]; 700 701 try { 702 const savedMedia = await createMediaFromFile(mediaFile, additionalData); 703 const mediaObject = { ...Object(external_lodash_["omit"])(savedMedia, ['alt_text', 'source_url']), 704 alt: savedMedia.alt_text, 705 caption: Object(external_lodash_["get"])(savedMedia, ['caption', 'raw'], ''), 706 title: savedMedia.title.raw, 707 url: savedMedia.source_url 708 }; 709 setAndUpdateFiles(idx, mediaObject); 710 } catch (error) { 711 // Reset to empty on failure. 712 setAndUpdateFiles(idx, null); 713 let message; 714 715 if (Object(external_lodash_["has"])(error, ['message'])) { 716 message = Object(external_lodash_["get"])(error, ['message']); 717 } else { 718 message = Object(external_wp_i18n_["sprintf"])( // translators: %s: file name 719 Object(external_wp_i18n_["__"])('Error while uploading file %s to the media library.'), mediaFile.name); 720 } 721 722 onError({ 723 code: 'GENERAL', 724 message, 725 file: mediaFile 726 }); 727 } 728 } 729 } 730 /** 731 * @param {File} file Media File to Save. 732 * @param {?Object} additionalData Additional data to include in the request. 733 * 734 * @return {Promise} Media Object Promise. 735 */ 736 737 function createMediaFromFile(file, additionalData) { 738 // Create upload payload 739 const data = new window.FormData(); 740 data.append('file', file, file.name || file.type.replace('/', '.')); 741 Object(external_lodash_["forEach"])(additionalData, (value, key) => data.append(key, value)); 742 return external_wp_apiFetch_default()({ 743 path: '/wp/v2/media', 744 body: data, 745 method: 'POST' 746 }); 747 } 748 749 // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/utils/index.js 750 751 752 // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/index.js 753 754 755 756 757 /***/ }), 758 759 /***/ "YLtl": 760 /***/ (function(module, exports) { 761 762 (function() { module.exports = window["lodash"]; }()); 763 764 /***/ }), 765 766 /***/ "l3Sj": 767 /***/ (function(module, exports) { 768 769 (function() { module.exports = window["wp"]["i18n"]; }()); 770 771 /***/ }), 772 773 /***/ "xTGt": 774 /***/ (function(module, exports) { 775 776 (function() { module.exports = window["wp"]["blob"]; }()); 777 778 /***/ }), 779 780 /***/ "ywyh": 781 /***/ (function(module, exports) { 782 783 (function() { module.exports = window["wp"]["apiFetch"]; }()); 784 785 /***/ }) 786 787 /******/ });