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/ChangeLog +10 -0
- package/HELP.md +3 -1
- package/README.md +1 -1
- package/dist/cloudcmd.common.js +5 -14
- package/dist/cloudcmd.common.js.map +1 -1
- package/dist/sw.js +1 -1
- package/dist-dev/cloudcmd.common.js +2 -2
- package/dist-dev/sw.js +1 -1
- package/package.json +2 -2
- package/server/markdown/index.js +4 -6
- package/server/rest/index.js +63 -18
- package/server/root.js +16 -1
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 = "
|
|
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
|
|
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 = \"
|
|
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.
|
|
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": "^
|
|
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",
|
package/server/markdown/index.js
CHANGED
|
@@ -21,22 +21,20 @@ export default callbackify(async (name, rootDir, request) => {
|
|
|
21
21
|
|
|
22
22
|
const {method} = request;
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
case 'GET':
|
|
24
|
+
if (method === 'GET')
|
|
26
25
|
return await onGET(request, name, rootDir);
|
|
27
26
|
|
|
28
|
-
|
|
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
|
|
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) {
|
package/server/rest/index.js
CHANGED
|
@@ -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
|
-
|
|
101
|
-
case 'GET':
|
|
101
|
+
if (method === 'GET')
|
|
102
102
|
return onGET(params, config, callback);
|
|
103
103
|
|
|
104
|
-
|
|
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
|
|
222
|
-
|
|
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
|
-
|
|
240
|
-
|
|
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
|
|
280
|
-
|
|
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
|
-
|
|
292
|
-
|
|
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
|
-
|
|
344
|
+
const [errorFrom, resolvedFrom] = tryCatch(root.resolve, from, rootDir);
|
|
311
345
|
|
|
312
|
-
if (
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
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;
|