cloudcmd 19.20.0 → 19.20.2

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 = "Thu Aug 06 2026 16:28:17 GMT+0300 (Eastern European Summer Time)";
305
+ const date = "Tue Aug 25 2026 13:17:11 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'
@@ -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 switch(keyCode){\n case _key_js__rspack_import_4.DOT:\n return '.';\n case _key_js__rspack_import_4.HYPHEN:\n return shift ? '_' : '-';\n case _key_js__rspack_import_4.EQUAL:\n return shift ? '+' : '=';\n }\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});\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"
@@ -1376,7 +1376,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
1376
1376
  \****************************************/
1377
1377
  (__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
1378
1378
  "use strict";
1379
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n hide: () => (hide),\n init: () => (init),\n show: () => (show)\n});\n/* import */ var _css_config_css__rspack_import_0 = __webpack_require__(/*! ../../../css/config.css */ \"./css/config.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 squad__rspack_import_4 = __webpack_require__(/*! squad */ \"./node_modules/squad/lib/squad.js\");\n/* import */ var es6_promisify__rspack_import_5 = __webpack_require__(/*! es6-promisify */ \"./node_modules/es6-promisify/dist/promisify.mjs\");\n/* import */ var try_to_catch__rspack_import_6 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var load_js__rspack_import_7 = __webpack_require__(/*! load.js */ \"./node_modules/load.js/lib/load.js\");\n/* import */ var _cloudcmd_create_element__rspack_import_8 = __webpack_require__(/*! @cloudcmd/create-element */ \"./node_modules/@cloudcmd/create-element/lib/create-element.js\");\n/* import */ var _dom_events__rspack_import_9 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _dom_files__rspack_import_10 = __webpack_require__(/*! #dom/files */ \"./client/dom/files.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 _input_js__rspack_import_13 = __webpack_require__(/*! ./input.js */ \"./client/modules/config/input.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst { CloudCmd, DOM } = globalThis;\nconst { Dialog, setTitle } = DOM;\nconst Name = 'Config';\nconst loadSocket = (0,es6_promisify__rspack_import_5.promisify)(DOM.loadSocket);\nconst showLoad = ()=>{\n _dom_images__rspack_import_12.show.load('top');\n};\nconst addKey = currify__rspack_import_2((fn, input)=>{\n _dom_events__rspack_import_9.addKey(input, fn);\n return input;\n});\nconst addChange = currify__rspack_import_2((fn, input)=>{\n _dom_events__rspack_import_9.add('change', input, fn);\n return input;\n});\nconst Config = {};\nlet Template;\nconst loadCSS = load_js__rspack_import_7.css;\nasync function init() {\n if (!CloudCmd.config('configDialog')) return;\n showLoad();\n const { DIR_DIST } = CloudCmd;\n [Template] = await Promise.all([\n _dom_files__rspack_import_10.get('config-tmpl'),\n loadSocket(),\n loadCSS(`${DIR_DIST}/config.css`),\n CloudCmd.View()\n ]);\n initSocket();\n}\nconst { config, Key } = CloudCmd;\nlet Element;\nfunction getHost() {\n const { host, origin, protocol } = location;\n return origin || `${protocol}//${host}`;\n}\nfunction initSocket() {\n const href = getHost();\n const { prefixSocket, prefix } = CloudCmd;\n const ONE_MINUTE = 60 * 1000;\n const socket = globalThis.io.connect(href + prefixSocket + '/config', {\n reconnectionAttempts: Infinity,\n reconnectionDelay: ONE_MINUTE,\n path: `${prefix}/socket.io`\n });\n const save = (data)=>{\n onSave(data);\n socket.send(data);\n };\n authCheck(socket);\n socket.on('connect', ()=>{\n Config.save = save;\n });\n socket.on('message', onSave);\n socket.on('log', CloudCmd.log);\n socket.on('disconnect', ()=>{\n Config.save = saveHttp;\n });\n socket.on('err', Dialog.alert);\n}\nfunction authCheck(socket) {\n socket.emit('auth', config('username'), config('password'));\n socket.on('reject', wraptile__rspack_import_3(Dialog.alert, 'Wrong credentials!'));\n}\nConfig.save = saveHttp;\nasync function show() {\n if (!CloudCmd.config('configDialog')) return;\n await fillTemplate();\n}\nasync function fillTemplate() {\n const [error, config] = await (0,try_to_catch__rspack_import_6.tryToCatch)(_dom_files__rspack_import_10.get, 'config');\n if (error) return Dialog.alert('Could not load config!');\n const { editor, menu, packer, columns, theme, configAuth, configPort, ...obj } = _input_js__rspack_import_13.convert(config);\n obj[`${menu}-selected`] = 'selected';\n obj[`${editor}-selected`] = 'selected';\n obj[`${packer}-selected`] = 'selected';\n obj[`${columns}-selected`] = 'selected';\n obj[`${theme}-selected`] = 'selected';\n obj.configAuth = configAuth ? '' : 'hidden';\n obj.configPort = configPort ? '' : 'hidden';\n const innerHTML = (0,rendy__rspack_import_1.rendy)(Template, obj);\n Element = _cloudcmd_create_element__rspack_import_8('form', {\n className: 'config',\n innerHTML\n });\n const inputs = document.querySelectorAll('input, select', Element);\n const [inputFirst] = inputs;\n let afterShow;\n if (inputFirst) {\n onAuthChange(inputFirst.checked);\n afterShow = inputFirst.focus.bind(inputFirst);\n }\n const getTarget = ({ target })=>target;\n const handleChange = squad__rspack_import_4(onChange, getTarget);\n Array.from(inputs).map(addKey(onKey)).map(addChange(handleChange));\n const autoSize = true;\n CloudCmd.View.show(Element, {\n autoSize,\n afterShow\n });\n}\nfunction hide() {\n CloudCmd.View.hide();\n}\nasync function onChange(el) {\n const obj = {};\n const name = _input_js__rspack_import_13.getName(el);\n const data = _input_js__rspack_import_13.getValue(name, Element);\n if (name === 'name') onNameChange(data);\n else if (name === 'auth') onAuthChange(data);\n obj[name] = data;\n await Config.save(obj);\n}\nfunction onSave(obj) {\n for (const name of Object.keys(obj)){\n const data = obj[name];\n CloudCmd._config(name, data);\n _input_js__rspack_import_13.setValue(name, data, Element);\n }\n}\nasync function saveHttp(obj) {\n const { RESTful } = DOM;\n const [e] = await RESTful.Config.write(obj);\n if (e) return;\n onSave(obj);\n}\nfunction onAuthChange(checked) {\n const elUsername = _input_js__rspack_import_13.getElementByName('username', Element);\n const elPassword = _input_js__rspack_import_13.getElementByName('password', Element);\n elUsername.disabled = !checked;\n elPassword.disabled = !checked;\n}\nfunction onNameChange(name) {\n setTitle((0,_common_cloudfunc__rspack_import_11.getTitle)({\n name\n }));\n}\nasync function onKey({ keyCode, target }) {\n switch(keyCode){\n case Key.ESC:\n return hide();\n case Key.ENTER:\n return await onChange(target);\n }\n}\nCloudCmd[Name] = {\n init,\n show,\n hide\n};\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/modules/config/index.js\n}");
1379
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n hide: () => (hide),\n init: () => (init),\n show: () => (show)\n});\n/* import */ var _css_config_css__rspack_import_0 = __webpack_require__(/*! ../../../css/config.css */ \"./css/config.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 squad__rspack_import_4 = __webpack_require__(/*! squad */ \"./node_modules/squad/lib/squad.js\");\n/* import */ var es6_promisify__rspack_import_5 = __webpack_require__(/*! es6-promisify */ \"./node_modules/es6-promisify/dist/promisify.mjs\");\n/* import */ var try_to_catch__rspack_import_6 = __webpack_require__(/*! try-to-catch */ \"./node_modules/try-to-catch/lib/try-to-catch.js\");\n/* import */ var load_js__rspack_import_7 = __webpack_require__(/*! load.js */ \"./node_modules/load.js/lib/load.js\");\n/* import */ var _cloudcmd_create_element__rspack_import_8 = __webpack_require__(/*! @cloudcmd/create-element */ \"./node_modules/@cloudcmd/create-element/lib/create-element.js\");\n/* import */ var _dom_events__rspack_import_9 = __webpack_require__(/*! #dom/events */ \"./client/dom/events/index.js\");\n/* import */ var _dom_files__rspack_import_10 = __webpack_require__(/*! #dom/files */ \"./client/dom/files.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 _input_js__rspack_import_13 = __webpack_require__(/*! ./input.js */ \"./client/modules/config/input.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst { CloudCmd, DOM } = globalThis;\nconst { Dialog, setTitle } = DOM;\nconst Name = 'Config';\nconst loadSocket = (0,es6_promisify__rspack_import_5.promisify)(DOM.loadSocket);\nconst showLoad = ()=>{\n _dom_images__rspack_import_12.show.load('top');\n};\nconst addKey = currify__rspack_import_2((fn, input)=>{\n _dom_events__rspack_import_9.addKey(input, fn);\n return input;\n});\nconst addChange = currify__rspack_import_2((fn, input)=>{\n _dom_events__rspack_import_9.add('change', input, fn);\n return input;\n});\nconst Config = {};\nlet Template;\nconst loadCSS = load_js__rspack_import_7.css;\nasync function init() {\n if (!CloudCmd.config('configDialog')) return;\n showLoad();\n const { DIR_DIST } = CloudCmd;\n [Template] = await Promise.all([\n _dom_files__rspack_import_10.get('config-tmpl'),\n loadSocket(),\n loadCSS(`${DIR_DIST}/config.css`),\n CloudCmd.View()\n ]);\n initSocket();\n}\nconst { config, Key } = CloudCmd;\nlet Element;\nfunction getHost() {\n const { host, origin, protocol } = location;\n return origin || `${protocol}//${host}`;\n}\nfunction initSocket() {\n const href = getHost();\n const { prefixSocket, prefix } = CloudCmd;\n const ONE_MINUTE = 60 * 1000;\n const socket = globalThis.io.connect(href + prefixSocket + '/config', {\n reconnectionAttempts: Infinity,\n reconnectionDelay: ONE_MINUTE,\n path: `${prefix}/socket.io`\n });\n const save = (data)=>{\n onSave(data);\n socket.send(data);\n };\n authCheck(socket);\n socket.on('connect', ()=>{\n Config.save = save;\n });\n socket.on('message', onSave);\n socket.on('log', CloudCmd.log);\n socket.on('disconnect', ()=>{\n Config.save = saveHttp;\n });\n socket.on('err', Dialog.alert);\n}\nfunction authCheck(socket) {\n socket.emit('auth', config('username'), config('password'));\n socket.on('reject', wraptile__rspack_import_3(Dialog.alert, 'Wrong credentials!'));\n}\nConfig.save = saveHttp;\nasync function show() {\n if (!CloudCmd.config('configDialog')) return;\n await fillTemplate();\n}\nasync function fillTemplate() {\n const [error, config] = await (0,try_to_catch__rspack_import_6.tryToCatch)(_dom_files__rspack_import_10.get, 'config');\n if (error) return Dialog.alert('Could not load config!');\n const { editor, menu, packer, columns, theme, configAuth, configPort, ...obj } = _input_js__rspack_import_13.convert(config);\n obj[`${menu}-selected`] = 'selected';\n obj[`${editor}-selected`] = 'selected';\n obj[`${packer}-selected`] = 'selected';\n obj[`${columns}-selected`] = 'selected';\n obj[`${theme}-selected`] = 'selected';\n obj.configAuth = configAuth ? '' : 'hidden';\n obj.configPort = configPort ? '' : 'hidden';\n const innerHTML = (0,rendy__rspack_import_1.rendy)(Template, obj);\n Element = _cloudcmd_create_element__rspack_import_8('form', {\n className: 'config',\n innerHTML\n });\n const inputs = document.querySelectorAll('input, select', Element);\n const [inputFirst] = inputs;\n let afterShow;\n if (inputFirst) {\n onAuthChange(inputFirst.checked);\n afterShow = inputFirst.focus.bind(inputFirst);\n }\n const getTarget = ({ target })=>target;\n const handleChange = squad__rspack_import_4(onChange, getTarget);\n Array.from(inputs).map(addKey(onKey)).map(addChange(handleChange));\n const autoSize = true;\n CloudCmd.View.show(Element, {\n autoSize,\n afterShow\n });\n}\nfunction hide() {\n CloudCmd.View.hide();\n}\nasync function onChange(el) {\n const obj = {};\n const name = _input_js__rspack_import_13.getName(el);\n const data = _input_js__rspack_import_13.getValue(name, Element);\n if (name === 'name') onNameChange(data);\n else if (name === 'auth') onAuthChange(data);\n obj[name] = data;\n await Config.save(obj);\n}\nfunction onSave(obj) {\n for (const name of Object.keys(obj)){\n const data = obj[name];\n CloudCmd._config(name, data);\n _input_js__rspack_import_13.setValue(name, data, Element);\n }\n}\nasync function saveHttp(obj) {\n const { RESTful } = DOM;\n const [e] = await RESTful.Config.write(obj);\n if (e) return;\n onSave(obj);\n}\nfunction onAuthChange(checked) {\n const elUsername = _input_js__rspack_import_13.getElementByName('username', Element);\n const elPassword = _input_js__rspack_import_13.getElementByName('password', Element);\n elUsername.disabled = !checked;\n elPassword.disabled = !checked;\n}\nfunction onNameChange(name) {\n setTitle((0,_common_cloudfunc__rspack_import_11.getTitle)({\n name\n }));\n}\nasync function onKey({ keyCode, target }) {\n if (keyCode === Key.ESC) return hide();\n if (keyCode === Key.ENTER) return await onChange(target);\n}\nCloudCmd[Name] = {\n init,\n show,\n hide\n};\n\n\n//# sourceURL=file://cloudcmd//Users/coderaiser/cloudcmd/client/modules/config/index.js\n}");
1380
1380
 
