| 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 |
; |