# squeeze/1.6/assets/js/script.bundle.js

Squeeze – Image Optimization &amp; Compression, WEBP Conversion, version 1.6. 176 lines.

- Page: https://pluginprobe.com/plugins/squeeze/1.6/code/assets/js/script.bundle.js
- Raw: https://pluginprobe.com/plugins/squeeze/1.6/raw/assets/js/script.bundle.js
- Modified: 2025-02-11T11:54:54+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/squeeze/1.6/code/assets/js/script.bundle.js#L10-L20`.

```javascript
/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ "./assets/js/helpers.js":
/*!******************************!*\
  !*** ./assets/js/helpers.js ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"cachedMediaData\": () => (/* binding */ cachedMediaData),\n/* harmony export */   \"disableAllButtons\": () => (/* binding */ disableAllButtons),\n/* harmony export */   \"disableBulkButtons\": () => (/* binding */ disableBulkButtons),\n/* harmony export */   \"elements\": () => (/* binding */ elements),\n/* harmony export */   \"logMessage\": () => (/* binding */ logMessage),\n/* harmony export */   \"populatePathInput\": () => (/* binding */ populatePathInput),\n/* harmony export */   \"removeAllButtons\": () => (/* binding */ removeAllButtons),\n/* harmony export */   \"renderDirectories\": () => (/* binding */ renderDirectories),\n/* harmony export */   \"restoreBulkButtons\": () => (/* binding */ restoreBulkButtons),\n/* harmony export */   \"updateButtonText\": () => (/* binding */ updateButtonText)\n/* harmony export */ });\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n// move static helper functions here\r\nconst elements = {\r\n  bulkBtn: document.querySelector(\"[name='squeeze_bulk']\"),\r\n  bulkAgainBtn: document.querySelector(\"[name='squeeze_bulk_again']\"),\r\n  bulkPathBtn: document.querySelector(\"[name='squeeze_bulk_path_button']\"),\r\n  selectPathBtn: document.querySelector(\"[name='squeeze_select_path_button']\"),\r\n  savePathBtn: document.querySelector(\"[name='squeeze_save_path_button']\"),\r\n  pathDialog: document.getElementById(\"squeeze-path-dialog\"),\r\n  closePathDialogBtn: document.querySelector(\"[name='squeeze_close_path_dialog_button']\"),\r\n  pathInput: document.querySelector(\"[name='squeeze_bulk_path']\"),\r\n  pathList: document.querySelector(\".squeeze-path-list\"),\r\n  postsFilterForm: document.querySelector(\"#posts-filter\"),\r\n  dirContainer: document.getElementById(\"squeeze-bulk-directory-list\"),\r\n  bulkLogInput: document.querySelector(\"#squeeze-log-data\"),\r\n  pauseBulkBtn: document.querySelector(\"[name='squeeze_pause_page_bulk']\")\r\n}\r\n\r\nconst cachedMediaData = {\r\n  isPaused: false,\r\n  page: 1,\r\n  process: '',\r\n  mediaIDs: [],\r\n  totalImages: 0,\r\n  target: null\r\n}\r\n\r\nconst loadTemplate = async (templatePath, data) => {\r\n  const response = await fetch(templatePath);\r\n  let template = await response.text();\r\n\r\n  // Process sub-templates\r\n  const subTemplateRegex = /\\{\\{\\>\\s*(.*?)\\s*\\}\\}/g;\r\n  let match;\r\n  while ((match = subTemplateRegex.exec(template)) !== null) {\r\n    const subTemplatePath = `${squeezeOptions.templateBase}/${match[1].trim()}.html`;\r\n    const subTemplate = await loadTemplate(subTemplatePath, data);\r\n    template = template.replace(match[0], subTemplate);\r\n  }\r\n\r\n  // Process nested if-else conditions using a recursive approach\r\n  const processIfStatements = (template) => {\r\n    return template.replace(/\\{\\{#if (\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (match, condition, content) => {\r\n      if (data[condition.trim()]) {\r\n        // Handle nested if-else conditions inside the true block\r\n        return processIfStatements(content.replace(/\\{\\{#else\\}\\}([\\s\\S]*)/g, \"\"));\r\n      } else {\r\n        // Handle nested if-else conditions inside the false block\r\n        return processIfStatements(content.match(/\\{\\{#else\\}\\}([\\s\\S]*)/)?.[1] || \"\");\r\n      }\r\n    });\r\n  };\r\n\r\n  // Apply recursive processing of if conditions\r\n  template = processIfStatements(template);\r\n\r\n  // Replace variables\r\n  return template.replace(/\\{\\{(.*?)\\}\\}/g, (match, key) => data[key.trim()] || '');\r\n}\r\n\r\nconst renderTemplate = async (templatePath, data, target) => {\r\n  const renderedHTML = await loadTemplate(templatePath, data);\r\n\r\n  // Create a temporary container to parse HTML\r\n  const tempContainer = document.createElement(\"template\");\r\n  tempContainer.innerHTML = renderedHTML.trim();\r\n\r\n  target.appendChild(tempContainer.content.firstChild);\r\n\r\n  // Return the last element of the rendered template\r\n  return target.lastElementChild;\r\n}\r\n\r\nconst logMessage = async (msg, options = {}) => {\r\n  const { mediaLogWrapper = null, isStart = false, isPause = false } = options;\r\n  let { title = '', iconId = 'check-mark-circle-icon' } = options;\r\n\r\n  if (!elements.bulkLogInput) return;\r\n\r\n  if (isStart || isPause) {\r\n    iconId = isPause ? 'pause-button-icon' : 'image-file-icon';\r\n    title = isPause ? __('Bulk squeezing has been paused!', 'squeeze') : `${__('Media', 'squeeze')} ${title}:`;\r\n    return await renderTemplate(squeezeOptions.templates.logWrapper, { title: title, msg: msg, iconId: iconId, isStart: isStart, isPause: isPause }, elements.bulkLogInput);\r\n  } else {\r\n    if (mediaLogWrapper) {\r\n      const process = mediaLogWrapper.querySelector(\".media-log-process\");\r\n      const step = await renderTemplate(squeezeOptions.templates.logStep, { msg: msg, iconId: iconId }, process);\r\n\r\n      if (msg.includes('squeeze-comparison-table')) {\r\n        const comparisonTable = step.querySelector('.squeeze-comparison-table');\r\n        const toggleBtn = await renderTemplate(squeezeOptions.templates.logDetailsButton, { buttonText: __('Show details', 'squeeze') }, mediaLogWrapper);\r\n\r\n        toggleBtn.addEventListener(\"click\", () => {\r\n          comparisonTable.classList.toggle(\"show\");\r\n          toggleBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n        });\r\n        step.closest(\".media-log-wrapper\").appendChild(comparisonTable);\r\n        step.closest(\".media-log-wrapper\").appendChild(toggleBtn);\r\n      }\r\n    } else {\r\n      elements.bulkLogInput.innerHTML += msg + `<br>`;\r\n    }\r\n  }\r\n}\r\n\r\nconst restoreBulkButtons = () => {\r\n  elements.bulkBtn.disabled = false;\r\n  elements.bulkAgainBtn.disabled = false;\r\n  elements.bulkPathBtn.disabled = false;\r\n  updateButtonText(elements.bulkBtn, __('Run Bulk Squeeze', 'squeeze'), '#play-button-round-icon');\r\n  updateButtonText(elements.bulkAgainBtn, __('Repeat Bulk Squeeze', 'squeeze'), '#combine-left-right-outline-icon');\r\n  updateButtonText(elements.bulkPathBtn, __('Run Directory Squeeze', 'squeeze'), '#play-button-round-icon');\r\n  elements.bulkBtn.dataset.running = 'false';\r\n  elements.bulkAgainBtn.dataset.running = 'false';\r\n  elements.bulkPathBtn.dataset.running = 'false';\r\n\r\n  cachedMediaData.process = '';\r\n  cachedMediaData.mediaIDs = [];\r\n  cachedMediaData.page = 1;\r\n}\r\n\r\nconst disableBulkButtons = () => {\r\n  elements.bulkBtn.disabled = true;\r\n  elements.bulkAgainBtn.disabled = true;\r\n  elements.bulkPathBtn.disabled = true;\r\n}\r\n\r\nconst disableAllButtons = (buttons) => {\r\n  if (!buttons) return;\r\n  buttons.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst removeAllButtons = (buttons) => {\r\n  if (!buttons) return;\r\n  buttons.forEach((btn) => btn.remove());\r\n}\r\n\r\nconst updateButtonText = (button, text, svgAnchor = false) => {\r\n  button.childNodes.forEach((node) => {\r\n    if (node.nodeName === '#text' && node.textContent.trim() !== '') {\r\n      node.textContent = text;\r\n    }\r\n    if (svgAnchor && node.nodeName === 'svg') {\r\n      node.querySelector('use').setAttribute('xlink:href', svgAnchor);\r\n    }\r\n  });\r\n}\r\n\r\n// Function to render directories in the dialog\r\nconst renderDirectories = async (dirs, parentDir = null, listeners = {}) => {\r\n  if (!dirs) return;\r\n  if (typeof dirs === 'object') dirs = Object.values(dirs);\r\n  if (!elements.dirContainer.classList.contains(\"loaded\")) elements.dirContainer.innerHTML = \"\";\r\n\r\n  if (dirs.length === 0 && !parentDir) {\r\n    const listItem = await renderTemplate(squeezeOptions.templates.directoryItemEmpty, { emptyText: __('No directories found!', 'squeeze') }, elements.dirContainer);\r\n    return;\r\n  }\r\n\r\n  const selectedFolders = JSON.parse(elements.pathInput.value);\r\n  let target;\r\n\r\n  for (const dir of dirs) {\r\n    const listItemClasses = [];\r\n\r\n    if (dir.parent === '/') {\r\n      listItemClasses.push(\"loaded\", \"opened\");\r\n    }\r\n\r\n    if (parentDir) {\r\n      target = parentDir;\r\n    } else if (dir.parent) {\r\n      const parentElement = elements.dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n      if (parentElement) {\r\n        target = parentElement;\r\n      } else {\r\n        target = elements.dirContainer;\r\n      }\r\n    } else {\r\n      target = elements.dirContainer;\r\n    }\r\n\r\n    const listItem = await renderTemplate(\r\n      squeezeOptions.templates.directoryItem,\r\n      {\r\n        parent: dir.parent,\r\n        path: dir.path,\r\n        label: dir.name,\r\n        classes: listItemClasses.join(\" \"),\r\n        isWritable: dir.is_writeable && !(Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)),\r\n        isChecked: dir.is_writeable && Array.isArray(selectedFolders) && selectedFolders.includes(dir.path),\r\n      },\r\n      target\r\n    )\r\n\r\n    listItem.querySelector(\"label\").addEventListener(\"click\", listeners.handleDirectoryClick);\r\n    listItem.querySelector(\"input[type='checkbox']\")?.addEventListener(\"change\", listeners.handleDirectoryCheck);\r\n  }\r\n\r\n  elements.dirContainer.classList.add(\"loaded\");\r\n}\r\n\r\nconst populatePathInput = async () => {\r\n  const path = elements.pathInput.value;\r\n  if (!path) return;\r\n\r\n  try {\r\n    const selectedFolders = JSON.parse(path);\r\n    const inputs = elements.pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n    inputs.forEach(input => input.remove());\r\n\r\n    for (const folder of selectedFolders) {\r\n      const input = await renderTemplate(squeezeOptions.templates.pathListItem, { folder: folder }, elements.pathList);\r\n    }\r\n  } catch (error) {\r\n    alert(__('Error parsing path input!', 'squeeze'));\r\n    console.error('Error parsing path input:', error);\r\n  }\r\n}\n\n//# sourceURL=webpack:///./assets/js/helpers.js?");

/***/ }),

/***/ "./assets/js/script.js":
/*!*****************************!*\
  !*** ./assets/js/script.js ***!
  \*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _squeeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./squeeze.js */ \"./assets/js/squeeze.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n\"use strict\";\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst Squeeze = new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\n\r\nconst handleDirectoryClick = async (event) => {\r\n  if (event.target !== event.currentTarget) return;\r\n\r\n  const currentDir = event.target.closest(\".directory-item\");\r\n  const currentPath = currentDir.dataset.path;\r\n  const parentPath = currentDir.dataset.parent;\r\n\r\n  if (parentPath === '/' || currentDir.classList.contains(\"loading\")) return;\r\n\r\n  if (currentDir.classList.contains(\"loaded\")) {\r\n    currentDir.classList.toggle(\"opened\");\r\n    return;\r\n  }\r\n\r\n  currentDir.classList.add(\"loading\");\r\n\r\n  const subDirs = await Squeeze.getDirectories(currentPath);\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(subDirs, currentDir, {\r\n    handleDirectoryClick,\r\n    handleDirectoryCheck\r\n  });\r\n\r\n  currentDir.classList.remove(\"loading\");\r\n  currentDir.classList.add(\"loaded\", \"opened\");\r\n}\r\n\r\nconst handleDirectoryCheck = (event) => {\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn.disabled = !_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n};\r\n\r\nconst handleClosePathDialog = (event) => {\r\n  if (!event.target.contains(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog)) return;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n};\r\n\r\nconst handleBulkPause = (data, currentPage) => {\r\n  window.onbeforeunload = null;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(__('Bulk squeezing has been paused!', 'squeeze'), { isPause: true });\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs = data;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page = currentPage;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target.disabled = false;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n};\r\n\r\nconst handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n  const isPaused = event.target.dataset.running === 'true';\r\n\r\n  event.target.dataset.running = isPaused ? 'false' : 'true';\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, isPaused ? __('Resume bulk squeezing', 'squeeze') : __('Pause bulk squeezing', 'squeeze'), isPaused ? '#play-button-round-icon' : '#pause-button-icon');\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused = isPaused;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process = process;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs = mediaIDs;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page = page;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.target = event.target;\r\n\r\n  return isPaused;\r\n};\r\n\r\n/**\r\n * Hadnle warning on page leave\r\n*/\r\nconst handleOnLeave = () => {\r\n  const urlParams = new URLSearchParams(window.location.search);\r\n  const page = urlParams.get('page');\r\n  const isUploadPage = window.location.href.includes('upload.php');\r\n  const isMediaNewPage = window.location.href.includes('media-new.php');\r\n  const isAttachmentPage = window.location.href.includes('post.php') && urlParams.get('action') === 'edit';\r\n\r\n  if (page === 'squeeze-bulk' || isMediaNewPage || isAttachmentPage) {\r\n    return __('Are you sure you want to leave this page? The squeezing process will be terminated!', 'squeeze');\r\n  }\r\n  if (isUploadPage) {\r\n    return __('Are you sure you want to leave this page? The settings will not be saved!', 'squeeze');\r\n  }\r\n};\r\n\r\n// Handle single compress button click\r\nconst handleSingleBtnClick = async (event) => {\r\n  const attachmentID = event.target.dataset.attachment;\r\n  const squeezeStatus = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n  try {\r\n    wp.media.attachment(attachmentID).fetch().then(async (data) => {\r\n      const attachment = { attributes: data };\r\n\r\n      try {\r\n        const compressData = await Squeeze.handleCompress(attachment);\r\n        const response = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n        squeezeStatus.innerHTML = response?.data ?? response;\r\n\r\n        if (event.target.closest(\"td\").classList.contains(\"field\")) {\r\n          const table = event.target.closest(\"td\")?.querySelector(\".squeeze_status .squeeze-comparison-table\");\r\n          if (table) {\r\n            const td = document.createElement(\"td\");\r\n            td.classList.add(\"field\");\r\n            td.style.width = \"100%\";\r\n            td.appendChild(table);\r\n            event.target.closest(\"tr\").appendChild(td);\r\n          }\r\n        }\r\n      } catch (error) {\r\n        console.error(error);\r\n        squeezeStatus.innerHTML = error;\r\n      } finally {\r\n        _helpers_js__WEBPACK_IMPORTED_MODULE_1__.removeAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n        window.onbeforeunload = null;\r\n      }\r\n    });\r\n  } catch (error) {\r\n    console.error(error);\r\n    squeezeStatus.innerHTML = error;\r\n    event.target.remove();\r\n  }\r\n};\r\n\r\nconst handleRestoreBtnClick = async (event) => {\r\n  const attachmentID = event.target.dataset.attachment;\r\n\r\n  event.target.disabled = true;\r\n  event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = '⏳ ' + __('Restore in process...', 'squeeze');\r\n\r\n  try {\r\n    const response = await Squeeze.handleRestore(attachmentID);\r\n    event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = response.data;\r\n  } catch (error) {\r\n    console.error(error);\r\n    event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = error;\r\n  } finally {\r\n    event.target.closest('td').querySelector(`[name='squeeze_compress_again']`).disabled = false;\r\n    event.target.remove();\r\n    window.onbeforeunload = null;\r\n  }\r\n};\r\n\r\nconst handleButtonsClick = async (event) => {\r\n  const singleBtnName = 'squeeze_compress_single';\r\n  const compressAgainBtnName = 'squeeze_compress_again';\r\n  const restoreBtnName = 'squeeze_restore';\r\n\r\n  if (event.target.getAttribute(\"name\") === singleBtnName || event.target.getAttribute(\"name\") === compressAgainBtnName) {\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n    event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = '⏳ ' + __('Squeezing...', 'squeeze');\r\n    window.onbeforeunload = handleOnLeave;\r\n    handleSingleBtnClick(event);\r\n  }\r\n\r\n  if (event.target.getAttribute(\"name\") === restoreBtnName) {\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n    window.onbeforeunload = handleOnLeave;\r\n    handleRestoreBtnClick(event);\r\n  }\r\n};\r\n\r\nconst handleRecursiveUpload = async (path, data, currentPage, isUpdateChart = false) => {\r\n  if (data === undefined) return { success: false, data: 'No data provided!', mediaIDs: [] }; // when bulk directory path has no images\r\n\r\n  const initData = [...data];  // initial data \r\n  let totalPages = 1;\r\n  if (path === 'uncompressed') {\r\n    totalPages = document.querySelector(\"input[name='squeeze_bulk_uncompressed_pages']\")?.value ?? 1;\r\n  }\r\n  if (path === 'all') {\r\n    totalPages = document.querySelector(\"input[name='squeeze_bulk_total_pages']\")?.value ?? 1;\r\n  }\r\n\r\n  if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused) {\r\n    handleBulkPause(data, currentPage);\r\n    return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n  }\r\n\r\n  const filename = data[0]?.filename ? data[0].filename : `ID #${data[0]}`;\r\n  const mediaLogWrapper = await _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${__('Start squeezing...', 'squeeze')}`, { title: filename, isStart: true });\r\n\r\n  try {\r\n    const response = await Squeeze.handleBulkUpload(path, data);\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${response.data}`, { mediaLogWrapper, iconId: response.success ? 'check-mark-circle-icon' : 'ban-sign-icon' });\r\n\r\n    if (isUpdateChart) {\r\n      handleUpdateChart(response.mediaIDs);\r\n    }\r\n\r\n    if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.isPaused) {\r\n      handleBulkPause(data, currentPage);\r\n      return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n    }\r\n\r\n    const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.querySelector(`#post-${initData[0]} .column-squeeze .squeeze_status`);\r\n    if (squeezeStatusElement) {\r\n      squeezeStatusElement.innerHTML = response.data;\r\n    }\r\n\r\n    if (response.mediaIDs.length > 0) {\r\n      return handleRecursiveUpload(path, response.mediaIDs, currentPage, isUpdateChart);\r\n    } else {\r\n      currentPage++;\r\n      if (currentPage > totalPages) return response;\r\n\r\n      const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path);\r\n      if (maybeGetNextMediaIDs.success) {\r\n        const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n        return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n      }\r\n    }\r\n\r\n    return response;\r\n  } catch (error) {\r\n    console.error(error);\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(`${error}`, { mediaLogWrapper, iconId: 'ban-sign-icon' });\r\n\r\n    if (data.length > 0) {\r\n      return handleRecursiveUpload(path, data, currentPage, isUpdateChart);\r\n    } else {\r\n      currentPage++;\r\n      if (currentPage > totalPages) return { success: false, data: error, mediaIDs: [] };\r\n\r\n      const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path);\r\n      if (maybeGetNextMediaIDs.success) {\r\n        const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n        return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n      }\r\n    }\r\n  }\r\n};\r\n\r\nconst handleUpdateChart = (data) => {\r\n  const chartValue = document.querySelector(\".squeeze-bulk-media-stats-chart-value > text\");\r\n  const chartBar = document.querySelector(\".squeeze-bulk-media-stats-chart\");\r\n\r\n  if (!chartValue || !chartBar) return;\r\n\r\n  const imagesLeft = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages - data.length;\r\n  const percentage = Math.round((imagesLeft / _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages) * 100);\r\n  const dasharray = percentage * 560 / 100;\r\n  chartValue.textContent = `${percentage}%`;\r\n  chartBar.style.setProperty('--squeeze-dasharray', dasharray);\r\n};\r\n\r\ndocument.addEventListener(\"click\", (event) => {\r\n  handleButtonsClick(event);\r\n});\r\n\r\nconst handleBulkButtonClick = async (event, process, mediaIDs, currentPage) => {\r\n  if (mediaIDs.length === 0) return;\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n  window.onbeforeunload = handleOnLeave;\r\n\r\n  if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === process) {\r\n    if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n      mediaIDs = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n    }\r\n    if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page) {\r\n      currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page;\r\n    }\r\n  }\r\n\r\n  const isPaused = handleBulkToggle(event, process, mediaIDs, currentPage);\r\n  if (isPaused) {\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n    return;\r\n  } else {\r\n    event.target.disabled = false;\r\n  }\r\n\r\n  try {\r\n    const finalResponse = await handleRecursiveUpload(process, mediaIDs, currentPage); // TBD: Add isUpdateChart\r\n\r\n    if (finalResponse?.mediaIDs) {\r\n      if (finalResponse.mediaIDs.length === 0) {\r\n        alert(__('All images have been processed!', 'squeeze'));\r\n        window.onbeforeunload = null;\r\n        _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n      }\r\n    }\r\n  } catch (error) {\r\n    console.error(error);\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n    window.onbeforeunload = null;\r\n    alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n  }\r\n};\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkBtn?.addEventListener(\"click\", async (event) => {\r\n  let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n  let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n  handleBulkButtonClick(event, 'uncompressed', uncompressedIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n  let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n  let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n  handleBulkButtonClick(event, 'all', allIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n  const path = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput?.value ?? '';\r\n  let bulkPathData;\r\n\r\n  if (!path) {\r\n    alert(__('Please enter a valid path!', 'squeeze'));\r\n    return;\r\n  }\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n  window.onbeforeunload = handleOnLeave;\r\n\r\n  if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n    bulkPathData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n  } else {\r\n    const pathData = await Squeeze.getAttachmentsByPath(path);\r\n\r\n    if (pathData.success) {\r\n      bulkPathData = pathData.data;\r\n    } else {\r\n      console.error(pathData.data);\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n      window.onbeforeunload = null;\r\n    }\r\n  }\r\n\r\n  const isPaused = handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n  if (isPaused) {\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n    return;\r\n  } else {\r\n    event.target.disabled = false;\r\n  }\r\n\r\n  try {\r\n    const finalResponse = await handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n    if (finalResponse?.mediaIDs) {\r\n      if (finalResponse.mediaIDs.length === 0) {\r\n        alert(__('All images have been processed!', 'squeeze'));\r\n        window.onbeforeunload = null;\r\n        _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n      }\r\n    }\r\n  } catch (error) {\r\n    console.error(error);\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n    window.onbeforeunload = null;\r\n    alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n  }\r\n})\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = true;\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.showModal();\r\n  if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loaded\")) {\r\n    const selectedFolders = JSON.parse(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value);\r\n\r\n    if (Array.isArray(selectedFolders)) {\r\n      selectedFolders.forEach((folder) => {\r\n        const checkbox = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n        if (checkbox) {\r\n          checkbox.checked = true;\r\n        }\r\n      });\r\n    }\r\n\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = false;\r\n    return;\r\n  }\r\n  const folders = await Squeeze.getDirectories();\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(folders, null, {\r\n    handleDirectoryClick,\r\n    handleDirectoryCheck\r\n  });\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn.disabled = false;\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn?.addEventListener(\"click\", () => {\r\n  const checkboxes = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelectorAll(\"input[type='checkbox']\");\r\n  const selectedFolders = Array.from(checkboxes)\r\n    .filter(checkbox => checkbox.checked)\r\n    .map(checkbox => checkbox.value);\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value = JSON.stringify(selectedFolders);\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.populatePathInput();\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.closePathDialogBtn?.addEventListener(\"click\", () => {\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\ndocument.addEventListener('click', handleClosePathDialog);\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n  const dataAction = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action;\r\n  const action = event.target.querySelector(\"select[name='action']\").value;\r\n  const submitButtons = event.target.querySelectorAll(\"input[name='bulk_action']\");\r\n\r\n  if (action === 'squeeze_bulk_compress' && dataAction !== 'squeeze_bulk_compressed') {\r\n    event.preventDefault();\r\n    const mediaList = document.querySelectorAll(\"input[name='media[]']:checked\");\r\n    const uncompressedIDs = Array.from(mediaList).map((el) => el.value);\r\n\r\n    if (uncompressedIDs.length === 0) return;\r\n\r\n    window.onbeforeunload = handleOnLeave;\r\n\r\n    uncompressedIDs.forEach((id) => {\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n        btn.disabled = true;\r\n      });\r\n      const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelector(`#post-${id} .column-squeeze .squeeze_status`);\r\n      if (squeezeStatusElement) {\r\n        squeezeStatusElement.innerText = '⏳ ' + __('Squeezing...', 'squeeze');\r\n      }\r\n    });\r\n\r\n    submitButtons.forEach((btn) => {\r\n      btn.disabled = true;\r\n      btn.value = __('Squeezing...', 'squeeze');\r\n    });\r\n\r\n    try {\r\n      const finalResponse = await handleRecursiveUpload('uncompressed', uncompressedIDs, 1);\r\n\r\n      if (finalResponse?.mediaIDs) {\r\n        if (finalResponse.mediaIDs.length === 0) {\r\n          window.onbeforeunload = null;\r\n          _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n          _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.submit();\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error(error);\r\n      window.onbeforeunload = null;\r\n      alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n    }\r\n  }\r\n});\r\n\r\n/*! <fs_premium_only> */\r\nconst handleFetchImagesFromPage = async () => {\r\n  const url = new URL(window.location.href);\r\n  const pageURL = url.searchParams.get('url');\r\n  const action = url.searchParams.get('action');\r\n  const page = url.searchParams.get('page');\r\n  const labelTitle = document.querySelector(\"[class='squeeze-bulk-media-stats-item-label']\");\r\n  const labelValue = document.querySelector(\"[class='squeeze-bulk-media-stats-item-value']\");\r\n  const labelIcon = document.querySelector(\"[class='squeeze-bulk-media-stats-item-label'] .squeeze-icon\");\r\n\r\n  if (page !== 'squeeze-bulk' || action !== 'bulk-from-page' || !pageURL) return;\r\n\r\n  window.onbeforeunload = handleOnLeave;\r\n\r\n  try {\r\n    const data = await Squeeze.getAttachmentsByPage(pageURL);\r\n\r\n    if (data.success) {\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.disabled = false;\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.removeAttribute('hidden');\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.dataset.running = 'false';\r\n\r\n      const mediaIDs = data.data;\r\n\r\n      labelTitle.innerHTML = __('Found images on the page:', 'squeeze');\r\n      labelValue.innerHTML = mediaIDs.length;\r\n      labelIcon.style.display = 'none';\r\n\r\n      // trigger click event on bulk button (using dispatchEvent) and pass the mediaIDs\r\n      _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { mediaIDs: mediaIDs } }));\r\n    } else {\r\n      labelTitle.innerHTML = __('Error:', 'squeeze') + ' ' + data.data;\r\n      labelIcon.style.display = 'none';\r\n      console.error(data.data);\r\n      window.onbeforeunload = null;\r\n      alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n    }\r\n  } catch (error) {\r\n    labelTitle.innerHTML = __('An error has occurred while fetching images from the page. Check the console for details.', 'squeeze');\r\n    labelIcon.style.display = 'none';\r\n    console.error(error);\r\n    alert(__('An error has occurred while fetching images from the page. Check the console for details.', 'squeeze'));\r\n    window.onbeforeunload = null;\r\n  }\r\n};\r\n\r\nconst handleBulkFromPage = async (event) => {\r\n  const url = new URL(window.location.href);\r\n  const pageURL = url.searchParams.get('url');\r\n\r\n  let bulkPageData = event.detail.mediaIDs;\r\n\r\n  if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs?.length) {\r\n    bulkPageData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n  }\r\n\r\n  _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.totalImages || bulkPageData.length;\r\n\r\n  const isPaused = handleBulkToggle(event, 'path', bulkPageData);\r\n\r\n  if (isPaused) {\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn.disabled = true;\r\n    _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n    return;\r\n  } else {\r\n    event.target.disabled = false;\r\n  }\r\n\r\n  try {\r\n    const finalResponse = await handleRecursiveUpload('path', bulkPageData, 1, true);\r\n\r\n    if (finalResponse?.mediaIDs) {\r\n      if (finalResponse.mediaIDs.length === 0) {\r\n        alert(__('All images have been processed!', 'squeeze'));\r\n        window.onbeforeunload = null;\r\n        location.href = pageURL;\r\n      }\r\n    }\r\n  } catch (error) {\r\n    console.error(error);\r\n    window.onbeforeunload = null;\r\n    alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n  }\r\n};\r\n\r\nwindow.addEventListener('load', handleFetchImagesFromPage);\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pauseBulkBtn?.addEventListener(\"click\", handleBulkFromPage);\r\n/*! </fs_premium_only> */\r\n\r\nconst maybeCompressAttachment = (attachmentType, attachmentSubType) => {\r\n  const isAutoCompress = compressOptions.auto_compress;\r\n  const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n  const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType);\r\n\r\n  return isImage && isAutoCompress;\r\n};\r\n\r\n// https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\njQuery.extend(wp?.Uploader?.prototype, {\r\n  success: async (attachment) => {\r\n    if (maybeCompressAttachment(attachment.attributes.type, attachment.attributes.subtype)) {\r\n\r\n      // set 'uploading' param to true, to pause the uploading process\r\n      window.onbeforeunload = handleOnLeave;\r\n      attachment.set('uploading', true);\r\n      attachment.set('percent', 100);\r\n\r\n      // TBD: indicate that the image is being compressed\r\n\r\n      try {\r\n        const compressData = await Squeeze.handleCompress(attachment);\r\n        const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n        if (uploadData.success) {\r\n          const compat = attachment.get('compat');\r\n          const tempDiv = document.createElement('div');\r\n          let compatItem = compat.item;\r\n\r\n          tempDiv.innerHTML = compatItem;\r\n          tempDiv.querySelector('.compat-field-squeeze_is_compressed .field').innerHTML = uploadData.data;\r\n          compat.item = tempDiv.innerHTML;\r\n\r\n          attachment.set('compat', compat);\r\n          attachment.set('uploading', false);\r\n          window.onbeforeunload = null;\r\n        } else {\r\n          attachment.set('uploading', false);\r\n          window.onbeforeunload = null;\r\n          alert(uploadData.data);\r\n        }\r\n      } catch (error) {\r\n        console.error(error);\r\n        attachment.set('uploading', false);\r\n        window.onbeforeunload = null;\r\n      }\r\n    }\r\n  },\r\n});\r\n\r\nconst handleMultiFileFormUpload = () => {\r\n  if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') return;\r\n\r\n  const SqueezeUploader = uploader;\r\n\r\n  SqueezeUploader.bind('FilesAdded', function (up, files) {});\r\n\r\n  SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n    const fileMime = file.type;\r\n    const fileType = fileMime.split('/')[0];\r\n    const fileSubType = fileMime.split('/')[1];\r\n\r\n    if (!maybeCompressAttachment(fileType, fileSubType)) return;\r\n\r\n    const fileID = file.id;\r\n    const attachmentID = response.response;\r\n    const mediaItem = document.getElementById(`media-item-${fileID}`);\r\n\r\n    window.onbeforeunload = handleOnLeave;\r\n\r\n    /**\r\n     * Wait for media item to load( 'async-upload.php' )\r\n     * Ping every 1 second until the media item is loaded\r\n     * @returns Promise\r\n    */\r\n    const waitForItemLoad = () => {\r\n      return new Promise((resolve) => {\r\n        let interval = setInterval(() => {\r\n          if (mediaItem.querySelector('.media-item-wrapper')) {\r\n            mediaItem.querySelector('.media-item-wrapper').innerHTML += `\r\n              <div class=\"progress\">\r\n                <div class=\"percent\">${__('Squeezing...', 'squeeze')}</div>\r\n                <div class=\"bar\" style=\"width: 200px;\"></div>\r\n              </div>\r\n            `;\r\n            clearInterval(interval);\r\n            resolve();\r\n          }\r\n        }, 1000);\r\n      });\r\n    };\r\n\r\n    waitForItemLoad().then(() => {\r\n      try {\r\n        wp.media.attachment(attachmentID).fetch().then(async function (data) {\r\n          const attachment = { attributes: data };\r\n\r\n          try {\r\n            const compressData = await Squeeze.handleCompress(attachment);\r\n            const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n            if (uploadData.success) {\r\n              window.onbeforeunload = null;\r\n              mediaItem.innerHTML += `<div class=\"squeeze_status\">${uploadData.data}</div>`;\r\n              mediaItem.querySelector('.progress')?.remove();\r\n            } else {\r\n              alert(uploadData?.data ?? uploadData);\r\n              window.onbeforeunload = null;\r\n              mediaItem.querySelector('.progress')?.remove();\r\n            }\r\n          } catch (error) {\r\n            console.error(error);\r\n            mediaItem.innerHTML += error;\r\n            window.onbeforeunload = null;\r\n            mediaItem.querySelector('.progress')?.remove();\r\n          }\r\n        });\r\n      } catch (error) {\r\n        console.error(error);\r\n        mediaItem.innerHTML += error;\r\n        window.onbeforeunload = null;\r\n        mediaItem.querySelector('.progress')?.remove();\r\n      }\r\n    });\r\n  });\r\n\r\n  SqueezeUploader.bind('UploadComplete', function (up, files) {});\r\n};\r\n\r\ndocument.onreadystatechange = function () {\r\n  if (document.readyState === \"complete\") { // equivalent to jQuery $(document).ready()\r\n    handleMultiFileFormUpload();\r\n  }\r\n};\n\n//# sourceURL=webpack:///./assets/js/script.js?");