1381
1381
  },
1382
1382
  "./client/modules/config/input.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 = \"Thu Aug 06 2026 16:28:17 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 = \"Tue Aug 25 2026 13:17:11 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.0",
3
+ "version": "19.20.2",
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",
@@ -87,7 +87,7 @@
87
87
  "dependencies": {
88
88
  "@cloudcmd/dropbox": "^5.0.1",
89
89
  "@cloudcmd/fileop": "^9.0.7",
90
- "@cloudcmd/move-files": "^8.0.0",
90
+ "@cloudcmd/move-files": "^9.0.0",
91
91
  "@cloudcmd/read-files-sync": "^2.0.0",
92
92
  "@putout/cli-validate-args": "^2.0.0",
93
93
  "@putout/plugin-cloudcmd": "^5.2.0",
@@ -21,22 +21,20 @@ export default callbackify(async (name, rootDir, request) => {
21
21
 
22
22
  const {method} = request;
23
23
 
24
- switch(method) {
25
- case 'GET':
24
+ if (method === 'GET')
26
25
  return await onGET(request, name, rootDir);
27
26
 
28
- case 'PUT':
27
+ if (method === 'PUT')
29
28
  return await onPUT(request);
30
- }
31
29
  });
32
30
 
33
31
  function parseName(query, name, rootDir) {
34
32
  const shortName = name.replace('/markdown', '');
35
33
 
36
34
  if (query === 'relative')
37
- return DIR_ROOT + shortName;
35
+ return root.resolve(shortName, DIR_ROOT);
38
36
 
39
- return root(shortName, rootDir);
37
+ return root.resolve(shortName, rootDir);
40
38
  }
41
39
 
42
40
  async function onGET(request, name, root) {
@@ -10,7 +10,8 @@ import pullout from 'pullout';
10
10
  import json from 'jonny';
11
11
  import * as ponse from 'ponse';
12
12
  import {copymitter} from 'copymitter';
13
- import _moveFiles from '@cloudcmd/move-files';
13
+ import {moveFiles as _moveFiles} from '@cloudcmd/move-files';
14
+ import {tryCatch} from 'try-catch';
14
15
  import * as CloudFunc from '#common/cloudfunc';
15
16
  import root from '../root.js';
16
17
  import markdown from '../markdown/index.js';
@@ -97,11 +98,10 @@ function sendData(params, {fs, config, moveFiles}, callback) {
97
98
 
98
99
  const {method} = p.request;
99
100
 
100
- switch(method) {
101
- case 'GET':
101
+ if (method === 'GET')
102
102
  return onGET(params, config, callback);
103
103
 
104
- case 'PUT':
104
+ if (method === 'PUT')
105
105
  return pullout(p.request)
106
106
  .then((body) => {
107
107
  onPUT({
@@ -113,7 +113,6 @@ function sendData(params, {fs, config, moveFiles}, callback) {
113
113
  }, callback);
114
114
  })
115
115
  .catch(callback);
116
- }
117
116
  }
118
117
 
119
118
  function onGET(params, config, callback) {
@@ -218,8 +217,15 @@ function onPUT({name, fs, moveFiles, config, body}, callback) {
218
217
  const msg = getMoveMsg(names);
219
218
  const fn = swap(callback, msg);
220
219
 
221
- const fromRooted = root(from, rootDir);
222
- const toRooted = root(to, rootDir);
220
+ const [errorFrom, fromRooted] = tryCatch(root.resolve, from, rootDir);
221
+
222
+ if (errorFrom)
223
+ return callback(errorFrom);
224
+
225
+ const [errorTo, toRooted] = tryCatch(root.resolve, to, rootDir);
226
+
227
+ if (errorTo)
228
+ return callback(errorTo);
223
229
 
224
230
  return moveFiles(fromRooted, toRooted, names)
225
231
  .on('error', fn)
@@ -229,21 +235,32 @@ function onPUT({name, fs, moveFiles, config, body}, callback) {
229
235
  case 'rename':
230
236
  return rename(rootDir, files.from, files.to, fs, callback);
231
237
 
232
- case 'copy':
238
+ case 'copy': {
233
239
  if (!files.from || !files.names || !files.to)
234
240
  return callback(body);
235
241
 
236
242
  if (isRootAll(rootDir, [files.to, files.from]))
237
243
  return callback(getWin32RootMsg());
238
244
 
239
- files.from = root(files.from, rootDir);
240
- files.to = root(files.to, rootDir);
245
+ const [errorFrom, resolvedFrom] = tryCatch(root.resolve, files.from, rootDir);
246
+
247
+ if (errorFrom)
248
+ return callback(errorFrom);
249
+
250
+ const [errorTo, resolvedTo] = tryCatch(root.resolve, files.to, rootDir);
251
+
252
+ if (errorTo)
253
+ return callback(errorTo);
254
+
255
+ files.from = resolvedFrom;
256
+ files.to = resolvedTo;
241
257
 
242
258
  copy(files.from, files.to, files.names, (error) => {
243
259
  const msg = formatMsg('copy', files.names);
244
260
  callback(error, msg);
245
261
  });
246
262
  break;
263
+ }
247
264
 
248
265
  case 'pack':
249
266
  if (!files.from)
@@ -276,8 +293,15 @@ function rename(rootDir, from, to, fs, callback) {
276
293
  const msg = getRenameMsg(from, to);
277
294
  const fn = swap(callback, msg);
278
295
 
279
- const fromRooted = root(from, rootDir);
280
- const toRooted = root(to, rootDir);
296
+ const [errorFrom, fromRooted] = tryCatch(root.resolve, from, rootDir);
297
+
298
+ if (errorFrom)
299
+ return callback(errorFrom);
300
+
301
+ const [errorTo, toRooted] = tryCatch(root.resolve, to, rootDir);
302
+
303
+ if (errorTo)
304
+ return callback(errorTo);
281
305
 
282
306
  return fs.rename(fromRooted, toRooted, fn);
283
307
  }
@@ -288,8 +312,18 @@ function pack(from, to, names, config, fn) {
288
312
  const rootDir = config('root');
289
313
  const packer = config('packer');
290
314
 
291
- from = root(from, rootDir);
292
- to = root(to, rootDir);
315
+ const [errorFrom, resolvedFrom] = tryCatch(root.resolve, from, rootDir);
316
+
317
+ if (errorFrom)
318
+ return fn(errorFrom);
319
+
320
+ const [errorTo, resolvedTo] = tryCatch(root.resolve, to, rootDir);
321
+
322
+ if (errorTo)
323
+ return fn(errorTo);
324
+
325
+ from = resolvedFrom;
326
+ to = resolvedTo;
293
327
 
294
328
  if (!names) {
295
329
  names = [
@@ -307,12 +341,23 @@ export const _pack = pack;
307
341
  function extract(from, to, config, fn) {
308
342
  const rootDir = config('root');
309
343
 
310
- from = root(from, rootDir);
344
+ const [errorFrom, resolvedFrom] = tryCatch(root.resolve, from, rootDir);
311
345
 
312
- if (to)
313
- to = root(to, rootDir);
314
- else
346
+ if (errorFrom)
347
+ return fn(errorFrom);
348
+
349
+ from = resolvedFrom;
350
+
351
+ if (to) {
352
+ const [errorTo, resolvedTo] = tryCatch(root.resolve, to, rootDir);
353
+
354
+ if (errorTo)
355
+ return fn(errorTo);
356
+
357
+ to = resolvedTo;
358
+ } else {
315
359
  to = from.replace(/\.tar\.gz$/, '');
360
+ }
316
361
 
317
362
  operation('extract', config('packer'), from, to, fn);
318
363
  }
package/server/root.js CHANGED
@@ -1,5 +1,20 @@
1
+ import path from 'node:path';
1
2
  import mellow from 'mellow';
2
3
 
3
- export default (dir, root, {webToWin = mellow.webToWin} = {}) => {
4
+ const rootFn = (dir, root, {webToWin = mellow.webToWin} = {}) => {
4
5
  return webToWin(dir, root || '/');
5
6
  };
7
+
8
+ rootFn.resolve = (dir, rootDir) => {
9
+ const normalizedRoot = path.normalize(rootDir);
10
+ const resolved = rootFn(dir, normalizedRoot);
11
+
12
+ const sep = normalizedRoot.endsWith(path.sep) ? '' : path.sep;
13
+
14
+ if (resolved !== normalizedRoot && !resolved.startsWith(normalizedRoot + sep))
15
+ throw Error(`Path ${resolved} beyond root ${normalizedRoot}!`);
16
+
17
+ return resolved;
18
+ };
19
+
20
+ export default rootFn;