cloudcmd 19.20.6 → 19.20.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sw.js CHANGED
@@ -302,7 +302,7 @@ const respondWith = currify((f, e) => {
302
302
  e.respondWith(f(e));
303
303
  });
304
304
  const getPathName = url => new URL(url).pathname;
305
- const date = "Tue Sep 15 2026 13:51:09 GMT+0300 (Eastern European Summer Time)";
305
+ const date = "Wed Sep 16 2026 22:04:30 GMT+0300 (Eastern European Summer Time)";
306
306
  const NAME = `cloudcmd: ${date}`;
307
307
  const createRequest = a => new Request(a, {
308
308
  credentials: 'same-origin'
@@ -1070,7 +1070,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
1070
1070
  \***************************/
1071
1071
  (__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
1072
1072
  "use strict";
1073
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n getSelectedFiles: () => (getSelectedFiles),\n isSelected: () => (isSelected),\n selectAllFiles: () => (selectAllFiles),\n selectFile: () => (selectFile),\n toggleAllSelectedFiles: () => (toggleAllSelectedFiles),\n toggleSelectedFile: () => (toggleSelectedFile),\n unselectFile: () => (unselectFile)\n});\n/* global DOM */ const SELECTED_FILE = 'selected-file';\nconst Cmd = {\n getSelectedFiles,\n isSelected,\n unselectFile,\n selectFile,\n selectAllFiles,\n toggleSelectedFile,\n toggleAllSelectedFiles\n};\n/**\n * selected file check\n *\n * @param currentFile\n */ function isSelected(currentFile) {\n if (!currentFile) return false;\n return DOM.isContainClass(currentFile, SELECTED_FILE);\n}\n/**\n * select current file\n * @param currentFile\n */ function selectFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n current.classList.add(SELECTED_FILE);\n return Cmd;\n}\nfunction unselectFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n current.classList.remove(SELECTED_FILE);\n return Cmd;\n}\nfunction toggleSelectedFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n const name = DOM.getCurrentName(current);\n if (name === '..') return Cmd;\n current.classList.toggle(SELECTED_FILE);\n return Cmd;\n}\nfunction toggleAllSelectedFiles() {\n DOM.getAllFiles().map(DOM.toggleSelectedFile);\n return Cmd;\n}\nfunction selectAllFiles() {\n DOM.getAllFiles().map(DOM.selectFile);\n return Cmd;\n}\n/**\n * unified way to get selected files\n *\n * @currentFile\n */ function getSelectedFiles() {\n const panel = DOM.getPanel();\n const selected = DOM.getByClassAll(SELECTED_FILE, panel);\n return Array.from(selected);\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/dom/cmd.js\n}");
1073
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n getSelectedFiles: () => (getSelectedFiles),\n isSelected: () => (isSelected),\n selectAllFiles: () => (selectAllFiles),\n selectFile: () => (selectFile),\n toggleAllSelectedFiles: () => (toggleAllSelectedFiles),\n toggleSelectedFile: () => (toggleSelectedFile),\n unselectFile: () => (unselectFile)\n});\n/* global DOM */ const SELECTED_FILE = 'selected-file';\n/**\n * selected file check\n *\n * @param currentFile\n */ function isSelected(currentFile) {\n if (!currentFile) return false;\n return DOM.isContainClass(currentFile, SELECTED_FILE);\n}\n/**\n * select current file\n * @param currentFile\n */ function selectFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n current.classList.add(SELECTED_FILE);\n return DOM;\n}\nfunction unselectFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n current.classList.remove(SELECTED_FILE);\n return DOM;\n}\nfunction toggleSelectedFile(currentFile) {\n const current = currentFile || DOM.getCurrentFile();\n const name = DOM.getCurrentName(current);\n if (name === '..') return DOM;\n current.classList.toggle(SELECTED_FILE);\n return DOM;\n}\nfunction toggleAllSelectedFiles() {\n DOM.getAllFiles().map(DOM.toggleSelectedFile);\n return DOM;\n}\nfunction selectAllFiles() {\n DOM.getAllFiles().map(DOM.selectFile);\n return DOM;\n}\n/**\n * unified way to get selected files\n *\n * @currentFile\n */ function getSelectedFiles() {\n const panel = DOM.getPanel();\n const selected = DOM.getByClassAll(SELECTED_FILE, panel);\n return Array.from(selected);\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/dom/cmd.js\n}");
1074
1074
 
1075
1075
  },
1076
1076
  "./client/dom/current-file.js"
@@ -1259,7 +1259,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
1259
1259
  \*****************************/
