PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.5
Squeeze – Image Optimization & Compression, WEBP Conversion v1.5
1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 trunk 1.0 1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5 1.5.1 1.5.2 1.6 All 42 releases
squeeze / assets / js / script.bundle.js

script.bundle.js in Squeeze – Image Optimization & Compression, WEBP Conversion 1.5, at assets/js/script.bundle.js

166 lines 47.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9 /******/ (() => { // webpackBootstrap
10 /******/ "use strict";
11 /******/ var __webpack_modules__ = ({
12
13 /***/ "./assets/js/script.js":
14 /*!*****************************!*\
15 !*** ./assets/js/script.js ***!
16 \*****************************/
17 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18
19 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\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst Squeze = new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\n\r\n//console.log(squeezeOptions, 'Squeeze JS loaded!');\r\n\r\n(function () {\r\n\r\n const bulkBtn = document.querySelector(\"[name='squeeze_bulk']\")\r\n const bulkAgainBtn = document.querySelector(\"[name='squeeze_bulk_again']\")\r\n const bulkPathBtn = document.querySelector(\"[name='squeeze_bulk_path_button']\")\r\n const selectPathBtn = document.querySelector(\"[name='squeeze_select_path_button']\")\r\n const savePathBtn = document.querySelector(\"[name='squeeze_save_path_button']\")\r\n const pathDialog = document.getElementById(\"squeeze-path-dialog\");\r\n const closePathDialogBtn = document.querySelector(\"[name='squeeze_close_path_dialog_button']\");\r\n const pathInput = document.querySelector(\"[name='squeeze_bulk_path']\");\r\n const postsFilterForm = document.querySelector(\"#posts-filter\");\r\n const dirContainer = document.getElementById(\"squeeze-bulk-directory-list\");\r\n\r\n const cachedMediaData = {\r\n isPaused: false,\r\n page: 1,\r\n }\r\n\r\n const logMsg = (msg, {mediaLogWrapper = null, title = false, isStart = false, isPause = false, iconId = 'check-mark-circle-icon'}) => {\r\n const bulkLogInput = document.querySelector(\"#squeeze-log-data\")\r\n if (!bulkLogInput) {\r\n return;\r\n }\r\n if (isStart || isPause) {\r\n const mediaIcon = isPause ? \r\n `<svg class=\"squeeze-icon\">\r\n <use xlink:href=\"#pause-button-icon\"></use>\r\n </svg>` :\r\n `<svg class=\"squeeze-icon\">\r\n <use xlink:href=\"#image-file-icon\"></use>\r\n </svg>`;\r\n const mediaLogWrapper = document.createElement(\"div\");\r\n mediaLogWrapper.classList.add(\"media-log-wrapper\");\r\n if (isStart) {\r\n mediaLogWrapper.innerHTML = title ? `<h3>${mediaIcon} ${__('Media', 'squeeze')} ${title}:</h3>` : `<h3>${mediaIcon} ${__('Media', 'squeeze')}:</h3>`;\r\n }\r\n if (isPause) {\r\n mediaLogWrapper.innerHTML = `<h3>${mediaIcon} ${msg}</h3>`;\r\n }\r\n mediaLogWrapper.innerHTML += isStart ? \r\n `\r\n <div class=\"media-log-process\">\r\n <div class=\"media-log-step\">\r\n <svg class=\"squeeze-icon circle-center-icon\">\r\n <use xlink:href=\"#circle-center-icon\"></use>\r\n </svg>\r\n <span>${msg}</span>\r\n </div>\r\n </div>`\r\n : '';\r\n bulkLogInput.appendChild(mediaLogWrapper);\r\n return mediaLogWrapper;\r\n } else {\r\n if (mediaLogWrapper) {\r\n const mediaLogProcess = mediaLogWrapper.querySelector(\".media-log-process\");\r\n const mediaLogStep = document.createElement(\"div\");\r\n mediaLogStep.classList.add(\"media-log-step\");\r\n mediaLogStep.innerHTML = `\r\n <svg class=\"squeeze-icon ${iconId}\">\r\n <use xlink:href=\"#${iconId}\"></use>\r\n </svg>\r\n <span>${msg}</span>`;\r\n mediaLogProcess.appendChild(mediaLogStep);\r\n\r\n if (msg.includes('squeeze-comparison-table')) {\r\n const comparisonTable = mediaLogStep.querySelector('.squeeze-comparison-table');\r\n const toggleComparisonBtn = document.createElement(\"button\");\r\n toggleComparisonBtn.classList.add(\"button\", \"button-link\", \"button-small\");\r\n toggleComparisonBtn.textContent = __('Show details', 'squeeze');\r\n toggleComparisonBtn.addEventListener(\"click\", () => {\r\n comparisonTable.classList.toggle(\"show\");\r\n toggleComparisonBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n })\r\n mediaLogWrapper.appendChild(comparisonTable);\r\n mediaLogWrapper.appendChild(toggleComparisonBtn);\r\n }\r\n } else {\r\n bulkLogInput.innerHTML += msg + `<br>`;\r\n }\r\n }\r\n }\r\n\r\n const restoreBulkButtons = () => {\r\n bulkBtn.disabled = false;\r\n bulkAgainBtn.disabled = false;\r\n bulkPathBtn.disabled = false;\r\n updateButtonText(bulkBtn, __('Run Bulk Squeeze', 'squeeze'), '#play-button-round-icon');\r\n updateButtonText(bulkAgainBtn, __('Repeat Bulk Squeeze', 'squeeze'), '#combine-left-right-outline-icon');\r\n updateButtonText(bulkPathBtn, __('Run Directory Squeeze', 'squeeze'), '#play-button-round-icon');\r\n bulkBtn.dataset.running = 'false';\r\n bulkAgainBtn.dataset.running = 'false';\r\n bulkPathBtn.dataset.running = 'false';\r\n\r\n cachedMediaData.process = '';\r\n cachedMediaData.mediaIDs = [];\r\n cachedMediaData.page = 1;\r\n }\r\n\r\n const disableBulkButtons = () => {\r\n bulkBtn.disabled = true;\r\n bulkAgainBtn.disabled = true;\r\n bulkPathBtn.disabled = true;\r\n }\r\n\r\n const disableAllButtons = (buttons) => {\r\n if (!buttons) {\r\n return;\r\n }\r\n buttons.forEach((btn) => {\r\n btn.disabled = true;\r\n })\r\n }\r\n\r\n const removeAllButtons = (buttons) => {\r\n if (!buttons) {\r\n return;\r\n }\r\n buttons.forEach((btn) => {\r\n btn.remove();\r\n })\r\n }\r\n\r\n const 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\n const renderDirectories = (dirs, parentDir = null) => {\r\n\r\n if (!dirs) {\r\n return;\r\n }\r\n\r\n if (typeof dirs === 'object') {\r\n dirs = Object.values(dirs);\r\n }\r\n\r\n if (!dirContainer.classList.contains(\"loaded\")) {\r\n dirContainer.innerHTML = \"\";\r\n }\r\n\r\n if (dirs.length === 0 && !parentDir) {\r\n const listItem = document.createElement(\"div\");\r\n listItem.className = \"directory-item\";\r\n listItem.textContent = __('No directories found!', 'squeeze');\r\n dirContainer.appendChild(listItem);\r\n return;\r\n }\r\n\r\n dirs.forEach(dir => {\r\n const listItem = document.createElement(\"div\");\r\n listItem.className = \"directory-item\";\r\n listItem.dataset.parent = dir.parent;\r\n listItem.dataset.path = dir.path;\r\n\r\n if (dir.parent === '/') {\r\n listItem.classList.add(\"loaded\");\r\n listItem.classList.add(\"opened\");\r\n }\r\n\r\n const listItemInner = document.createElement(\"div\");\r\n listItemInner.className = \"directory-item__inner\";\r\n\r\n if (dir.is_writeable) {\r\n const checkbox = document.createElement(\"input\");\r\n const selectedFolders = JSON.parse(pathInput.value);\r\n checkbox.type = \"checkbox\";\r\n checkbox.value = dir.path;\r\n listItemInner.appendChild(checkbox);\r\n checkbox.addEventListener(\"change\", handleDirectoryCheck);\r\n\r\n if ( Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)) {\r\n checkbox.checked = true;\r\n }\r\n }\r\n\r\n const label = document.createElement(\"label\");\r\n label.textContent = dir.name;\r\n\r\n listItemInner.appendChild(label);\r\n listItem.appendChild(listItemInner);\r\n \r\n if (parentDir) {\r\n parentDir.appendChild(listItem);\r\n }\r\n else if (dir.parent) {\r\n const parentElement = dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n if (parentElement) {\r\n parentElement.appendChild(listItem);\r\n } else {\r\n dirContainer.appendChild(listItem);\r\n }\r\n } else {\r\n dirContainer.appendChild(listItem);\r\n }\r\n\r\n label.addEventListener(\"click\", handleDirectoryClick);\r\n });\r\n\r\n dirContainer.classList.add(\"loaded\");\r\n }\r\n\r\n const 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\")) {\r\n return;\r\n }\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 Squeze.getDirectories(currentPath);\r\n\r\n renderDirectories(subDirs, currentDir);\r\n\r\n currentDir.classList.remove(\"loading\");\r\n currentDir.classList.add(\"loaded\");\r\n currentDir.classList.add(\"opened\");\r\n }\r\n\r\n const handleDirectoryCheck = (event) => {\r\n savePathBtn.disabled = !dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n }\r\n\r\n const handleClosePathDialog = (event) => {\r\n if (!event.target.contains(pathDialog)) return;\r\n pathDialog.close();\r\n }\r\n\r\n const populatePathInput = () => {\r\n const path = pathInput.value;\r\n if (!path) {\r\n return;\r\n }\r\n\r\n const pathList = document.querySelector(\".squeeze-path-list\");\r\n\r\n try {\r\n const selectedFolders = JSON.parse(path);\r\n const inputs = pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n inputs.forEach(input => input.remove());\r\n\r\n selectedFolders.forEach((folder) => {\r\n const input = document.createElement(\"input\");\r\n input.type = \"text\";\r\n input.value = folder;\r\n input.classList.add(\"squeeze-path-list__item\");\r\n pathList.appendChild(input);\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 }\r\n\r\n const handleBulkPause = (data, currentPage) => {\r\n window.onbeforeunload = null;\r\n logMsg(__('Bulk squeezing has been paused!', 'squeeze'), {isPause: true})\r\n cachedMediaData['mediaIDs'] = data;\r\n cachedMediaData['page'] = currentPage;\r\n cachedMediaData['target'].disabled = false;\r\n updateButtonText(cachedMediaData['target'], __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n }\r\n\r\n\r\n const handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n\r\n const isPaused = event.target.dataset.running === 'true' ? true : false;\r\n\r\n if (isPaused) {\r\n event.target.dataset.running = 'false';\r\n updateButtonText(event.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n } else {\r\n event.target.dataset.running = 'true';\r\n updateButtonText(event.target, __('Pause bulk squeezing', 'squeeze'), '#pause-button-icon');\r\n }\r\n\r\n cachedMediaData['isPaused'] = isPaused;\r\n cachedMediaData['process'] = process;\r\n cachedMediaData['mediaIDs'] = mediaIDs;\r\n cachedMediaData['page'] = page;\r\n 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\n const 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\n const 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 = {\r\n attributes: data\r\n }\r\n\r\n try {\r\n const compressData = await Squeze.handleCompress(attachment)\r\n const response = await Squeze.handleUpload({ attachment: attachment, base64: compressData })\r\n\r\n //console.log(response, 'response');\r\n\r\n squeezeStatus.innerHTML = response.data;\r\n\r\n if (event.target.closest(\"td\").classList.contains(\"field\")) { // grid mode\r\n const td = document.createElement(\"td\");\r\n td.classList.add(\"field\");\r\n td.style.width = \"100%\";\r\n td.appendChild(event.target.closest(\"td\").querySelector(\".squeeze_status .squeeze-comparison-table\"));\r\n event.target.closest(\"tr\").appendChild(td);\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error;\r\n } finally {\r\n 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; //__('An error has occured. Check the console for details.', 'squeeze');\r\n event.target.remove();\r\n }\r\n\r\n }\r\n\r\n // Handle restore button click\r\n const 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 Squeze.handleRestore(attachmentID);\r\n //console.log(response, 'response');\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = response.data; //__('Restored successfully', 'squeeze')\r\n } catch (error) {\r\n console.error(error);\r\n event.target.closest(\"td\").querySelector(\".squeeze_status\").innerHTML = error; //__('An error has occured. Check the console for details.', 'squeeze');\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\n /**\r\n * Handle single buttons click\r\n */\r\n const 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 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 disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = handleOnLeave;\r\n handleRestoreBtnClick(event)\r\n }\r\n\r\n }\r\n\r\n const handleRecursiveUpload = async (path, data, currentPage) => {\r\n if (data === undefined) { // when bulk directory path has no images\r\n return { success: false, data: 'No data provided!', mediaIDs: [] };\r\n }\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 (cachedMediaData['isPaused']) {\r\n handleBulkPause(data, currentPage);\r\n\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\r\n const mediaLogWrapper = logMsg(`${__('Start squeezing...', 'squeeze')}`, {title: filename, isStart: true})\r\n\r\n try {\r\n const response = await Squeze.handleBulkUpload(path, data);\r\n logMsg(`${response.data}`, {mediaLogWrapper: mediaLogWrapper, iconId: response.success ? 'check-mark-circle-icon' : 'ban-sign-icon'})\r\n\r\n if (cachedMediaData['isPaused']) {\r\n handleBulkPause(data, currentPage);\r\n \r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n const squeezeStatusElement = 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);\r\n } else {\r\n currentPage++;\r\n\r\n if (currentPage > totalPages) {\r\n return response;\r\n }\r\n\r\n const maybeGetNextMediaIDs = await Squeze.getNextAttachments(currentPage, path);\r\n\r\n if (maybeGetNextMediaIDs.success) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage);\r\n }\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n console.error(error);\r\n logMsg(`${error}`, {mediaLogWrapper: mediaLogWrapper, iconId: 'ban-sign-icon'})\r\n\r\n if (data.length > 0) {\r\n return handleRecursiveUpload(path, data, currentPage); \r\n } else {\r\n currentPage++;\r\n\r\n if (currentPage > totalPages) {\r\n return { success: false, data: error, mediaIDs: [] };\r\n }\r\n\r\n const maybeGetNextMediaIDs = await Squeze.getNextAttachments(currentPage, path);\r\n\r\n if (maybeGetNextMediaIDs.success) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage);\r\n }\r\n \r\n }\r\n }\r\n\r\n }\r\n\r\n document.addEventListener(\"click\", (event) => {\r\n handleButtonsClick(event)\r\n })\r\n\r\n /**\r\n * Handle bulk button click\r\n */\r\n bulkBtn?.addEventListener(\"click\", async (event) => {\r\n let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n let currentPage = cachedMediaData['page'] ?? 1;\r\n\r\n if (uncompressedIDs.length === 0) {\r\n return;\r\n }\r\n\r\n disableBulkButtons()\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (cachedMediaData['process'] === 'uncompressed') {\r\n if (cachedMediaData['mediaIDs'].length > 0) {\r\n uncompressedIDs = cachedMediaData['mediaIDs'];\r\n }\r\n if (cachedMediaData['page']) {\r\n currentPage = cachedMediaData['page'];\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, 'uncompressed', uncompressedIDs, currentPage);\r\n\r\n if (isPaused) {\r\n 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('uncompressed', uncompressedIDs, currentPage);\r\n\r\n //console.log(finalResponse, 'finalResponse');\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 restoreBulkButtons()\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n 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 /**\r\n * Handle bulk again button click\r\n */\r\n bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n let currentPage = cachedMediaData['page'] ?? 1;\r\n\r\n if (allIDs.length === 0) {\r\n return;\r\n }\r\n\r\n disableBulkButtons()\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (cachedMediaData['process'] === 'all') {\r\n if (cachedMediaData['mediaIDs'].length > 0) {\r\n allIDs = cachedMediaData['mediaIDs'];\r\n }\r\n if (cachedMediaData['page']) {\r\n currentPage = cachedMediaData['page'];\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, 'all', allIDs, currentPage);\r\n\r\n if (isPaused) {\r\n 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('all', allIDs, currentPage);\r\n\r\n //console.log('finalResponse:', finalResponse);\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.reload();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n 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 /**\r\n * Handle bulk path button click\r\n */\r\n bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n const path = 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 disableBulkButtons()\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (cachedMediaData['process'] === 'path' && cachedMediaData['mediaIDs'].length > 0) {\r\n bulkPathData = cachedMediaData['mediaIDs'];\r\n } else {\r\n const pathData = await Squeze.getAttachmentsByPath(path)\r\n\r\n //console.log(pathData, 'pathData')\r\n\r\n if (pathData.success) {\r\n const responseData = pathData.data;\r\n bulkPathData = responseData;\r\n } else {\r\n console.error(pathData.data)\r\n logMsg(pathData.data)\r\n //logMsg(pathData.data, {mediaLogWrapper: mediaLogWrapper, iconId: 'ban-sign-icon'})\r\n restoreBulkButtons()\r\n window.onbeforeunload = null;\r\n }\r\n\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n //console.log(isPaused, 'isPaused');\r\n\r\n if (isPaused) {\r\n 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\r\n const finalResponse = await handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n //console.log(finalResponse, 'finalResponse');\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 restoreBulkButtons()\r\n }\r\n }\r\n\r\n } catch (error) {\r\n console.error(error);\r\n 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\r\n selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n selectPathBtn.disabled = true;\r\n pathDialog.showModal();\r\n if (dirContainer.classList.contains(\"loaded\")) {\r\n const selectedFolders = JSON.parse(pathInput.value);\r\n\r\n if ( Array.isArray(selectedFolders)) {\r\n selectedFolders.forEach((folder) => {\r\n const checkbox = dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n }\r\n });\r\n }\r\n \r\n selectPathBtn.disabled = false;\r\n return;\r\n }\r\n const folders = await Squeze.getDirectories();\r\n renderDirectories(folders);\r\n selectPathBtn.disabled = false;\r\n })\r\n\r\n savePathBtn?.addEventListener(\"click\", () => {\r\n const checkboxes = 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 pathInput.value = JSON.stringify(selectedFolders);\r\n populatePathInput();\r\n pathDialog.close();\r\n });\r\n\r\n closePathDialogBtn?.addEventListener(\"click\", () => {\r\n pathDialog.close();\r\n });\r\n\r\n document.addEventListener('click', handleClosePathDialog);\r\n\r\n postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n const dataAction = 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) {\r\n return;\r\n }\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n uncompressedIDs.forEach((id) => {\r\n postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n btn.disabled = true;\r\n })\r\n const squeezeStatusElement = 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 //console.log(finalResponse, 'finalResponse');\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n window.onbeforeunload = null;\r\n postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n 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 const 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 if (isImage && isAutoCompress) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\n jQuery.extend(wp?.Uploader?.prototype, {\r\n success: async (attachment) => {\r\n //console.log(attachment, 'success');\r\n\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 Squeze.handleCompress(attachment)\r\n const uploadData = await Squeze.handleUpload({ attachment: 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\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\n const handleMultiFileFormUpload = () => {\r\n if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') {\r\n return;\r\n }\r\n\r\n const SqueezeUploader = uploader;\r\n\r\n SqueezeUploader.bind('FilesAdded', function (up, files) {\r\n //console.log(files);\r\n });\r\n\r\n SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n //console.log('FileUploaded', file);\r\n //console.log('response', response);\r\n\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)) {\r\n return;\r\n }\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, reject) => {\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\r\n const attachment = {\r\n attributes: data\r\n }\r\n\r\n try { \r\n const compressData = await Squeze.handleCompress(attachment)\r\n const uploadData = await Squeze.handleUpload({ attachment: 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)\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; //__('An error has occured. Check the console for details.', 'squeeze');\r\n window.onbeforeunload = null;\r\n mediaItem.querySelector('.progress')?.remove();\r\n }\r\n\r\n });\r\n\r\n } catch (error) {\r\n console.error(error);\r\n mediaItem.innerHTML += error; //__('An error has occured. Check the console for details.', 'squeeze');\r\n window.onbeforeunload = null;\r\n mediaItem.querySelector('.progress')?.remove();\r\n }\r\n\r\n });\r\n\r\n });\r\n\r\n SqueezeUploader.bind('UploadComplete', function (up, files) {\r\n //console.log('UploadComplete', files);\r\n });\r\n }\r\n\r\n document.onreadystatechange = function () { // equivalent to jQuery $(document).ready()\r\n if (document.readyState === \"complete\") {\r\n handleMultiFileFormUpload();\r\n }\r\n }\r\n\r\n\r\n})();\n\n//# sourceURL=webpack:///./assets/js/script.js?");
20
21 /***/ }),
22
23 /***/ "./assets/js/squeeze.js":
24 /*!******************************!*\
25 !*** ./assets/js/squeeze.js ***!
26 \******************************/
27 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
28
29 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\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 };\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 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 uploadResponse['mediaIDs'] = mediaIDs;\r\n }\r\n\r\n return uploadResponse;\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 }\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}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?");
30
31 /***/ })
32
33 /******/ });
34 /************************************************************************/
35 /******/ // The module cache
36 /******/ var __webpack_module_cache__ = {};
37 /******/
38 /******/ // The require function
39 /******/ function __webpack_require__(moduleId) {
40 /******/ // Check if module is in cache
41 /******/ var cachedModule = __webpack_module_cache__[moduleId];
42 /******/ if (cachedModule !== undefined) {
43 /******/ return cachedModule.exports;
44 /******/ }
45 /******/ // Create a new module (and put it into the cache)
46 /******/ var module = __webpack_module_cache__[moduleId] = {
47 /******/ // no module.id needed
48 /******/ // no module.loaded needed
49 /******/ exports: {}
50 /******/ };
51 /******/
52 /******/ // Execute the module function
53 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
54 /******/
55 /******/ // Return the exports of the module
56 /******/ return module.exports;
57 /******/ }
58 /******/
59 /******/ // expose the modules object (__webpack_modules__)
60 /******/ __webpack_require__.m = __webpack_modules__;
61 /******/
62 /************************************************************************/
63 /******/ /* webpack/runtime/define property getters */
64 /******/ (() => {
65 /******/ // define getter functions for harmony exports
66 /******/ __webpack_require__.d = (exports, definition) => {
67 /******/ for(var key in definition) {
68 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
69 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
70 /******/ }
71 /******/ }
72 /******/ };
73 /******/ })();
74 /******/
75 /******/ /* webpack/runtime/get javascript chunk filename */
76 /******/ (() => {
77 /******/ // This function allow to reference async chunks
78 /******/ __webpack_require__.u = (chunkId) => {
79 /******/ // return url for filenames based on template
80 /******/ return "" + chunkId + ".script.bundle.js";
81 /******/ };
82 /******/ })();
83 /******/
84 /******/ /* webpack/runtime/global */
85 /******/ (() => {
86 /******/ __webpack_require__.g = (function() {
87 /******/ if (typeof globalThis === 'object') return globalThis;
88 /******/ try {
89 /******/ return this || new Function('return this')();
90 /******/ } catch (e) {
91 /******/ if (typeof window === 'object') return window;
92 /******/ }
93 /******/ })();
94 /******/ })();
95 /******/
96 /******/ /* webpack/runtime/hasOwnProperty shorthand */
97 /******/ (() => {
98 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
99 /******/ })();
100 /******/
101 /******/ /* webpack/runtime/make namespace object */
102 /******/ (() => {
103 /******/ // define __esModule on exports
104 /******/ __webpack_require__.r = (exports) => {
105 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
106 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
107 /******/ }
108 /******/ Object.defineProperty(exports, '__esModule', { value: true });
109 /******/ };
110 /******/ })();
111 /******/
112 /******/ /* webpack/runtime/publicPath */
113 /******/ (() => {
114 /******/ var scriptUrl;
115 /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
116 /******/ var document = __webpack_require__.g.document;
117 /******/ if (!scriptUrl && document) {
118 /******/ if (document.currentScript)
119 /******/ scriptUrl = document.currentScript.src;
120 /******/ if (!scriptUrl) {
121 /******/ var scripts = document.getElementsByTagName("script");
122 /******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src
123 /******/ }
124 /******/ }
125 /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
126 /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
127 /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
128 /******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
129 /******/ __webpack_require__.p = scriptUrl;
130 /******/ })();
131 /******/
132 /******/ /* webpack/runtime/jsonp chunk loading */
133 /******/ (() => {
134 /******/ __webpack_require__.b = document.baseURI || self.location.href;
135 /******/
136 /******/ // object to store loaded and loading chunks
137 /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
138 /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
139 /******/ var installedChunks = {
140 /******/ "main": 0
141 /******/ };
142 /******/
143 /******/ // no chunk on demand loading
144 /******/
145 /******/ // no prefetching
146 /******/
147 /******/ // no preloaded
148 /******/
149 /******/ // no HMR
150 /******/
151 /******/ // no HMR manifest
152 /******/
153 /******/ // no on chunks loaded
154 /******/
155 /******/ // no jsonp function
156 /******/ })();
157 /******/
158 /************************************************************************/
159 /******/
160 /******/ // startup
161 /******/ // Load entry module and return exports
162 /******/ // This entry module can't be inlined because the eval devtool is used.
163 /******/ var __webpack_exports__ = __webpack_require__("./assets/js/script.js");
164 /******/
165 /******/ })()
166 ;