/***/ }),

/***/ "./assets/js/squeeze.js":
/*!******************************!*\
  !*** ./assets/js/squeeze.js ***!
  \******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nclass SQUEEZE {\r\n\r\n  constructor(squeeze) {\r\n    this.options = JSON.parse(squeeze.options); // plugin options\r\n    this.nonce = squeeze.nonce; // nonce\r\n    this.ajaxUrl = squeeze.ajaxUrl; // ajax url\r\n  }\r\n\r\n  handleCompress = async ( attachment ) => {\r\n    const attachmentData = attachment.attributes;\r\n    const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n    const mime = attachmentData.mime;\r\n    const name = attachmentData.name;\r\n    const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n    const attachmentID = attachmentData.id;\r\n    const sizes = attachmentData.sizes;\r\n    const format = mime.split(\"/\")[1];\r\n    const sourceType = format;\r\n    const outputType = format;\r\n    const skipFull = attachmentData.originalImageName === undefined ? true : false;\r\n    const timeout = parseInt(this.options.timeout) * 1000; // convert to milliseconds\r\n\r\n    //console.log(attachmentData, 'attachmentData')\r\n\r\n    const worker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"assets_js_worker_js\"), __webpack_require__.b), {type: undefined}); // worker url\r\n    worker.postMessage({\r\n      action: 'compress',\r\n      format,\r\n      url,\r\n      name,\r\n      sourceType,\r\n      outputType,\r\n      mime,\r\n      sizes,\r\n      skipFull,\r\n      timeout,\r\n      options: this.options,\r\n    });\r\n\r\n    return new Promise((resolve, reject) => {\r\n      const timeoutId = setTimeout(() => {\r\n        worker.terminate();\r\n        console.warn('Worker terminated');\r\n        reject(new Error(__('Request timed out.', 'squeeze')));\r\n      }, timeout);\r\n\r\n      worker.onmessage = (event) => {\r\n        clearTimeout(timeoutId);\r\n        if (event.data.error) {\r\n          reject(new Error(event.data.error));\r\n        } else {\r\n          resolve(event.data);\r\n        }\r\n        worker.terminate();\r\n      };\r\n\r\n      worker.onerror = (error) => {\r\n        clearTimeout(timeoutId);\r\n        reject(new Error(`Worker error: ${error.message}`));\r\n      };\r\n    });\r\n\r\n  }\r\n\r\n  handleUpload = async ({ attachment, base64, type = 'uncompressed', mediaIDs = [] }) => {\r\n\r\n    const attachmentData = attachment.attributes;\r\n    const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n    const mime = attachmentData.mime;\r\n    const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n    const attachmentID = attachmentData.id;\r\n    const format = mime.split(\"/\")[1];\r\n\r\n    //console.log(attachmentData, 'attachmentData')\r\n\r\n    const data = {\r\n      action: 'squeeze_update_attachment',\r\n      _ajax_nonce: this.nonce,\r\n      filename: filename,\r\n      type: 'image',\r\n      format: format,\r\n      base64: base64.base64,\r\n      base64Sizes: base64.base64Sizes,\r\n      base64Webp: base64.base64Webp,\r\n      base64SizesWebp: base64.base64SizesWebp,\r\n      attachmentID: attachmentID,\r\n      url: url,\r\n      process: type,\r\n    }\r\n\r\n    //console.log(data, 'squeeze_update_attachment')\r\n\r\n    try {\r\n      const uploadResponse = await jQuery.ajax({\r\n      url: this.ajaxUrl, // + '111',\r\n      type: 'POST',\r\n      data: data,\r\n      });\r\n\r\n      //if (type === 'uncompressed' || type === 'all' || type === 'path') {\r\n      if (uploadResponse.success) {\r\n        uploadResponse['mediaIDs'] = mediaIDs;\r\n      }\r\n\r\n      return uploadResponse;\r\n      \r\n    } catch (error) {\r\n      return {\r\n      'mediaIDs': mediaIDs,\r\n      'data': error.message,\r\n      'success': false\r\n      };\r\n    }\r\n\r\n  }\r\n\r\n  handleBulkUpload = async (type = 'uncompressed', mediaIDs = []) => {\r\n    let currentID;\r\n    let attachment;\r\n\r\n    switch (type) {\r\n      case 'all':\r\n      case 'uncompressed':\r\n        currentID = mediaIDs[0];\r\n        break;\r\n      case 'path':\r\n        currentID = mediaIDs[0]?.filename;\r\n        break;\r\n      default:\r\n        currentID = 0;\r\n        break;\r\n    }\r\n\r\n    if (type === 'path') {\r\n\r\n      attachment = {\r\n        attributes: {\r\n          url: mediaIDs[0].url,\r\n          mime: mediaIDs[0].mime,\r\n          name: mediaIDs[0].name,\r\n          filename: mediaIDs[0].filename,\r\n          id: mediaIDs[0].id,\r\n          sizes: mediaIDs[0]?.sizes,\r\n        }\r\n      }\r\n\r\n    } else {\r\n\r\n      const attachmentResponse = await this.getAttachment(currentID); \r\n      if (attachmentResponse.success === false) {\r\n        mediaIDs.shift();\r\n        return {\r\n          'mediaIDs': mediaIDs,\r\n          'data': attachmentResponse.data\r\n        }\r\n      }\r\n      const attachmentData = attachmentResponse.data;\r\n      attachment = {\r\n        attributes: {\r\n          url: attachmentData.url,\r\n          mime: attachmentData.mime,\r\n          name: attachmentData.name,\r\n          filename: attachmentData.filename,\r\n          id: attachmentData.id,\r\n          sizes: attachmentData.sizes,\r\n        }\r\n      }\r\n\r\n    }\r\n\r\n    mediaIDs.shift();\r\n\r\n    const mediaType = attachment.attributes.mime.split(\"/\")[0];\r\n    const mediaSubType = attachment.attributes.mime.split(\"/\")[1];\r\n\r\n    if (!this.maybeCompressAttachment(mediaType, mediaSubType)) {\r\n      return {\r\n        'mediaIDs': mediaIDs,\r\n        'data': __('Skipped', 'squeeze')\r\n      }\r\n    }\r\n\r\n    try {\r\n      const compressData = await this.handleCompress( attachment );\r\n      const uploadData = await this.handleUpload({ attachment: attachment, base64: compressData, type: type, mediaIDs: mediaIDs })\r\n\r\n      return uploadData;\r\n\r\n    } catch (error) {\r\n      return {\r\n        'mediaIDs': mediaIDs,\r\n        'data': error.message,\r\n        'success': false\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  maybeCompressAttachment = (attachmentType, attachmentSubType) => {\r\n    const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n    const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType)\r\n\r\n    if (isImage) {\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  handleRestore = async (attachmentID) => {\r\n    const data = {\r\n      action: 'squeeze_restore_attachment',\r\n      _ajax_nonce: this.nonce,\r\n      attachmentID: attachmentID,\r\n    };\r\n\r\n    const response = await jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  };\r\n\r\n  // Get list of attachments by path\r\n  getAttachmentsByPath = async (path) => {\r\n\r\n    const data = {\r\n      action: 'squeeze_get_attachment_by_path',\r\n      path: path,\r\n      _ajax_nonce: this.nonce,\r\n    }\r\n\r\n    const response = jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  }\r\n\r\n  getAttachment = async (attachmentID) => {\r\n    const data = {\r\n      action: 'squeeze_get_attachment',\r\n      _ajax_nonce: this.nonce,\r\n      attachmentID: attachmentID,\r\n    }\r\n\r\n    const response = jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  }\r\n\r\n  getNextAttachments = async (page = 1, type = 'uncompressed') => {\r\n    const data = {\r\n      action: 'squeeze_get_next_attachments',\r\n      _ajax_nonce: this.nonce,\r\n      page: page,\r\n      type: type,\r\n    }\r\n\r\n    const response = jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  }\r\n\r\n  getDirectories = async (parentDir = false) => {\r\n    const data = {\r\n      action: 'squeeze_get_directories',\r\n      _ajax_nonce: this.nonce,\r\n    }\r\n\r\n    if (parentDir) {\r\n      data['parentDir'] = parentDir;\r\n    }\r\n\r\n    const response = jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  }\r\n\r\n  /*! <fs_premium_only> */\r\n  getAttachmentsByPage = async (pageURL) => {\r\n    const data = {\r\n      action: 'squeeze_get_attachments_by_page',\r\n      _ajax_nonce: this.nonce,\r\n      pageURL: pageURL,\r\n    }\r\n\r\n    const response = jQuery.ajax({\r\n      url: this.ajaxUrl,\r\n      type: 'POST',\r\n      data: data,\r\n    });\r\n\r\n    return response;\r\n  }\r\n  /*! </fs_premium_only> */\r\n\r\n}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = __webpack_modules__;
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/get javascript chunk filename */
/******/ 	(() => {
/******/ 		// This function allow to reference async chunks
/******/ 		__webpack_require__.u = (chunkId) => {
/******/ 			// return url for filenames based on template
/******/ 			return "" + chunkId + ".script.bundle.js";
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/global */
/******/ 	(() => {
/******/ 		__webpack_require__.g = (function() {
/******/ 			if (typeof globalThis === 'object') return globalThis;
/******/ 			try {
/******/ 				return this || new Function('return this')();
/******/ 			} catch (e) {
/******/ 				if (typeof window === 'object') return window;
/******/ 			}
/******/ 		})();
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/publicPath */
/******/ 	(() => {
/******/ 		var scriptUrl;
/******/ 		if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
/******/ 		var document = __webpack_require__.g.document;
/******/ 		if (!scriptUrl && document) {
/******/ 			if (document.currentScript)
/******/ 				scriptUrl = document.currentScript.src;
/******/ 			if (!scriptUrl) {
/******/ 				var scripts = document.getElementsByTagName("script");
/******/ 				if(scripts.length) scriptUrl = scripts[scripts.length - 1].src
/******/ 			}
/******/ 		}
/******/ 		// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
/******/ 		// or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
/******/ 		if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
/******/ 		scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
/******/ 		__webpack_require__.p = scriptUrl;
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/jsonp chunk loading */
/******/ 	(() => {
/******/ 		__webpack_require__.b = document.baseURI || self.location.href;
/******/ 		
/******/ 		// object to store loaded and loading chunks
/******/ 		// undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ 		// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
/******/ 		var installedChunks = {
/******/ 			"main": 0
/******/ 		};
/******/ 		
/******/ 		// no chunk on demand loading
/******/ 		
/******/ 		// no prefetching
/******/ 		
/******/ 		// no preloaded
/******/ 		
/******/ 		// no HMR
/******/ 		
/******/ 		// no HMR manifest
/******/ 		
/******/ 		// no on chunks loaded
/******/ 		
/******/ 		// no jsonp function
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = __webpack_require__("./assets/js/script.js");
/******/ 	
/******/ })()
;
```