1260
1260
  (__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
1261
1261
  "use strict";
1262
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n Key: () => (Key),\n _listener: () => (_listener)\n});\n/* import */ var _cloudcmd_clipboard__rspack_import_0 = __webpack_require__(/*! @cloudcmd/clipboard */ \"./node_modules/@cloudcmd/clipboard/lib/clipboard.js\");\n/* import */ var fullstore__rspack_import_1 = __webpack_require__(/*! fullstore */ \"./node_modules/fullstore/lib/fullstore.js\");\n/* import */ var _dom_events__rspack_import_2 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _dom_buffer_js__rspack_import_3 = __webpack_require__(/*! ../dom/buffer.js */ \"./client/dom/buffer.js\");\n/* import */ var _key_js__rspack_import_4 = __webpack_require__(/*! ./key.js */ \"./client/key/key.js\");\n/* import */ var _vim_index_js__rspack_import_5 = __webpack_require__(/*! ./vim/index.js */ \"./client/key/vim/index.js\");\n/* import */ var _set_current_by_char_js__rspack_import_6 = __webpack_require__(/*! ./set-current-by-char.js */ \"./client/key/set-current-by-char.js\");\n/* import */ var _binder_js__rspack_import_7 = __webpack_require__(/*! ./binder.js */ \"./client/key/binder.js\");\n/* global CloudCmd, DOM */ \n\n\n\n\n\n\n\nconst Chars = (0,fullstore__rspack_import_1.fullstore)();\nconst toggleVim = (keyCode, overrides = {})=>{\n const { _config, config } = overrides;\n if (!config('vim') && keyCode === _key_js__rspack_import_4.ESC) _config('vim', true);\n};\nconst isUndefined = (a)=>typeof a === 'undefined';\nChars([]);\nconst { assign } = Object;\nconst binder = (0,_binder_js__rspack_import_7.createBinder)();\nconst bind = ()=>{\n _dom_events__rspack_import_2.addKey(listener, true);\n binder.setBind();\n};\nconst Key = assign(binder, _key_js__rspack_import_4, {\n bind\n});\nconst _listener = listener;\nfunction getChar(event) {\n /*\n * event.keyIdentifier deprecated in chrome v51\n * but event.key is absent in chrome <= v51\n */ const { key, shift, keyCode, keyIdentifier } = event;\n const char = key || fromCharCode(keyIdentifier);\n const symbol = getSymbol(shift, keyCode);\n return [\n symbol,\n char\n ];\n}\nasync function listener(event, overrides = {}) {\n const { config = CloudCmd.config, _config = CloudCmd._config, switchKey = _switchKey, vim = _vim_index_js__rspack_import_5[\"default\"] } = overrides;\n const { keyCode } = event;\n // strange chrome bug calls listener twice\n // in second time event misses a lot fields\n if (isUndefined(event.altKey)) return;\n const alt = event.altKey;\n const ctrl = event.ctrlKey;\n const meta = event.metaKey;\n const isBetween = keyCode >= _key_js__rspack_import_4.ZERO && keyCode <= _key_js__rspack_import_4.Z;\n const isNumpad = /Numpad/.test(event.code);\n const [symbol, char] = getChar(event);\n if (!binder.isBind()) return;\n toggleVim(keyCode, {\n config,\n _config\n });\n const isVim = config('vim');\n if (!isVim && !isNumpad && !alt && !ctrl && !meta && (isBetween || symbol)) return (0,_set_current_by_char_js__rspack_import_6[\"default\"])(char, Chars);\n Chars([]);\n await switchKey(event);\n if (keyCode >= _key_js__rspack_import_4.F1 && keyCode <= _key_js__rspack_import_4.F10) return;\n if (isVim) vim(char, event);\n}\nfunction getSymbol(shift, keyCode) {\n if (keyCode === _key_js__rspack_import_4.DOT) return '.';\n if (keyCode === _key_js__rspack_import_4.HYPHEN) return shift ? '_' : '-';\n if (keyCode === _key_js__rspack_import_4.EQUAL) return shift ? '+' : '=';\n return '';\n}\nfunction fromCharCode(keyIdentifier) {\n const code = keyIdentifier.substring(2);\n const hex = parseInt(code, 16);\n return String.fromCharCode(hex);\n}\nasync function _switchKey(event) {\n const Info = DOM.CurrentInfo;\n let i;\n let isSelected;\n let prev;\n let next;\n let current = Info.element;\n let dataName;\n const { name, panel, path, isDir } = Info;\n const { Operation, changeDir, config } = CloudCmd;\n const { keyCode } = event;\n const alt = event.altKey;\n const shift = event.shiftKey;\n const ctrl = event.ctrlKey;\n const meta = event.metaKey;\n const ctrlMeta = ctrl || meta;\n if (current) {\n prev = current.previousSibling;\n next = current.nextSibling;\n }\n switch(keyCode){\n case _key_js__rspack_import_4.TAB:\n DOM.changePanel();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.INSERT:\n DOM.toggleSelectedFile(current).setCurrentFile(next);\n break;\n case _key_js__rspack_import_4.INSERT_MAC:\n DOM.toggleSelectedFile(current).setCurrentFile(next);\n break;\n case _key_js__rspack_import_4.DELETE:\n if (shift) Operation.show('delete:silent');\n else Operation.show('delete');\n break;\n case _key_js__rspack_import_4.ASTERISK:\n DOM.toggleAllSelectedFiles(current);\n break;\n case _key_js__rspack_import_4.PLUS:\n DOM.expandSelection();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.MINUS:\n DOM.shrinkSelection();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F1:\n CloudCmd.Help.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F2:\n CloudCmd.UserMenu.show();\n break;\n case _key_js__rspack_import_4.F3:\n event.preventDefault();\n if (Info.isDir) await changeDir(path);\n else if (shift) CloudCmd.View.show(null, {\n raw: true\n });\n else if (ctrlMeta) CloudCmd.sortPanel('name');\n else CloudCmd.View.show();\n break;\n case _key_js__rspack_import_4.F4:\n if (config('vim')) CloudCmd.EditFileVim.show();\n else CloudCmd.EditFile.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F5:\n if (ctrlMeta) CloudCmd.sortPanel('date');\n else if (alt) Operation.show('pack');\n else Operation.show('copy');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F6:\n if (ctrlMeta) CloudCmd.sortPanel('size');\n else if (shift) DOM.renameCurrent(current);\n else Operation.show('move');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F7:\n if (shift) DOM.promptNewFile();\n else DOM.promptNewDir();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F8:\n Operation.show('delete');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F9:\n if (alt) Operation.show('extract');\n else CloudCmd.Menu.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F10:\n CloudCmd.Config.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.TRA:\n event.preventDefault();\n if (shift) return CloudCmd.Terminal.show();\n CloudCmd.Konsole.show();\n break;\n case _key_js__rspack_import_4.BRACKET_CLOSE:\n CloudCmd.Konsole.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.SPACE:\n event.preventDefault();\n if (!isDir || name === '..') isSelected = true;\n else isSelected = DOM.isSelected(current);\n if (!isSelected) await DOM.loadCurrentSize(current);\n DOM.toggleSelectedFile(current);\n break;\n case _key_js__rspack_import_4.U:\n if (ctrlMeta) {\n DOM.swapPanels();\n event.preventDefault();\n }\n break;\n /* navigation on file table: *\n * in case of pressing button 'up', *\n * select previous row */ case _key_js__rspack_import_4.UP:\n if (shift) DOM.toggleSelectedFile(current);\n DOM.setCurrentFile(prev);\n event.preventDefault();\n break;\n /* in case of pressing button 'down', *\n * select next row */ case _key_js__rspack_import_4.DOWN:\n if (shift) DOM.toggleSelectedFile(current);\n DOM.setCurrentFile(next);\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.LEFT:\n if (!alt) return;\n event.preventDefault();\n dataName = Info.panel.getAttribute('data-name');\n if (dataName === 'js-right') DOM.duplicatePanel();\n break;\n case _key_js__rspack_import_4.RIGHT:\n if (!alt) return;\n event.preventDefault();\n dataName = Info.panel.getAttribute('data-name');\n if (dataName === 'js-left') DOM.duplicatePanel();\n break;\n /* in case of pressing button 'Home', *\n * go to top element */ case _key_js__rspack_import_4.HOME:\n DOM.setCurrentFile(Info.first);\n event.preventDefault();\n break;\n /* in case of pressing button 'End', select last element */ case _key_js__rspack_import_4.END:\n DOM.setCurrentFile(Info.last);\n event.preventDefault();\n break;\n /* если нажали клавишу page down проматываем экран */ case _key_js__rspack_import_4.PAGE_DOWN:\n DOM.scrollByPages(panel, 1);\n for(i = 0; i < 30; i++){\n if (!current.nextSibling) break;\n current = current.nextSibling;\n }\n DOM.setCurrentFile(current);\n event.preventDefault();\n break;\n /* если нажали клавишу page up проматываем экран */ case _key_js__rspack_import_4.PAGE_UP:\n DOM.scrollByPages(panel, -1);\n for(i = 0; i < 30; i++){\n if (!current.previousSibling) break;\n current = current.previousSibling;\n }\n DOM.setCurrentFile(current);\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.ENTER:\n if (Info.isDir) await changeDir(path);\n else CloudCmd.View.show();\n break;\n case _key_js__rspack_import_4.BACKSPACE:\n CloudCmd.goToParentDir();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.BACKSLASH:\n if (ctrlMeta) await changeDir('/');\n break;\n case _key_js__rspack_import_4.A:\n if (ctrlMeta) {\n DOM.selectAllFiles();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.G:\n if (alt) {\n DOM.goToDirectory();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.L:\n if (ctrlMeta && shift) {\n CloudCmd.logOut();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.M:\n if (ctrlMeta) {\n if (config('vim')) CloudCmd.EditNamesVim.show();\n else CloudCmd.EditNames.show();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.P:\n if (!ctrlMeta) return;\n event.preventDefault();\n _cloudcmd_clipboard__rspack_import_0.writeText(Info.dirPath).catch(CloudCmd.log);\n break;\n /**\n * обновляем страницу,\n * загружаем содержимое каталога\n * при этом данные берём всегда с\n * сервера, а не из кэша\n * (обновляем кэш)\n */ case _key_js__rspack_import_4.R:\n if (ctrlMeta) {\n CloudCmd.log('reloading page...\\n');\n CloudCmd.refresh();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.C:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.copy();\n break;\n case _key_js__rspack_import_4.X:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.cut();\n break;\n case _key_js__rspack_import_4.V:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.paste();\n break;\n case _key_js__rspack_import_4.Z:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.clear();\n break;\n case _key_js__rspack_import_4.COLON:\n CloudCmd.CommandLine.show();\n event.preventDefault();\n break;\n /* чистим хранилище */ case _key_js__rspack_import_4.D:\n if (ctrlMeta) {\n CloudCmd.log('clearing storage...');\n await DOM.Storage.clear();\n CloudCmd.log('storage cleared');\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.DOT:\n if (meta && shift) {\n const showDotFiles = !CloudCmd.config('showDotFiles');\n CloudCmd._config('showDotFiles', showDotFiles);\n CloudCmd.refresh();\n await DOM.RESTful.Config.write({\n showDotFiles\n });\n }\n break;\n }\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/key/index.js\n}");
1262
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n Key: () => (Key),\n _listener: () => (_listener),\n _switchKey: () => (_switchKey)\n});\n/* import */ var _cloudcmd_clipboard__rspack_import_0 = __webpack_require__(/*! @cloudcmd/clipboard */ \"./node_modules/@cloudcmd/clipboard/lib/clipboard.js\");\n/* import */ var fullstore__rspack_import_1 = __webpack_require__(/*! fullstore */ \"./node_modules/fullstore/lib/fullstore.js\");\n/* import */ var _dom_events__rspack_import_2 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _dom_buffer_js__rspack_import_3 = __webpack_require__(/*! ../dom/buffer.js */ \"./client/dom/buffer.js\");\n/* import */ var _key_js__rspack_import_4 = __webpack_require__(/*! ./key.js */ \"./client/key/key.js\");\n/* import */ var _vim_index_js__rspack_import_5 = __webpack_require__(/*! ./vim/index.js */ \"./client/key/vim/index.js\");\n/* import */ var _set_current_by_char_js__rspack_import_6 = __webpack_require__(/*! ./set-current-by-char.js */ \"./client/key/set-current-by-char.js\");\n/* import */ var _binder_js__rspack_import_7 = __webpack_require__(/*! ./binder.js */ \"./client/key/binder.js\");\n/* global CloudCmd, DOM */ \n\n\n\n\n\n\n\nconst Chars = (0,fullstore__rspack_import_1.fullstore)();\nconst toggleVim = (keyCode, overrides = {})=>{\n const { _config, config } = overrides;\n if (!config('vim') && keyCode === _key_js__rspack_import_4.ESC) _config('vim', true);\n};\nconst isUndefined = (a)=>typeof a === 'undefined';\nChars([]);\nconst { assign } = Object;\nconst binder = (0,_binder_js__rspack_import_7.createBinder)();\nconst bind = ()=>{\n _dom_events__rspack_import_2.addKey(listener, true);\n binder.setBind();\n};\nconst Key = assign(binder, _key_js__rspack_import_4, {\n bind\n});\nconst _listener = listener;\nfunction getChar(event) {\n /*\n * event.keyIdentifier deprecated in chrome v51\n * but event.key is absent in chrome <= v51\n */ const { key, shift, keyCode, keyIdentifier } = event;\n const char = key || fromCharCode(keyIdentifier);\n const symbol = getSymbol(shift, keyCode);\n return [\n symbol,\n char\n ];\n}\nasync function listener(event, overrides = {}) {\n const { config = CloudCmd.config, _config = CloudCmd._config, switchKey = _switchKey, vim = _vim_index_js__rspack_import_5[\"default\"] } = overrides;\n const { keyCode } = event;\n // strange chrome bug calls listener twice\n // in second time event misses a lot fields\n if (isUndefined(event.altKey)) return;\n const alt = event.altKey;\n const ctrl = event.ctrlKey;\n const meta = event.metaKey;\n const isBetween = keyCode >= _key_js__rspack_import_4.ZERO && keyCode <= _key_js__rspack_import_4.Z;\n const isNumpad = /Numpad/.test(event.code);\n const [symbol, char] = getChar(event);\n if (!binder.isBind()) return;\n toggleVim(keyCode, {\n config,\n _config\n });\n const isVim = config('vim');\n if (!isVim && !isNumpad && !alt && !ctrl && !meta && (isBetween || symbol)) return (0,_set_current_by_char_js__rspack_import_6[\"default\"])(char, Chars);\n Chars([]);\n await switchKey(event);\n if (keyCode >= _key_js__rspack_import_4.F1 && keyCode <= _key_js__rspack_import_4.F10) return;\n if (isVim) vim(char, event);\n}\nfunction getSymbol(shift, keyCode) {\n if (keyCode === _key_js__rspack_import_4.DOT) return '.';\n if (keyCode === _key_js__rspack_import_4.HYPHEN) return shift ? '_' : '-';\n if (keyCode === _key_js__rspack_import_4.EQUAL) return shift ? '+' : '=';\n return '';\n}\nfunction fromCharCode(keyIdentifier) {\n const code = keyIdentifier.substring(2);\n const hex = parseInt(code, 16);\n return String.fromCharCode(hex);\n}\nasync function _switchKey(event) {\n const Info = DOM.CurrentInfo;\n let i;\n let isSelected;\n let prev;\n let next;\n let current = Info.element;\n let dataName;\n const { name, panel, path, isDir } = Info;\n const { Operation, changeDir, config } = CloudCmd;\n const { keyCode } = event;\n const alt = event.altKey;\n const shift = event.shiftKey;\n const ctrl = event.ctrlKey;\n const meta = event.metaKey;\n const ctrlMeta = ctrl || meta;\n if (current) {\n prev = current.previousSibling;\n next = current.nextSibling;\n }\n switch(keyCode){\n case _key_js__rspack_import_4.TAB:\n DOM.changePanel();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.INSERT:\n DOM.toggleSelectedFile(current).setCurrentFile(next);\n break;\n case _key_js__rspack_import_4.INSERT_MAC:\n DOM.toggleSelectedFile(current).setCurrentFile(next);\n break;\n case _key_js__rspack_import_4.DELETE:\n if (shift) Operation.show('delete:silent');\n else Operation.show('delete');\n break;\n case _key_js__rspack_import_4.ASTERISK:\n DOM.toggleAllSelectedFiles(current);\n break;\n case _key_js__rspack_import_4.PLUS:\n DOM.expandSelection();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.MINUS:\n DOM.shrinkSelection();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F1:\n CloudCmd.Help.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F2:\n CloudCmd.UserMenu.show();\n break;\n case _key_js__rspack_import_4.F3:\n event.preventDefault();\n if (Info.isDir) await changeDir(path);\n else if (shift) CloudCmd.View.show(null, {\n raw: true\n });\n else if (ctrlMeta) CloudCmd.sortPanel('name');\n else CloudCmd.View.show();\n break;\n case _key_js__rspack_import_4.F4:\n if (config('vim')) CloudCmd.EditFileVim.show();\n else CloudCmd.EditFile.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F5:\n if (ctrlMeta) CloudCmd.sortPanel('date');\n else if (alt) Operation.show('pack');\n else Operation.show('copy');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F6:\n if (ctrlMeta) CloudCmd.sortPanel('size');\n else if (shift) DOM.renameCurrent(current);\n else Operation.show('move');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F7:\n if (shift) DOM.promptNewFile();\n else DOM.promptNewDir();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F8:\n Operation.show('delete');\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F9:\n if (alt) Operation.show('extract');\n else CloudCmd.Menu.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.F10:\n CloudCmd.Config.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.TRA:\n event.preventDefault();\n if (shift) return CloudCmd.Terminal.show();\n CloudCmd.Konsole.show();\n break;\n case _key_js__rspack_import_4.BRACKET_CLOSE:\n CloudCmd.Konsole.show();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.SPACE:\n event.preventDefault();\n if (!isDir || name === '..') isSelected = true;\n else isSelected = DOM.isSelected(current);\n if (!isSelected) await DOM.loadCurrentSize(current);\n DOM.toggleSelectedFile(current);\n break;\n case _key_js__rspack_import_4.U:\n if (ctrlMeta) {\n DOM.swapPanels();\n event.preventDefault();\n }\n break;\n /* navigation on file table: *\n * in case of pressing button 'up', *\n * select previous row */ case _key_js__rspack_import_4.UP:\n if (shift) DOM.toggleSelectedFile(current);\n DOM.setCurrentFile(prev);\n event.preventDefault();\n break;\n /* in case of pressing button 'down', *\n * select next row */ case _key_js__rspack_import_4.DOWN:\n if (shift) DOM.toggleSelectedFile(current);\n DOM.setCurrentFile(next);\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.LEFT:\n if (!alt) return;\n event.preventDefault();\n dataName = Info.panel.getAttribute('data-name');\n if (dataName === 'js-right') DOM.duplicatePanel();\n break;\n case _key_js__rspack_import_4.RIGHT:\n if (!alt) return;\n event.preventDefault();\n dataName = Info.panel.getAttribute('data-name');\n if (dataName === 'js-left') DOM.duplicatePanel();\n break;\n /* in case of pressing button 'Home', *\n * go to top element */ case _key_js__rspack_import_4.HOME:\n DOM.setCurrentFile(Info.first);\n event.preventDefault();\n break;\n /* in case of pressing button 'End', select last element */ case _key_js__rspack_import_4.END:\n DOM.setCurrentFile(Info.last);\n event.preventDefault();\n break;\n /* если нажали клавишу page down проматываем экран */ case _key_js__rspack_import_4.PAGE_DOWN:\n DOM.scrollByPages(panel, 1);\n for(i = 0; i < 30; i++){\n if (!current.nextSibling) break;\n current = current.nextSibling;\n }\n DOM.setCurrentFile(current);\n event.preventDefault();\n break;\n /* если нажали клавишу page up проматываем экран */ case _key_js__rspack_import_4.PAGE_UP:\n DOM.scrollByPages(panel, -1);\n for(i = 0; i < 30; i++){\n if (!current.previousSibling) break;\n current = current.previousSibling;\n }\n DOM.setCurrentFile(current);\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.ENTER:\n if (Info.isDir) await changeDir(path);\n else CloudCmd.View.show();\n break;\n case _key_js__rspack_import_4.BACKSPACE:\n CloudCmd.goToParentDir();\n event.preventDefault();\n break;\n case _key_js__rspack_import_4.BACKSLASH:\n if (ctrlMeta) await changeDir('/');\n break;\n case _key_js__rspack_import_4.A:\n if (ctrlMeta) {\n DOM.selectAllFiles();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.G:\n if (alt) {\n DOM.goToDirectory();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.L:\n if (ctrlMeta && shift) {\n CloudCmd.logOut();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.M:\n if (ctrlMeta) {\n if (config('vim')) CloudCmd.EditNamesVim.show();\n else CloudCmd.EditNames.show();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.P:\n if (!ctrlMeta) return;\n event.preventDefault();\n _cloudcmd_clipboard__rspack_import_0.writeText(Info.dirPath).catch(CloudCmd.log);\n break;\n /**\n * обновляем страницу,\n * загружаем содержимое каталога\n * при этом данные берём всегда с\n * сервера, а не из кэша\n * (обновляем кэш)\n */ case _key_js__rspack_import_4.R:\n if (ctrlMeta) {\n CloudCmd.log('reloading page...\\n');\n CloudCmd.refresh();\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.C:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.copy();\n break;\n case _key_js__rspack_import_4.X:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.cut();\n break;\n case _key_js__rspack_import_4.V:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.paste();\n break;\n case _key_js__rspack_import_4.Z:\n if (ctrlMeta) _dom_buffer_js__rspack_import_3.clear();\n break;\n case _key_js__rspack_import_4.COLON:\n CloudCmd.CommandLine.show();\n event.preventDefault();\n break;\n /* чистим хранилище */ case _key_js__rspack_import_4.D:\n if (ctrlMeta) {\n CloudCmd.log('clearing storage...');\n await DOM.Storage.clear();\n CloudCmd.log('storage cleared');\n event.preventDefault();\n }\n break;\n case _key_js__rspack_import_4.DOT:\n if (meta && shift) {\n const showDotFiles = !CloudCmd.config('showDotFiles');\n CloudCmd._config('showDotFiles', showDotFiles);\n CloudCmd.refresh();\n await DOM.RESTful.Config.write({\n showDotFiles\n });\n }\n break;\n }\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/key/index.js\n}");
1263
1263
 
1264
1264
  },
1265
1265
  "./client/key/key.js"
@@ -1628,7 +1628,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
1628
1628
  \**************************************/
1629
1629
  (__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
1630
1630
  "use strict";
1631
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n _Config: () => (_Config),\n _createIframe: () => (_createIframe),\n _initConfig: () => (_initConfig),\n _viewHtml: () => (_viewHtml),\n hide: () => (hide),\n init: () => (init),\n show: () => (show)\n});\n/* import */ var _css_view_css__rspack_import_0 = __webpack_require__(/*! #css/view.css */ \"./css/view.css\");\n/* import */ var rendy__rspack_import_1 = __webpack_require__(/*! rendy */ \"./node_modules/rendy/lib/rendy.js\");\n/* import */ var currify__rspack_import_2 = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n/* import */ var wraptile__rspack_import_3 = __webpack_require__(/*! wraptile */ \"./node_modules/wraptile/lib/wraptile.js\");\n/* import */ var try_to_catch__rspack_import_4 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var load_js__rspack_import_5 = __webpack_require__(/*! load.js */ \"./node_modules/load.js/lib/load.js\");\n/* import */ var _cloudcmd_modal__rspack_import_6 = __webpack_require__(/*! @cloudcmd/modal */ \"./node_modules/@cloudcmd/modal/lib/modal.js\");\n/* import */ var _cloudcmd_create_element__rspack_import_7 = __webpack_require__(/*! @cloudcmd/create-element */ \"./node_modules/@cloudcmd/create-element/lib/create-element.js\");\n/* import */ var _common_util__rspack_import_8 = __webpack_require__(/*! #common/util */ \"./common/util.js\");\n/* import */ var _dom_files__rspack_import_9 = __webpack_require__(/*! #dom/files */ \"./client/dom/files.js\");\n/* import */ var _dom_events__rspack_import_10 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _common_cloudfunc__rspack_import_11 = __webpack_require__(/*! #common/cloudfunc */ \"./common/cloudfunc.js\");\n/* import */ var _dom_images__rspack_import_12 = __webpack_require__(/*! #dom/images */ \"./client/dom/images.js\");\n/* import */ var _common_entity__rspack_import_13 = __webpack_require__(/*! #common/entity */ \"./common/entity.js\");\n/* import */ var _types_js__rspack_import_14 = __webpack_require__(/*! ./types.js */ \"./client/modules/view/types.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst CloudCmd = globalThis.CloudCmd || {};\nconst DOM = globalThis.DOM || {};\nconst isString = (a)=>typeof a === 'string';\nconst { assign } = Object;\nconst { isArray } = Array;\nconst lifo = currify__rspack_import_2((fn, el, cb, name)=>fn(name, el, cb));\nconst series = wraptile__rspack_import_3((...a)=>{\n for (const f of a)f();\n});\nconst isFn = (a)=>typeof a === 'function';\nconst noop = ()=>{};\nconst addEvent = lifo(_dom_events__rspack_import_10.add);\nconst loadCSS = load_js__rspack_import_5.css;\nlet Loading = false;\nconst Name = 'View';\nCloudCmd[Name] = {\n init,\n show,\n hide\n};\nconst Info = DOM.CurrentInfo;\nconst { Key } = CloudCmd;\nconst basename = (a)=>a.split('/').pop();\nlet El;\nlet TemplateAudio;\nlet Overlay;\nconst Config = {\n beforeShow: ()=>{\n _dom_images__rspack_import_12.hide();\n Key.unsetBind();\n },\n beforeClose: ()=>{\n _dom_events__rspack_import_10.rmKey(listener);\n Key.setBind();\n },\n afterShow: ()=>{\n El.focus();\n },\n onOverlayClick,\n afterClose: noop,\n autoSize: false,\n helpers: {\n title: {}\n }\n};\nconst _Config = Config;\nasync function init() {\n await loadAll();\n const events = [\n 'click',\n 'contextmenu'\n ];\n events.forEach(addEvent(Overlay, onOverlayClick));\n}\nasync function show(data, options = {}) {\n const prefixURL = CloudCmd.prefixURL + _common_cloudfunc__rspack_import_11.FS;\n if (Loading) return;\n if (!options || options.bindKeys !== false) _dom_events__rspack_import_10.addKey(listener);\n El = _cloudcmd_create_element__rspack_import_7('div', {\n className: 'view',\n notAppend: true\n });\n El.tabIndex = 0;\n if (data) {\n if (isArray(data)) El.append(...data);\n else El.append(data);\n _cloudcmd_modal__rspack_import_6.open(El, initConfig(options));\n return;\n }\n _dom_images__rspack_import_12.show.load();\n const path = prefixURL + Info.path;\n const type = options.raw ? '' : await (0,_types_js__rspack_import_14.getType)(path);\n if (type === 'markdown') return await CloudCmd.Markdown.show(Info.path);\n if (type === 'html') return viewHtml(path);\n if (type === 'image') return viewImage(Info.path, prefixURL);\n if (type === 'media') return await viewMedia(path);\n if (type === 'pdf') return viewPDF(path);\n return await viewFile();\n}\nconst _createIframe = createIframe;\nfunction createIframe(src, overrides = {}) {\n const { createElement = _cloudcmd_create_element__rspack_import_7 } = overrides;\n const element = createElement('iframe', {\n src,\n width: '100%',\n height: '100%'\n });\n element.addEventListener('load', ()=>{\n element.contentWindow.addEventListener('keydown', listener);\n });\n return element;\n}\nconst _viewHtml = viewHtml;\nfunction viewHtml(src, overrides = {}) {\n const { modal = _cloudcmd_modal__rspack_import_6 } = overrides;\n modal.open(createIframe(src), Config);\n}\nfunction viewPDF(src) {\n const element = createIframe(src);\n const options = assign({}, Config);\n if (CloudCmd.config('showFileName')) options.title = Info.name;\n _cloudcmd_modal__rspack_import_6.open(element, options);\n}\nasync function viewMedia(path) {\n const [e, element] = await getMediaElement(path);\n if (e) return alert(e);\n const allConfig = {\n ...Config,\n ...{\n autoSize: true,\n afterShow: ()=>{\n element.querySelector('audio, video').focus();\n }\n }\n };\n _cloudcmd_modal__rspack_import_6.open(element, allConfig);\n}\nasync function viewFile() {\n const [error, data] = await Info.getData();\n if (error) return _dom_images__rspack_import_12.hide();\n const element = document.createTextNode(data);\n const options = Config;\n if (CloudCmd.config('showFileName')) options.title = Info.name;\n El.append(element);\n _cloudcmd_modal__rspack_import_6.open(El, options);\n}\nconst copy = (a)=>assign({}, a);\nconst _initConfig = initConfig;\nfunction initConfig(options) {\n const config = copy(Config);\n if (!options) return config;\n const names = Object.keys(options);\n for (const name of names){\n const isConfig = Boolean(config[name]);\n const item = options[name];\n if (!isFn(item) || !isConfig) {\n config[name] = options[name];\n continue;\n }\n const fn = config[name];\n config[name] = series(fn, item);\n }\n return config;\n}\nfunction hide() {\n _cloudcmd_modal__rspack_import_6.close();\n}\nfunction viewImage(path, prefixURL) {\n const isSupportedImage = (a)=>(0,_types_js__rspack_import_14.isImage)(a) || a === path;\n const makeTitle = (path)=>({\n href: `${prefixURL}${path}`,\n title: (0,_common_entity__rspack_import_13.encode)(basename(path))\n });\n const names = Info.files.map(DOM.getCurrentPath).filter(isSupportedImage);\n const titles = names.map(makeTitle);\n const index = names.indexOf(Info.path);\n const imageConfig = {\n index,\n autoSize: true,\n arrows: true,\n keys: true,\n helpers: {\n title: {}\n }\n };\n const config = {\n ...Config,\n ...imageConfig\n };\n _cloudcmd_modal__rspack_import_6.open(titles, config);\n}\nasync function getMediaElement(src) {\n check(src);\n const [error, template] = await (0,try_to_catch__rspack_import_4.tryToCatch)(_dom_files__rspack_import_9.get, 'view/media-tmpl');\n if (error) return [\n error\n ];\n const { name } = Info;\n if (!TemplateAudio) TemplateAudio = template;\n const is = (0,_types_js__rspack_import_14.isAudio)(name);\n const type = is ? 'audio' : 'video';\n const innerHTML = (0,rendy__rspack_import_1.rendy)(TemplateAudio, {\n src,\n type,\n name\n });\n const element = _cloudcmd_create_element__rspack_import_7('div', {\n innerHTML\n });\n return [\n null,\n element\n ];\n}\nfunction check(src) {\n if (!isString(src)) throw Error('src should be a string!');\n}\nasync function loadAll() {\n const { DIR_DIST } = CloudCmd;\n (0,_common_util__rspack_import_8.time)(`${Name} load`);\n Loading = true;\n await loadCSS(`${DIR_DIST}/view.css`);\n Loading = false;\n}\nfunction onOverlayClick(event) {\n const position = {\n x: event.clientX,\n y: event.clientY\n };\n setCurrentByPosition(position);\n}\nfunction setCurrentByPosition(position) {\n const element = DOM.getCurrentByPosition(position);\n if (!element) return;\n const { files, filesPassive } = Info;\n const isFiles = files.includes(element);\n const isFilesPassive = filesPassive.includes(element);\n if (!isFiles && !isFilesPassive) return;\n const isCurrent = DOM.isCurrentFile(element);\n if (isCurrent) return;\n DOM.setCurrentFile(element);\n}\nfunction listener({ keyCode }) {\n if (keyCode === Key.ESC) hide();\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/modules/view/index.js\n}");
1631
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n _Config: () => (_Config),\n _createIframe: () => (_createIframe),\n _initConfig: () => (_initConfig),\n _show: () => (show),\n _viewHtml: () => (_viewHtml),\n hide: () => (hide),\n init: () => (init),\n show: () => (show)\n});\n/* import */ var _css_view_css__rspack_import_0 = __webpack_require__(/*! #css/view.css */ \"./css/view.css\");\n/* import */ var rendy__rspack_import_1 = __webpack_require__(/*! rendy */ \"./node_modules/rendy/lib/rendy.js\");\n/* import */ var currify__rspack_import_2 = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n/* import */ var wraptile__rspack_import_3 = __webpack_require__(/*! wraptile */ \"./node_modules/wraptile/lib/wraptile.js\");\n/* import */ var try_to_catch__rspack_import_4 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var load_js__rspack_import_5 = __webpack_require__(/*! load.js */ \"./node_modules/load.js/lib/load.js\");\n/* import */ var _cloudcmd_modal__rspack_import_6 = __webpack_require__(/*! @cloudcmd/modal */ \"./node_modules/@cloudcmd/modal/lib/modal.js\");\n/* import */ var _cloudcmd_create_element__rspack_import_7 = __webpack_require__(/*! @cloudcmd/create-element */ \"./node_modules/@cloudcmd/create-element/lib/create-element.js\");\n/* import */ var _common_util__rspack_import_8 = __webpack_require__(/*! #common/util */ \"./common/util.js\");\n/* import */ var _dom_files__rspack_import_9 = __webpack_require__(/*! #dom/files */ \"./client/dom/files.js\");\n/* import */ var _dom_events__rspack_import_10 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _common_cloudfunc__rspack_import_11 = __webpack_require__(/*! #common/cloudfunc */ \"./common/cloudfunc.js\");\n/* import */ var _dom_images__rspack_import_12 = __webpack_require__(/*! #dom/images */ \"./client/dom/images.js\");\n/* import */ var _common_entity__rspack_import_13 = __webpack_require__(/*! #common/entity */ \"./common/entity.js\");\n/* import */ var _types_js__rspack_import_14 = __webpack_require__(/*! ./types.js */ \"./client/modules/view/types.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst CloudCmd = globalThis.CloudCmd || {};\nconst DOM = globalThis.DOM || {};\nconst isString = (a)=>typeof a === 'string';\nconst { assign } = Object;\nconst { isArray } = Array;\nconst lifo = currify__rspack_import_2((fn, el, cb, name)=>fn(name, el, cb));\nconst series = wraptile__rspack_import_3((...a)=>{\n for (const f of a)f();\n});\nconst isFn = (a)=>typeof a === 'function';\nconst noop = ()=>{};\nconst addEvent = lifo(_dom_events__rspack_import_10.add);\nconst loadCSS = load_js__rspack_import_5.css;\nlet Loading = false;\nconst Name = 'View';\nCloudCmd[Name] = {\n init,\n show,\n hide\n};\nconst Info = DOM.CurrentInfo;\nconst { Key } = CloudCmd;\nconst basename = (a)=>a.split('/').pop();\nlet El;\nlet TemplateAudio;\nlet Overlay;\nconst Config = {\n beforeShow: ()=>{\n _dom_images__rspack_import_12.hide();\n Key.unsetBind();\n },\n beforeClose: ()=>{\n _dom_events__rspack_import_10.rmKey(listener);\n Key.setBind();\n },\n afterShow: ()=>{\n El.focus();\n },\n onOverlayClick,\n afterClose: noop,\n autoSize: false,\n helpers: {\n title: {}\n }\n};\nconst _Config = Config;\nasync function init() {\n await loadAll();\n const events = [\n 'click',\n 'contextmenu'\n ];\n events.forEach(addEvent(Overlay, onOverlayClick));\n}\nasync function show(data, options = {}) {\n const prefixURL = CloudCmd.prefixURL + _common_cloudfunc__rspack_import_11.FS;\n if (Loading) return;\n if (!options || options.bindKeys !== false) _dom_events__rspack_import_10.addKey(listener);\n El = _cloudcmd_create_element__rspack_import_7('div', {\n className: 'view',\n notAppend: true\n });\n El.tabIndex = 0;\n if (data) {\n if (isArray(data)) El.append(...data);\n else El.append(data);\n _cloudcmd_modal__rspack_import_6.open(El, initConfig(options));\n return;\n }\n _dom_images__rspack_import_12.show.load();\n const path = prefixURL + Info.path;\n const type = options.raw ? '' : await (0,_types_js__rspack_import_14.getType)(path);\n if (type === 'markdown') return await CloudCmd.Markdown.show(Info.path);\n if (type === 'html') return viewHtml(path);\n if (type === 'image') return viewImage(Info.path, prefixURL);\n if (type === 'media') return await viewMedia(path);\n if (type === 'pdf') return viewPDF(path);\n return await viewFile();\n}\n\nconst _createIframe = createIframe;\nfunction createIframe(src, overrides = {}) {\n const { createElement = _cloudcmd_create_element__rspack_import_7 } = overrides;\n const element = createElement('iframe', {\n src,\n width: '100%',\n height: '100%'\n });\n element.addEventListener('load', ()=>{\n element.contentWindow.addEventListener('keydown', listener);\n });\n return element;\n}\nconst _viewHtml = viewHtml;\nfunction viewHtml(src, overrides = {}) {\n const { modal = _cloudcmd_modal__rspack_import_6 } = overrides;\n modal.open(createIframe(src), Config);\n}\nfunction viewPDF(src) {\n const element = createIframe(src);\n const options = assign({}, Config);\n if (CloudCmd.config('showFileName')) options.title = Info.name;\n _cloudcmd_modal__rspack_import_6.open(element, options);\n}\nasync function viewMedia(path) {\n const [e, element] = await getMediaElement(path);\n if (e) return alert(e);\n const allConfig = {\n ...Config,\n ...{\n autoSize: true,\n afterShow: ()=>{\n element.querySelector('audio, video').focus();\n }\n }\n };\n _cloudcmd_modal__rspack_import_6.open(element, allConfig);\n}\nasync function viewFile() {\n const [error, data] = await Info.getData();\n if (error) return _dom_images__rspack_import_12.hide();\n const element = document.createTextNode(data);\n const options = Config;\n if (CloudCmd.config('showFileName')) options.title = Info.name;\n El.append(element);\n _cloudcmd_modal__rspack_import_6.open(El, options);\n}\nconst copy = (a)=>assign({}, a);\nconst _initConfig = initConfig;\nfunction initConfig(options) {\n const config = copy(Config);\n if (!options) return config;\n const names = Object.keys(options);\n for (const name of names){\n const isConfig = Boolean(config[name]);\n const item = options[name];\n if (!isFn(item) || !isConfig) {\n config[name] = options[name];\n continue;\n }\n const fn = config[name];\n config[name] = series(fn, item);\n }\n return config;\n}\nfunction hide() {\n _cloudcmd_modal__rspack_import_6.close();\n}\nfunction viewImage(path, prefixURL) {\n const isSupportedImage = (a)=>(0,_types_js__rspack_import_14.isImage)(a) || a === path;\n const makeTitle = (path)=>({\n href: `${prefixURL}${path}`,\n title: (0,_common_entity__rspack_import_13.encode)(basename(path))\n });\n const names = Info.files.map(DOM.getCurrentPath).filter(isSupportedImage);\n const titles = names.map(makeTitle);\n const index = names.indexOf(Info.path);\n const imageConfig = {\n index,\n autoSize: true,\n arrows: true,\n keys: true,\n helpers: {\n title: {}\n }\n };\n const config = {\n ...Config,\n ...imageConfig\n };\n _cloudcmd_modal__rspack_import_6.open(titles, config);\n}\nasync function getMediaElement(src) {\n check(src);\n const [error, template] = await (0,try_to_catch__rspack_import_4.tryToCatch)(_dom_files__rspack_import_9.get, 'view/media-tmpl');\n if (error) return [\n error\n ];\n const { name } = Info;\n if (!TemplateAudio) TemplateAudio = template;\n const is = (0,_types_js__rspack_import_14.isAudio)(name);\n const type = is ? 'audio' : 'video';\n const innerHTML = (0,rendy__rspack_import_1.rendy)(TemplateAudio, {\n src,\n type,\n name\n });\n const element = _cloudcmd_create_element__rspack_import_7('div', {\n innerHTML\n });\n return [\n null,\n element\n ];\n}\nfunction check(src) {\n if (!isString(src)) throw Error('src should be a string!');\n}\nasync function loadAll() {\n const { DIR_DIST } = CloudCmd;\n (0,_common_util__rspack_import_8.time)(`${Name} load`);\n Loading = true;\n await loadCSS(`${DIR_DIST}/view.css`);\n Loading = false;\n}\nfunction onOverlayClick(event) {\n const position = {\n x: event.clientX,\n y: event.clientY\n };\n setCurrentByPosition(position);\n}\nfunction setCurrentByPosition(position) {\n const element = DOM.getCurrentByPosition(position);\n if (!element) return;\n const { files, filesPassive } = Info;\n const isFiles = files.includes(element);\n const isFilesPassive = filesPassive.includes(element);\n if (!isFiles && !isFilesPassive) return;\n const isCurrent = DOM.isCurrentFile(element);\n if (isCurrent) return;\n DOM.setCurrentFile(element);\n}\nfunction listener({ keyCode }) {\n if (keyCode === Key.ESC) hide();\n}\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/modules/view/index.js\n}");
1632
1632
 
1633
1633
  },
1634
1634
  "./client/modules/view/types.js"
package/dist-dev/sw.js CHANGED
@@ -23,7 +23,7 @@ eval("{// shim for using process in browser\nvar process = module.exports = {};\
23
23
  \*************************/
24
24
  (__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
25
25
  "use strict";
26
- eval("{__webpack_require__.r(__webpack_exports__);\n/* import */ var node_process__rspack_import_0 = __webpack_require__(/*! node:process */ \"./node_modules/process/browser.js\");\n/* import */ var try_to_catch__rspack_import_1 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var currify__rspack_import_2 = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n\n\n\nconst isDev = \"development\" === 'development';\nconst isGet = a => a.method === 'GET';\nconst isBasic = a => a.type === 'basic';\nconst wait = currify__rspack_import_2((f, e) => e.waitUntil(f()));\nconst respondWith = currify__rspack_import_2((f, e) => {\n const {\n request\n } = e;\n const {\n url\n } = request;\n const pathname = getPathName(url);\n if (url.endsWith('/') || /\\^\\/fs/.test(pathname)) return;\n if (!isGet(request)) return;\n if (!isBasic(request)) return;\n if (pathname.startsWith('/api')) return;\n if (/^socket.io/.test(pathname)) return;\n e.respondWith(f(e));\n});\nconst getPathName = url => new URL(url).pathname;\nconst date = \"Tue Sep 15 2026 13:51:10 GMT+0300 (Eastern European Summer Time)\";\nconst NAME = `cloudcmd: ${date}`;\nconst createRequest = a => new Request(a, {\n credentials: 'same-origin'\n});\nconst getRequest = (a, request) => {\n if (a !== '/') return request;\n return createRequest('/');\n};\nglobalThis.addEventListener('install', wait(onInstall));\nglobalThis.addEventListener('fetch', respondWith(onFetch));\nglobalThis.addEventListener('activate', wait(onActivate));\nasync function onActivate() {\n console.info(`cloudcmd: sw: activate: ${NAME}`);\n await globalThis.clients.claim();\n const keys = await caches.keys();\n const deleteCache = caches.delete.bind(caches);\n await Promise.all(keys.map(deleteCache));\n}\nasync function onInstall() {\n console.info(`cloudcmd: sw: install: ${NAME}`);\n await globalThis.skipWaiting();\n}\nasync function onFetch(event) {\n const {\n request\n } = event;\n const {\n url\n } = request;\n const pathname = getPathName(url);\n const newRequest = getRequest(pathname, event.request);\n const cache = await caches.open(NAME);\n const response = await cache.match(request);\n if (!isDev && response) return response;\n const [e, resp] = await (0,try_to_catch__rspack_import_1.tryToCatch)(fetch, newRequest, {\n credentials: 'same-origin'\n });\n if (e) return new Response(e.message);\n await addToCache(request, resp.clone());\n return resp;\n}\nasync function addToCache(request, response) {\n const cache = await caches.open(NAME);\n return cache.put(request, response);\n}\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/sw/sw.js\n}");
26
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* import */ var node_process__rspack_import_0 = __webpack_require__(/*! node:process */ \"./node_modules/process/browser.js\");\n/* import */ var try_to_catch__rspack_import_1 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var currify__rspack_import_2 = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n\n\n\nconst isDev = \"development\" === 'development';\nconst isGet = a => a.method === 'GET';\nconst isBasic = a => a.type === 'basic';\nconst wait = currify__rspack_import_2((f, e) => e.waitUntil(f()));\nconst respondWith = currify__rspack_import_2((f, e) => {\n const {\n request\n } = e;\n const {\n url\n } = request;\n const pathname = getPathName(url);\n if (url.endsWith('/') || /\\^\\/fs/.test(pathname)) return;\n if (!isGet(request)) return;\n if (!isBasic(request)) return;\n if (pathname.startsWith('/api')) return;\n if (/^socket.io/.test(pathname)) return;\n e.respondWith(f(e));\n});\nconst getPathName = url => new URL(url).pathname;\nconst date = \"Wed Sep 16 2026 22:04:31 GMT+0300 (Eastern European Summer Time)\";\nconst NAME = `cloudcmd: ${date}`;\nconst createRequest = a => new Request(a, {\n credentials: 'same-origin'\n});\nconst getRequest = (a, request) => {\n if (a !== '/') return request;\n return createRequest('/');\n};\nglobalThis.addEventListener('install', wait(onInstall));\nglobalThis.addEventListener('fetch', respondWith(onFetch));\nglobalThis.addEventListener('activate', wait(onActivate));\nasync function onActivate() {\n console.info(`cloudcmd: sw: activate: ${NAME}`);\n await globalThis.clients.claim();\n const keys = await caches.keys();\n const deleteCache = caches.delete.bind(caches);\n await Promise.all(keys.map(deleteCache));\n}\nasync function onInstall() {\n console.info(`cloudcmd: sw: install: ${NAME}`);\n await globalThis.skipWaiting();\n}\nasync function onFetch(event) {\n const {\n request\n } = event;\n const {\n url\n } = request;\n const pathname = getPathName(url);\n const newRequest = getRequest(pathname, event.request);\n const cache = await caches.open(NAME);\n const response = await cache.match(request);\n if (!isDev && response) return response;\n const [e, resp] = await (0,try_to_catch__rspack_import_1.tryToCatch)(fetch, newRequest, {\n credentials: 'same-origin'\n });\n if (e) return new Response(e.message);\n await addToCache(request, resp.clone());\n return resp;\n}\nasync function addToCache(request, response) {\n const cache = await caches.open(NAME);\n return cache.put(request, response);\n}\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/sw/sw.js\n}");
27
27
 
28
28
  },
29
29
  "./node_modules/try-to-catch/lib/try-to-catch.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudcmd",
3
- "version": "19.20.6",
3
+ "version": "19.20.8",
4
4
  "type": "module",
5
5
  "author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
6
6
  "description": "File manager for the web with console and editor",
@@ -56,6 +56,7 @@
56
56
  "lint:stream": "madrun lint:stream",
57
57
  "test": "madrun test",
58
58
  "test:e2e": "madrun test:e2e",
59
+ "test:e2e:client": "madrun test:e2e:client",
59
60
  "test:client": "madrun test:client",
60
61
  "test:server": "madrun test:server",
61
62
  "wisdom": "madrun wisdom",
@@ -162,6 +163,7 @@
162
163
  "@cloudcmd/stub": "^5.0.0",
163
164
  "@iocmd/wait": "^2.1.0",
164
165
  "@putout/eslint-flat": "^4.0.0",
166
+ "@playwright/test": "^1.63.0",
165
167
  "@rspack/cli": "^2.1.4",
166
168
  "@rspack/core": "^2.1.4",
167
169
  "@supertape/loader-css": "^1.0.0",