From 49f298bc46ace6ba0bb1c84e2e8c96770bb0a162 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 25 Jan 2021 19:47:53 +0200 Subject: [PATCH 0001/1230] feature(package) files-io v4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c3bfa2cd..2386551a 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "es6-promisify": "^6.0.2", "execon": "^1.2.0", "express": "^4.13.0", - "files-io": "^3.0.0", + "files-io": "^4.0.0", "find-up": "^5.0.0", "for-each-key": "^2.0.0", "format-io": "^2.0.0", From fd32f76bf059646db32b3a9866cb27fef801ed76 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 25 Jan 2021 19:55:29 +0200 Subject: [PATCH 0002/1230] feature(package) ponse v6.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2386551a..cceed2ce 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "onezip": "^5.0.0", "open": "^7.0.0", "package-json": "^6.0.0", - "ponse": "^5.0.0", + "ponse": "^6.0.0", "pullout": "^4.0.0", "putout": "^13.0.0", "redzip": "^1.3.0", From b0e63fd3fd84b6e8598cffa1bdf92e7df23510ed Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 25 Jan 2021 20:45:48 +0200 Subject: [PATCH 0003/1230] feature(package) restbox v3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cceed2ce..1b7382eb 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "redzip": "^1.3.0", "rendy": "^3.0.0", "restafary": "^9.1.0", - "restbox": "^2.0.0", + "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", "socket.io": "^3.0.5", From ee5cbb13b06fe865d0fd6eed0f306a39a3702fe6 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 25 Jan 2021 20:56:57 +0200 Subject: [PATCH 0004/1230] chore(package) v15.4.3 --- ChangeLog | 8 ++++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- test/rest/fs.js | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index f795f2be..e61fecbd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2021.01.25, v15.4.3 + +feature: +- (package) restbox v3.0.0 +- (package) ponse v6.0.0 +- (package) files-io v4.0.0 + + 2021.01.21, v15.4.2 feature: diff --git a/HELP.md b/HELP.md index 6898bf2b..44f32909 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.2 +# Cloud Commander v15.4.3 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index fdd616b5..8c79eadc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.4.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 1b7382eb..5a75d82b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.4.2", + "version": "15.4.3", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", diff --git a/test/rest/fs.js b/test/rest/fs.js index 8fd0497d..5c3b4f0b 100644 --- a/test/rest/fs.js +++ b/test/rest/fs.js @@ -16,7 +16,7 @@ test('cloudcmd: rest: fs: path', async (t) => { const {path} = body; - t.equal('/', path, 'should dir path be "/"'); + t.equal(path, '/', 'should dir path be "/"'); t.end(); }); From 325706756c3cd5450a860d12bee30049b4dd7556 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 26 Jan 2021 17:32:10 +0200 Subject: [PATCH 0005/1230] chore(putout) rm apply-optional-chaining: enabled by default --- .putout.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.putout.json b/.putout.json index fa1a31ed..50e6f805 100644 --- a/.putout.json +++ b/.putout.json @@ -1,7 +1,4 @@ { - "rules": { - "apply-optional-chaining": "on" - }, "ignore": [ "fixture*", "app.json", From ac85786b62c82d17940488f1208e7c0e1ac097d3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 26 Jan 2021 17:34:05 +0200 Subject: [PATCH 0006/1230] feature(package) win32 v5.1.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5a75d82b..0ac38bf9 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", - "win32": "^5.0.1", + "win32": "^5.1.11", "wraptile": "^3.0.0", "writejson": "^3.0.0" }, From dae05277d68b3b0a15710291a2c511c339df27c9 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 26 Jan 2021 17:36:56 +0200 Subject: [PATCH 0007/1230] chore(package) v15.4.4 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e61fecbd..21e17acd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.01.26, v15.4.4 + +feature: +- (package) win32 v5.1.11 + + 2021.01.25, v15.4.3 feature: diff --git a/HELP.md b/HELP.md index 44f32909..4bbbb978 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.3 +# Cloud Commander v15.4.4 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 8c79eadc..1489fc69 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.4.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 0ac38bf9..593426a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.4.3", + "version": "15.4.4", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 7d1a35d8b2d2fe00e66c0265403ffbc346534202 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 26 Jan 2021 19:27:56 +0200 Subject: [PATCH 0008/1230] feature(package) eslint-plugin-putout v7.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 593426a3..2639b38d 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "emitify": "^4.0.1", "eslint": "^7.0.0-rc.0", "eslint-plugin-node": "^11.0.0", - "eslint-plugin-putout": "^6.0.0", + "eslint-plugin-putout": "^7.0.0", "extract-text-webpack-plugin": "^4.0.0-alpha.0", "gritty": "^6.0.0", "gunzip-maybe": "^1.3.1", From b3b618b2ca66984f0e0abb78ae2974ac1d47a616 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 26 Jan 2021 19:28:03 +0200 Subject: [PATCH 0009/1230] feature(package) putout v14.0.0 --- .putout.json | 10 ---------- package.json | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.putout.json b/.putout.json index 50e6f805..0b4fcd1e 100644 --- a/.putout.json +++ b/.putout.json @@ -24,16 +24,6 @@ "client/{client,cloudcmd,load-module}.js": { "remove-console": "off" }, - "client/modules/config/index.js": { - "apply-shorthand-properties": [{ - "ignore": [ - "ONE_MINUTE" - ] - }] - }, - "view.js": { - "apply-shorthand-properties": "off" - }, "test/common/cloudfunc.js": { "remove-console": "off" }, diff --git a/package.json b/package.json index 2639b38d..02e463fd 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "package-json": "^6.0.0", "ponse": "^6.0.0", "pullout": "^4.0.0", - "putout": "^13.0.0", + "putout": "^14.0.0", "redzip": "^1.3.0", "rendy": "^3.0.0", "restafary": "^9.1.0", From 1b5a6a3721ba7a5e07a741d6a2899afd7e5bedd3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 30 Jan 2021 11:19:10 +0200 Subject: [PATCH 0010/1230] feature(cloudcmd) improve error handling when viewing or editing a file --- .eslintrc.js | 5 +++++ client/dom/index.js | 40 +++++++++++---------------------- client/modules/edit-file-vim.js | 8 ++++--- client/modules/edit-file.js | 37 +++++++++++++++--------------- client/modules/menu.js | 29 ++++++++++++------------ client/modules/view/index.js | 30 ++++++++++++------------- 6 files changed, 72 insertions(+), 77 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d2cc8b7b..7b6b53ac 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,6 +20,11 @@ module.exports = { extends: [ 'plugin:node/recommended', ], + }, { + files: ['client/dom/index.js'], + rules: { + 'no-multi-spaces': 'off', + }, }, { files: ['bin/cloudcmd.js'], rules: { diff --git a/client/dom/index.js b/client/dom/index.js index 3c2edf73..f1dce437 100644 --- a/client/dom/index.js +++ b/client/dom/index.js @@ -1,11 +1,8 @@ -/* global CloudCmd */ - 'use strict'; -const tryToPromiseAll = require('../../common/try-to-promise-all'); +/* global CloudCmd */ const Util = require('../../common/util'); -const callbackify = require('../../common/callbackify'); const Images = require('./images'); const load = require('./load'); @@ -302,15 +299,12 @@ module.exports.getCurrentOwner = (currentFile) => { return owner.textContent; }; -const mixArgs = (f) => (a, b) => f(b, a); - /** * unified way to get current file content * - * @param callback * @param currentFile */ -module.exports.getCurrentData = callbackify(mixArgs(async (callback, currentFile) => { +module.exports.getCurrentData = async (currentFile) => { const {Dialog} = DOM; const Info = DOM.CurrentInfo; const current = currentFile || DOM.getCurrentFile(); @@ -319,27 +313,24 @@ module.exports.getCurrentData = callbackify(mixArgs(async (callback, currentFile if (Info.name === '..') { Dialog.alert.noFiles(); - return callback(Error('No files selected!')); + return [Error('No Files')]; } - if (isDir) { - const [e, data] = await RESTful.read(path); - - if (e) - throw e; - - return data; - } + if (isDir) + return await RESTful.read(path); const [hashNew, hash] = await DOM.checkStorageHash(path); + if (!hashNew) + return [Error(`Can't get hash of a file`)]; + if (hash === hashNew) - return await Storage.get(`${path}-data`); + return [null, await Storage.get(`${path}-data`)]; const [e, data] = await RESTful.read(path); if (e) - return; + return [e, null]; const ONE_MEGABYTE = 1024 * 1024 * 1024; const {length} = data; @@ -347,8 +338,8 @@ module.exports.getCurrentData = callbackify(mixArgs(async (callback, currentFile if (hash && length < ONE_MEGABYTE) await DOM.saveDataToStorage(path, data, hashNew); - return data; -})); + return [null, data]; +}; /** * unified way to get RefreshButton @@ -499,14 +490,11 @@ module.exports.checkStorageHash = async (name) => { if (typeof name !== 'string') throw Error('name should be a string!'); - const [error, loadHash, storeHash] = await tryToPromiseAll([ + const [loadHash, storeHash] = await Promise.all([ DOM.loadCurrentHash(), Storage.get(nameHash), ]); - if (error) - throw error; - return [loadHash, storeHash]; }; @@ -838,8 +826,6 @@ module.exports.updateCurrentInfo = (currentFile) => { const filesPassive = DOM.getFiles(panelPassive); const name = DOM.getCurrentName(current); - /* eslint no-multi-spaces:0 */ - info.dir = DOM.getCurrentDirName(); info.dirPath = DOM.getCurrentDirPath(); info.parentDirPath = DOM.getParentDirPath(); diff --git a/client/modules/edit-file-vim.js b/client/modules/edit-file-vim.js index fe8198af..c9b9c891 100644 --- a/client/modules/edit-file-vim.js +++ b/client/modules/edit-file-vim.js @@ -20,11 +20,13 @@ module.exports.init = async () => { await CloudCmd.EditFile(); }; -module.exports.show = () => { +module.exports.show = async () => { Events.addKey(listener); - CloudCmd.EditFile - .show(ConfigView) + const editFile = await CloudCmd.EditFile + .show(ConfigView); + + editFile .getEditor() .setKeyMap('vim'); }; diff --git a/client/modules/edit-file.js b/client/modules/edit-file.js index ecde15c7..b101ddbb 100644 --- a/client/modules/edit-file.js +++ b/client/modules/edit-file.js @@ -51,7 +51,7 @@ function getName() { return name; } -module.exports.show = (options) => { +module.exports.show = async (options) => { if (isLoading()) return; @@ -69,23 +69,24 @@ module.exports.show = (options) => { .getEditor() .setOption('keyMap', 'default'); - Info.getData((error, data) => { - const {path} = Info; - const name = getName(); - - if (error) - return Images.hide(); - - setMsgChanged(name); - - CloudCmd.Edit - .getEditor() - .setValueFirst(path, data) - .setModeForPath(name) - .enableKey(); - - CloudCmd.Edit.show(optionsEdit); - }); + const [error, data] = await Info.getData(); + + if (error) { + Images.hide(); + return CloudCmd.Edit; + } + + const {path} = Info; + const name = getName(); + setMsgChanged(name); + + CloudCmd.Edit + .getEditor() + .setValueFirst(path, data) + .setModeForPath(name) + .enableKey(); + + CloudCmd.Edit.show(optionsEdit); return CloudCmd.Edit; }; diff --git a/client/modules/menu.js b/client/modules/menu.js index 66a4dbcc..4ecc17cb 100644 --- a/client/modules/menu.js +++ b/client/modules/menu.js @@ -137,14 +137,16 @@ function getMenuData(isAuth) { function getFileMenuData() { const isAuth = CloudCmd.config('auth'); - const show = wrap((name) => { - CloudCmd[name].show(); - }); const menuBottom = getMenuData(isAuth); const menuTop = { - 'View': show('View'), - 'Edit': show('EditFile'), + 'View': () => { + CloudCmd.View.show(); + }, + 'Edit': () => { + const name = config('vim') ? 'EditFileVim' : 'EditFile'; + CloudCmd[name].show(); + }, 'Rename': () => { setTimeout(DOM.renameCurrent, 100); }, @@ -228,16 +230,15 @@ function beforeClick(name) { return MenuShowedName !== name; } -function _uploadTo(nameModule) { - Info.getData((error, data) => { - if (error) - return; - - const {name} = Info; - - CloudCmd.execFromModule(nameModule, 'uploadFile', name, data); - }); +async function _uploadTo(nameModule) { + const [error, data] = await Info.getData(); + if (error) + return; + + const {name} = Info; + + CloudCmd.execFromModule(nameModule, 'uploadFile', name, data); CloudCmd.log('Uploading to ' + name + '...'); } diff --git a/client/modules/view/index.js b/client/modules/view/index.js index aa167d02..0d34df22 100644 --- a/client/modules/view/index.js +++ b/client/modules/view/index.js @@ -128,7 +128,7 @@ async function show(data, options = {}) { switch(type) { default: - return viewFile(); + return await viewFile(); case 'markdown': return await CloudCmd.Markdown.show(Info.path); @@ -199,20 +199,20 @@ async function viewMedia(path) { modal.open(element, allConfig); } -function viewFile() { - Info.getData((error, data) => { - if (error) - return Images.hide(); - - const element = document.createTextNode(data); - const options = Config; - - if (CloudCmd.config('showFileName')) - options.title = Info.name; - - El.append(element); - modal.open(El, options); - }); +async function viewFile() { + const [error, data] = await Info.getData(); + + if (error) + return Images.hide(); + + const element = document.createTextNode(data); + const options = Config; + + if (CloudCmd.config('showFileName')) + options.title = Info.name; + + El.append(element); + modal.open(El, options); } const copy = (a) => assign({}, a); From 3b81abed36bf8e05efb0d56b50e4c1cd7a294927 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 30 Jan 2021 11:20:11 +0200 Subject: [PATCH 0011/1230] feature(package) style-loader v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 02e463fd..ae4fb180 100644 --- a/package.json +++ b/package.json @@ -190,7 +190,7 @@ "serve-once": "^2.0.0", "serviceworker-webpack-plugin": "^1.0.1", "smalltalk": "^4.0.0", - "style-loader": "^1.0.0", + "style-loader": "^2.0.0", "supermenu": "^4.0.1", "supertape": "^4.1.0", "tar-stream": "^2.0.0", From a39ea0d61c48819e9cf7db5f8da9b713ca2a5374 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 30 Jan 2021 11:26:12 +0200 Subject: [PATCH 0012/1230] chore(package) v15.5.0 --- ChangeLog | 9 +++++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 21e17acd..df1dc8be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2021.01.30, v15.5.0 + +feature: +- (package) style-loader v2.0.0 +- (cloudcmd) improve error handling when viewing or editing a file +- (package) putout v14.0.0 +- (package) eslint-plugin-putout v7.0.0 + + 2021.01.26, v15.4.4 feature: diff --git a/HELP.md b/HELP.md index 4bbbb978..ec922770 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.4 +# Cloud Commander v15.5.0 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 1489fc69..44b8ab6a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.4.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.5.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index ae4fb180..3b1e42c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.4.4", + "version": "15.5.0", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 996d99cbac515ef85e0f5588dd47e8f44cd7291d Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 30 Jan 2021 11:41:50 +0200 Subject: [PATCH 0013/1230] docs(readme) require -> import --- HELP.md | 3 ++- README.md | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/HELP.md b/HELP.md index ec922770..9fa838c5 100644 --- a/HELP.md +++ b/HELP.md @@ -666,8 +666,9 @@ And create `index.js`: import http from 'http'; import cloudcmd from 'cloudcmd'; import io from 'socket.io'; -const app = require('express')(); +import express from 'express'; +const app = express(); const port = 1337; const prefix = '/'; diff --git a/README.md b/README.md index 44b8ab6a..2cedda1f 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,9 @@ And create `index.js`: import http from 'http'; import cloudcmd from 'cloudcmd'; import io from 'socket.io'; -const app = require('express')(); +import express from 'express'; + +const app = express(); const port = 1337; const prefix = '/'; From bc80069f185b21e16057d8aefaa35bac95c7d75f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 31 Jan 2021 12:41:53 +0200 Subject: [PATCH 0014/1230] fix(cloudcmd) cannot create a directory (#314) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3b1e42c6..56be39a1 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "ponse": "^6.0.0", "pullout": "^4.0.0", "putout": "^14.0.0", - "redzip": "^1.3.0", + "redzip": "^1.6.4", "rendy": "^3.0.0", "restafary": "^9.1.0", "restbox": "^3.0.0", From a63ce70d4906178ac99768a98ecd447962331455 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 31 Jan 2021 12:46:47 +0200 Subject: [PATCH 0015/1230] chore(package) v15.5.1 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index df1dc8be..a913a943 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.01.31, v15.5.1 + +fix: +- (cloudcmd) cannot create a directory (#314) + + 2021.01.30, v15.5.0 feature: diff --git a/HELP.md b/HELP.md index 9fa838c5..f2c0c71c 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.0 +# Cloud Commander v15.5.1 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 2cedda1f..3948c363 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.5.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 56be39a1..24faa18e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.5.0", + "version": "15.5.1", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 2fc6c6e1a1f48221445bfc6cfd35c1083e5ce3d0 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 31 Jan 2021 12:48:35 +0200 Subject: [PATCH 0016/1230] docs(changelog) 314 -> 319 --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index a913a943..600bf95a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ 2021.01.31, v15.5.1 fix: -- (cloudcmd) cannot create a directory (#314) +- (cloudcmd) cannot create a directory (#319) 2021.01.30, v15.5.0 From 3cd1d67e5863122ee534860f65b0b5a51c8e3a62 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 2 Feb 2021 13:43:12 +0200 Subject: [PATCH 0017/1230] fix(client) view: isAudio (#322) --- client/modules/view/types.js | 2 +- client/modules/view/types.spec.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 client/modules/view/types.spec.js diff --git a/client/modules/view/types.js b/client/modules/view/types.js index f8797694..c1f8a7d9 100644 --- a/client/modules/view/types.js +++ b/client/modules/view/types.js @@ -46,7 +46,7 @@ function isMedia(name) { return isAudio(name) || isVideo(name); } -module.exports.isAudiot = isAudio; +module.exports.isAudio = isAudio; function isAudio(name) { return /\.(mp3|ogg|m4a)$/i.test(name); } diff --git a/client/modules/view/types.spec.js b/client/modules/view/types.spec.js new file mode 100644 index 00000000..f97dc125 --- /dev/null +++ b/client/modules/view/types.spec.js @@ -0,0 +1,19 @@ +'use strict'; + +const test = require('supertape'); +const {isAudio} = require('./types'); + +test('cloudcmd: client: view: isAudio', (t) => { + const result = isAudio('hello.mp3'); + + t.ok(result); + t.end(); +}); + +test('cloudcmd: client: view: isAudio: no', (t) => { + const result = isAudio('hello'); + + t.notOk(result); + t.end(); +}); + From b4f279d07c249bfd8727b86e08707a71518b6029 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 2 Feb 2021 14:03:05 +0200 Subject: [PATCH 0018/1230] chore(cloudcmd) lint --- .madrun.mjs | 5 ++++- bin/cloudcmd.mjs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.madrun.mjs b/.madrun.mjs index c520e332..763eaf69 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -1,4 +1,7 @@ -import {run, cutEnv} from 'madrun'; +import { + run, + cutEnv, +} from 'madrun'; const testEnv = { THREAD_IT_COUNT: 0, diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index d43b06ce..0a20e7e9 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -8,7 +8,10 @@ import tryToCatch from 'try-to-catch'; import {createSimport} from 'simport'; import exit from '../server/exit.js'; -import {createConfig, configPath} from '../server/config.js'; +import { + createConfig, + configPath, +} from '../server/config.js'; const config = createConfig({ configPath, From 0d79531b69734f850f878b2fa5ecac04a327ce14 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 2 Feb 2021 13:52:42 +0200 Subject: [PATCH 0019/1230] chore(package) v15.5.2 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 600bf95a..f750720e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.02.02, v15.5.2 + +fix: +- (client) view: isAudio (#322) + + 2021.01.31, v15.5.1 fix: diff --git a/HELP.md b/HELP.md index f2c0c71c..3f29ce6c 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.1 +# Cloud Commander v15.5.2 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 3948c363..1a6a942c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.5.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 24faa18e..28812eea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.5.1", + "version": "15.5.2", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 2b9705d9fc8d90707e1f29c9a90e571f192f713c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 13:20:33 +0200 Subject: [PATCH 0020/1230] feature(client) view: add ability to detect file type when extension is missing (coderaiser/cloudcmd#287) --- client/modules/view/index.js | 11 +++++---- client/modules/view/types.js | 31 +++++++++++++++++++----- client/modules/view/types.spec.js | 40 +++++++++++++++++++++++++++---- package.json | 2 +- 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/client/modules/view/index.js b/client/modules/view/index.js index 0d34df22..26426429 100644 --- a/client/modules/view/index.js +++ b/client/modules/view/index.js @@ -124,7 +124,7 @@ async function show(data, options = {}) { Images.show.load(); const path = prefixURL + Info.path; - const type = options.raw ? '' : getType(path); + const type = options.raw ? '' : await getType(path); switch(type) { default: @@ -137,7 +137,7 @@ async function show(data, options = {}) { return viewHtml(path); case 'image': - return viewImage(prefixURL); + return viewImage(Info.path, prefixURL); case 'media': return await viewMedia(path); @@ -245,17 +245,18 @@ function hide() { modal.close(); } -function viewImage(prefixURL) { +function viewImage(path, prefixURL) { + const isSupportedImage = (a) => isImage(a) || a === path; const makeTitle = (path) => { return { - href: prefixURL + path, + href: `${prefixURL}${path}`, title: encode(basename(path)), }; }; const names = Info.files .map(DOM.getCurrentPath) - .filter(isImage); + .filter(isSupportedImage); const titles = names .map(makeTitle); diff --git a/client/modules/view/types.js b/client/modules/view/types.js index c1f8a7d9..dd7888bb 100644 --- a/client/modules/view/types.js +++ b/client/modules/view/types.js @@ -1,5 +1,6 @@ 'use strict'; +const {extname} = require('path'); const currify = require('currify'); const testRegExp = currify((name, reg) => reg.test(name)); const getRegExp = (ext) => RegExp(`\\.${ext}$`, 'i'); @@ -8,20 +9,25 @@ const isPDF = (a) => /\.pdf$/i.test(a); const isHTML = (a) => /\.html$/.test(a); const isMarkdown = (a) => /.\.md$/.test(a); -module.exports.getType = (name) => { - if (isPDF(name)) +module.exports.getType = async (path) => { + const ext = extname(path); + + if (!ext) + path = await detectType(path); + + if (isPDF(path)) return 'pdf'; - if (isImage(name)) + if (isImage(path)) return 'image'; - if (isMedia(name)) + if (isMedia(path)) return 'media'; - if (isHTML(name)) + if (isHTML(path)) return 'html'; - if (isMarkdown(name)) + if (isMarkdown(path)) return 'markdown'; }; @@ -54,3 +60,16 @@ function isAudio(name) { function isVideo(name) { return /\.(mp4|avi|webm)$/i.test(name); } + +module.exports._detectType = detectType; +async function detectType(path) { + const {headers} = await fetch(path); + + for (const [name, value] of headers) { + if (name === 'content-type') + return `.${value.split('/').pop()}`; + } + + return ''; +} + diff --git a/client/modules/view/types.spec.js b/client/modules/view/types.spec.js index f97dc125..d0e486f5 100644 --- a/client/modules/view/types.spec.js +++ b/client/modules/view/types.spec.js @@ -1,19 +1,51 @@ 'use strict'; -const test = require('supertape'); -const {isAudio} = require('./types'); +const {test, stub} = require('supertape'); +const {isAudio, _detectType} = require('./types'); -test('cloudcmd: client: view: isAudio', (t) => { +test('cloudcmd: client: view: types: isAudio', (t) => { const result = isAudio('hello.mp3'); t.ok(result); t.end(); }); -test('cloudcmd: client: view: isAudio: no', (t) => { +test('cloudcmd: client: view: types: isAudio: no', (t) => { const result = isAudio('hello'); t.notOk(result); t.end(); }); +test('cloudcmd: client: view: types: detectType', async (t) => { + const fetch = stub().returns({ + headers: [], + }); + + const originalFetch = global.fetch; + global.fetch = fetch; + await _detectType('/hello'); + + global.fetch = originalFetch; + + t.calledWith(fetch, ['/hello']); + t.end(); +}); + +test('cloudcmd: client: view: types: detectType: found', async (t) => { + const fetch = stub().returns({ + headers: [ + ['content-type', 'image/png'], + ], + }); + + const originalFetch = global.fetch; + global.fetch = fetch; + const result = await _detectType('/hello'); + + global.fetch = originalFetch; + + t.equal(result, '.png'); + t.end(); +}); + diff --git a/package.json b/package.json index 28812eea..e4c593b8 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "putout": "^14.0.0", "redzip": "^1.6.4", "rendy": "^3.0.0", - "restafary": "^9.1.0", + "restafary": "^9.5.0", "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", From 5e545c87b39f4b8497daba6bd9a73f6eb9010ed8 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 13:22:38 +0200 Subject: [PATCH 0021/1230] chore(package) v15.6.0 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index f750720e..a203960c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.02.03, v15.6.0 + +feature: +- (client) view: add ability to detect file type when extension is missing (coderaiser/cloudcmd#287) + + 2021.02.02, v15.5.2 fix: diff --git a/HELP.md b/HELP.md index 3f29ce6c..72838404 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.2 +# Cloud Commander v15.6.0 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 1a6a942c..09f07a6d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.5.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.6.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index e4c593b8..26814456 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.5.2", + "version": "15.6.0", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 60607184d4f4f145795cf2782d17bf31fdc7b62c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 13:53:41 +0200 Subject: [PATCH 0022/1230] feature(client) view: unknown file type: method: GET -> HEAD: speed up --- client/modules/view/types.js | 4 +++- client/modules/view/types.spec.js | 7 ++++++- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/client/modules/view/types.js b/client/modules/view/types.js index dd7888bb..c4cf5ce6 100644 --- a/client/modules/view/types.js +++ b/client/modules/view/types.js @@ -63,7 +63,9 @@ function isVideo(name) { module.exports._detectType = detectType; async function detectType(path) { - const {headers} = await fetch(path); + const {headers} = await fetch(path, { + method: 'HEAD', + }); for (const [name, value] of headers) { if (name === 'content-type') diff --git a/client/modules/view/types.spec.js b/client/modules/view/types.spec.js index d0e486f5..8df0c9da 100644 --- a/client/modules/view/types.spec.js +++ b/client/modules/view/types.spec.js @@ -27,8 +27,13 @@ test('cloudcmd: client: view: types: detectType', async (t) => { await _detectType('/hello'); global.fetch = originalFetch; + const expected = [ + '/hello', { + method: 'HEAD', + } + ]; - t.calledWith(fetch, ['/hello']); + t.calledWith(fetch, expected); t.end(); }); diff --git a/package.json b/package.json index 26814456..0e147979 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "putout": "^14.0.0", "redzip": "^1.6.4", "rendy": "^3.0.0", - "restafary": "^9.5.0", + "restafary": "^9.6.0", "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", From fce254f724f1509d24c9046c88843c21aa389268 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 14:03:50 +0200 Subject: [PATCH 0023/1230] chore(github-actions) add ability to autofix lint --- .github/workflows/nodejs.yml | 46 ++++++++++++++++++++++++------------ .madrun.mjs | 1 + 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index eb9bdaea..4d531b10 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -5,6 +5,8 @@ on: [push] jobs: build: runs-on: ubuntu-latest + env: + NAME: putout steps: - uses: actions/checkout@master @@ -13,23 +15,37 @@ jobs: with: node-version: 14.x - - name: install - run: | + - name: Install Redrun + run: + npm i redrun -g + + - name: Install + run: npm install - - name: lint - run: | - npm run lint + - name: Lint + run: + redrun fix:lint + + - name: Commit fixes + uses: EndBug/add-and-commit@v7 + with: + message: 'chore(${{ env.NAME }}) lint using actions' - - name: build - run: | - npm run build - npm test + - name: Build + run: + redrun build - - name: test - run: | - npm test + - name: Test + run: + redrun test + + - name: Coverage + run: + redrun coverage coverage:report + + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - - name: coverage - run: | - npm run coverage diff --git a/.madrun.mjs b/.madrun.mjs index 763eaf69..fedcce38 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -28,6 +28,7 @@ export default { 'wisdom': () => run(['lint:all', 'build', 'test']), 'wisdom:type': () => 'bin/release.mjs', 'coverage': async () => [testEnv, `nyc ${await cutEnv('test')}`], + 'coverage:report': () => 'nyc report --reporter=lcov', 'report': () => 'nyc report --reporter=text-lcov | coveralls', '6to5': () => 'webpack --progress', '6to5:client': () => run('6to5', '--mode production'), From 135edafaeeabb769ed00f731f21c57603272d09a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 21:04:10 +0200 Subject: [PATCH 0024/1230] feature(package) @cloudcmd/olark v3.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e147979..72788253 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "@cloudcmd/clipboard": "^2.0.0", "@cloudcmd/create-element": "^2.0.0", "@cloudcmd/modal": "^2.0.0", - "@cloudcmd/olark": "^3.0.0", + "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^3.0.0", "auto-globals": "^2.0.0", "babel-loader": "^8.0.0", From 77bd89f8f7081b3463c758a9972c0135c9148a7f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Feb 2021 19:07:12 +0000 Subject: [PATCH 0025/1230] chore(putout) lint using actions --- client/modules/view/types.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/modules/view/types.spec.js b/client/modules/view/types.spec.js index 8df0c9da..fc93fa97 100644 --- a/client/modules/view/types.spec.js +++ b/client/modules/view/types.spec.js @@ -30,7 +30,7 @@ test('cloudcmd: client: view: types: detectType', async (t) => { const expected = [ '/hello', { method: 'HEAD', - } + }, ]; t.calledWith(fetch, expected); From 955b7f0c4c103f871639c0d3bbb2a3336a2c795c Mon Sep 17 00:00:00 2001 From: Frak Date: Thu, 4 Feb 2021 14:55:01 -0500 Subject: [PATCH 0026/1230] docs(README) add documentation link --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 09f07a6d..700bd085 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,11 @@ When you create this file run: docker-compose up ``` +## Documentation + +https://cloudcmd.io/ + + ## Get involved There is a lot ways to be involved in `Cloud Commander` development: From 47883b87519b0aad95c0a9464877e87fa5aed36e Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 4 Feb 2021 21:55:46 +0200 Subject: [PATCH 0027/1230] docs(readme) Documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 700bd085..4f08ad7e 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ docker-compose up ## Documentation -https://cloudcmd.io/ +More documentation you can find on https://cloudcmd.io/. ## Get involved From 983ccac4d10e584b0c574f69e89713e841fd4b9c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 5 Feb 2021 11:11:38 +0200 Subject: [PATCH 0028/1230] docs(readme) Docker: add "\n" --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4f08ad7e..8f177636 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ server.listen(port); ## Docker The docker images are provided for multiple architectures and types. The following list shows all existing images: + | Architecture | Type | |----------------|--------------| | amd64 | linux | From 3ac0bf23e4dbc253c5328a5515687a7cac7ee292 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 7 Feb 2021 15:11:26 +0200 Subject: [PATCH 0029/1230] chore(cloudcmd-hq) add --- .npmignore | 1 + img/logo/cloudcmd-hq.png | Bin 0 -> 84078 bytes 2 files changed, 1 insertion(+) create mode 100644 img/logo/cloudcmd-hq.png diff --git a/.npmignore b/.npmignore index 5612b3c3..de3559c7 100644 --- a/.npmignore +++ b/.npmignore @@ -22,6 +22,7 @@ manifest.yml bin/release.js client +img/logo/cloudcmd-hq.png webpack.config.js diff --git a/img/logo/cloudcmd-hq.png b/img/logo/cloudcmd-hq.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4d1d3b07fdda90034cbe132474077bf814faf7 GIT binary patch literal 84078 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 Date: Tue, 9 Feb 2021 13:22:21 +0200 Subject: [PATCH 0030/1230] docs(readme) add link to patreon --- HELP.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/HELP.md b/HELP.md index 72838404..9c36badc 100644 --- a/HELP.md +++ b/HELP.md @@ -951,6 +951,7 @@ While using Dropbox remember that there is no remote support for the console/ter There are a lot of ways to be involved in `Cloud Commander` development: +- support project on patreon: https://patreon.com/coderaiser; - if you find a bug or have an idea to share, [create an issue](https://github.com/coderaiser/cloudcmd/issues/new "Create issue"); - if you fixed a bug, typo or implemented a new feature, [create a pull request](https://github.com/coderaiser/cloudcmd/compare "Create pull request"); - if you know a language not currently translated, or would like to improve an existing translation, you can help with [site translations](https://github.com/coderaiser/cloudcmd/wiki "Cloud Commander community wiki"); diff --git a/README.md b/README.md index 8f177636..8f78b5fa 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,7 @@ More documentation you can find on https://cloudcmd.io/. There is a lot ways to be involved in `Cloud Commander` development: +- support project on patreon: https://patreon.com/coderaiser; - if you find a bug or got idea to share [create an issue](https://github.com/coderaiser/cloudcmd/issues/new "Create issue"); - if you fixed a bug, typo or implemented new feature [create pull request](https://github.com/coderaiser/cloudcmd/compare "Create pull request"); - if you know languages you can help with [site translations](https://github.com/coderaiser/cloudcmd/wiki "Cloud Commander community wiki"); From 75361de125e9ee89d4b02f7f6e57bf72b8345b37 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 13:32:22 +0200 Subject: [PATCH 0031/1230] refactor(release) promisify --- bin/release.mjs | 69 ++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/bin/release.mjs b/bin/release.mjs index b7a6b053..ff0f05ca 100755 --- a/bin/release.mjs +++ b/bin/release.mjs @@ -1,24 +1,25 @@ #!/usr/bin/env node +import {promisify} from 'util'; + +import tryToCatch from 'try-to-catch'; import {createSimport} from 'simport'; import minor from 'minor'; -import place from 'place'; +import _place from 'place'; import rendy from 'rendy'; import shortdate from 'shortdate'; const simport = createSimport(import.meta.url); +const place = promisify(_place); + +debugger; const Info = await simport('../package.json'); -const ERROR = Error('ERROR: version is missing. release --patch|--minor|--major'); +await main(); -main((error) => { - if (error) - console.error(error.message); -}); - -function main(callback) { - const history = 'Version history\n---------------\n'; +async function main() { + const history = '## Version history\n\n'; const link = '//github.com/coderaiser/cloudcmd/releases/tag/'; const template = '- *{{ date }}*, ' + '**[v{{ version }}]' + @@ -26,42 +27,44 @@ function main(callback) { const {version} = Info; - cl((error, versionNew) => { - if (error) - return callback(error); + const [error, versionNew] = await tryToCatch(cl); + + if (error) + return console.error(error); - replaceVersion('README.md', version, versionNew, callback); - replaceVersion('HELP.md', version, versionNew, () => { - const historyNew = history + rendy(template, { - date : shortdate(), - version : versionNew, - }); - - replaceVersion('HELP.md', history, historyNew, callback); - }); + await replaceVersion('README.md', version, versionNew); + await replaceVersion('HELP.md', version, versionNew); + + const historyNew = history + rendy(template, { + date : shortdate(), + version : versionNew, }); + + await replaceVersion('HELP.md', history, historyNew); } -function replaceVersion(name, version, versionNew, callback) { - place(name, version, versionNew, (error) => { - if (error) - return callback(error); - - callback(null, 'done: ' + name); - }); +async function replaceVersion(name, version, versionNew, callback) { + const [error] = await tryToCatch(place, name, version, versionNew); + + if (error) + return console.error(error); + + console.log('done: ' + name); } -function cl(callback) { +async function cl() { const {argv} = process; const length = argv.length - 1; const last = process.argv[length]; const regExp = /^--(major|minor|patch)$/; const [, match] = last.match(regExp) || []; - if (!regExp.test(last)) - return callback(ERROR); + console.log(last); - callback(null, getVersionNew(last, match)); + if (!regExp.test(last)) + throw Error('ERROR: version is missing. release --patch|--minor|--major'); + + return getVersionNew(last, match); } function getVersionNew(last, match) { @@ -69,5 +72,5 @@ function getVersionNew(last, match) { return minor(match, Info.version); return last.substr(3); -} +}; From 0128014f512a0ae6005f06fb4a090a4ee64d8403 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 13:39:43 +0200 Subject: [PATCH 0032/1230] chore(gitignore) add .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e5ad5994..579f17a5 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ modules/emitify *.swp .putoutcache +.DS_Store dist dist-dev From 0c7cc3c0a2e82b18aae7339aabe20af34aace20f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 13:50:20 +0200 Subject: [PATCH 0033/1230] docs(help) add versions history --- HELP.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index 9c36badc..ea75f526 100644 --- a/HELP.md +++ b/HELP.md @@ -957,7 +957,25 @@ There are a lot of ways to be involved in `Cloud Commander` development: - if you know a language not currently translated, or would like to improve an existing translation, you can help with [site translations](https://github.com/coderaiser/cloudcmd/wiki "Cloud Commander community wiki"); ## Version history - +- *2021.02.03*, **[v15.6.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.6.0)** +- *2021.02.02*, **[v15.5.2](//github.com/coderaiser/cloudcmd/releases/tag/v15.5.2)** +- *2021.01.31*, **[v15.5.1](//github.com/coderaiser/cloudcmd/releases/tag/v15.5.1)** +- *2021.01.30*, **[v15.5.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.5.0)** +- *2021.01.26*, **[v15.4.4](//github.com/coderaiser/cloudcmd/releases/tag/v15.4.4)** +- *2021.01.25*, **[v15.4.3](//github.com/coderaiser/cloudcmd/releases/tag/v15.4.3)** +- *2021.01.21*, **[v15.4.2](//github.com/coderaiser/cloudcmd/releases/tag/v15.4.2)** +- *2021.01.20*, **[v15.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v15.4.1)** +- *2021.01.19*, **[v15.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.4.0)** +- *2021.01.19*, **[v15.3.4](//github.com/coderaiser/cloudcmd/releases/tag/v15.3.4)** +- *2021.01.17*, **[v15.3.1](//github.com/coderaiser/cloudcmd/releases/tag/v15.3.1)** +- *2021.01.17*, **[v15.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.3.0)** +- *2021.01.16*, **[v15.2.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.2.0)** +- *2021.01.07*, **[v15.1.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.1.0)** +- *2021.01.05*, **[v15.0.4](//github.com/coderaiser/cloudcmd/releases/tag/v15.0.4)** +- *2020.01.05*, **[v15.0.3](//github.com/coderaiser/cloudcmd/releases/tag/v15.0.3)** +- *2020.12.31*, **[v15.0.2](//github.com/coderaiser/cloudcmd/releases/tag/v15.0.2)** +- *2020.12.30*, **[v15.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v15.0.1)** +- *2020.12.28*, **[v15.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v15.0.0)** - *2020.08.21*, **[v14.9.3](//github.com/coderaiser/cloudcmd/releases/tag/v14.9.3)** - *2020.08.19*, **[v14.9.2](//github.com/coderaiser/cloudcmd/releases/tag/v14.9.2)** - *2020.08.16*, **[v14.9.1](//github.com/coderaiser/cloudcmd/releases/tag/v14.9.1)** From bbb6d46c09843aa7111b60139dfe790aad0f5d8a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 13:53:09 +0200 Subject: [PATCH 0034/1230] chore(package) coverage:report --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 72788253..b0de1d88 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "wisdom": "madrun wisdom", "wisdom:type": "madrun wisdom:type", "coverage": "madrun coverage", + "coverage:report": "madrun coverage:report", "report": "madrun report", "6to5": "madrun 6to5", "6to5:client": "madrun 6to5:client", From f97677f3843195c4b61ac36cbbd440472b1a2a21 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 11:54:09 +0000 Subject: [PATCH 0035/1230] chore(putout) lint using actions --- bin/release.mjs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/release.mjs b/bin/release.mjs index ff0f05ca..d484991c 100755 --- a/bin/release.mjs +++ b/bin/release.mjs @@ -12,8 +12,6 @@ import shortdate from 'shortdate'; const simport = createSimport(import.meta.url); const place = promisify(_place); -debugger; - const Info = await simport('../package.json'); await main(); @@ -31,7 +29,7 @@ async function main() { if (error) return console.error(error); - + await replaceVersion('README.md', version, versionNew); await replaceVersion('HELP.md', version, versionNew); @@ -43,7 +41,7 @@ async function main() { await replaceVersion('HELP.md', history, historyNew); } -async function replaceVersion(name, version, versionNew, callback) { +async function replaceVersion(name, version, versionNew) { const [error] = await tryToCatch(place, name, version, versionNew); if (error) @@ -72,5 +70,5 @@ function getVersionNew(last, match) { return minor(match, Info.version); return last.substr(3); -}; +} From 70c8ab537cf1eb779fee75965bd0bac4d2636421 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 9 Feb 2021 14:46:41 +0200 Subject: [PATCH 0036/1230] chore(actions) nodejs: putout -> cloudcmd --- .github/workflows/nodejs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 4d531b10..f56766f6 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -6,7 +6,7 @@ jobs: build: runs-on: ubuntu-latest env: - NAME: putout + NAME: cloudcmd steps: - uses: actions/checkout@master From d8f0e92727236b96a6a10875f3317ad873113afe Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 10 Feb 2021 12:22:14 +0200 Subject: [PATCH 0037/1230] feature(package) copymitter v6.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0de1d88..ae903ed7 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "chalk": "^4.0.0", "compression": "^1.7.4", "console-io": "^13.0.0", - "copymitter": "^5.0.0", + "copymitter": "^6.0.0", "criton": "^2.0.0", "currify": "^4.0.0", "deepmerge": "^4.0.0", From 2e75ca18f4ad5aa3b2d397804583b8d399dc9c75 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 11 Feb 2021 14:00:08 +0200 Subject: [PATCH 0038/1230] feature(package) putout v15.0.0 --- .gitignore | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 579f17a5..1d755557 100644 --- a/.gitignore +++ b/.gitignore @@ -11,9 +11,9 @@ modules/emitify .nyc_output *.swp -.putoutcache .DS_Store dist dist-dev +.putoutcache diff --git a/package.json b/package.json index ae903ed7..3ea82dda 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "package-json": "^6.0.0", "ponse": "^6.0.0", "pullout": "^4.0.0", - "putout": "^14.0.0", + "putout": "^15.0.0", "redzip": "^1.6.4", "rendy": "^3.0.0", "restafary": "^9.6.0", From 04e54f2794dbfe83eee41b866a1908dcb7a59617 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 13 Feb 2021 12:33:00 +0200 Subject: [PATCH 0039/1230] chore(cloudcmd) lint --- .gitignore | 1 - .madrun.mjs | 4 ++-- package.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 1d755557..690e9c07 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ modules/emitify dist dist-dev -.putoutcache diff --git a/.madrun.mjs b/.madrun.mjs index fedcce38..004673ba 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -27,9 +27,9 @@ export default { 'test:server': () => `tape 'test/**/*.js' 'server/**/*.spec.js' 'common/**/*.spec.js'`, 'wisdom': () => run(['lint:all', 'build', 'test']), 'wisdom:type': () => 'bin/release.mjs', - 'coverage': async () => [testEnv, `nyc ${await cutEnv('test')}`], + 'coverage': async () => [testEnv, `c8 ${await cutEnv('test')}`], 'coverage:report': () => 'nyc report --reporter=lcov', - 'report': () => 'nyc report --reporter=text-lcov | coveralls', + 'report': () => 'c8 report --reporter=text-lcov | coveralls', '6to5': () => 'webpack --progress', '6to5:client': () => run('6to5', '--mode production'), '6to5:client:dev': async () => await run('6to5', '--mode development', { diff --git a/package.json b/package.json index 3ea82dda..558fa94f 100644 --- a/package.json +++ b/package.json @@ -152,6 +152,7 @@ "auto-globals": "^2.0.0", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.0", + "c8": "^7.5.0", "cheerio": "^1.0.0-rc.5", "clean-css-loader": "^2.0.0", "codegen.macro": "^4.0.0", @@ -180,7 +181,6 @@ "morgan": "^1.6.1", "multi-rename": "^2.0.0", "nodemon": "^2.0.1", - "nyc": "^15.0.0", "optimize-css-assets-webpack-plugin": "^5.0.0", "philip": "^2.0.0", "place": "^1.1.4", From 2a5ebe300d51cd6bbe5cc6f3d506b314a3afa770 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 13 Feb 2021 15:04:09 +0200 Subject: [PATCH 0040/1230] chore(putout) ignore: html --- .putout.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.putout.json b/.putout.json index 0b4fcd1e..9827b5e3 100644 --- a/.putout.json +++ b/.putout.json @@ -1,5 +1,6 @@ { "ignore": [ + "html", "fixture*", "app.json", "fontello.json" From e3d373acf97737dbc2ac1900b32431a043a52b81 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 17 Feb 2021 14:08:57 +0200 Subject: [PATCH 0041/1230] chore(madrun) nyc -> c8 --- .madrun.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.madrun.mjs b/.madrun.mjs index 004673ba..64a8db9b 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -28,7 +28,7 @@ export default { 'wisdom': () => run(['lint:all', 'build', 'test']), 'wisdom:type': () => 'bin/release.mjs', 'coverage': async () => [testEnv, `c8 ${await cutEnv('test')}`], - 'coverage:report': () => 'nyc report --reporter=lcov', + 'coverage:report': () => 'c8 report --reporter=lcov', 'report': () => 'c8 report --reporter=text-lcov | coveralls', '6to5': () => 'webpack --progress', '6to5:client': () => run('6to5', '--mode production'), From a108bd82b516e357a0e415d720b3d46447121089 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 19 Feb 2021 22:12:30 +0200 Subject: [PATCH 0042/1230] feature(package) @cloudcmd/move-files v4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 558fa94f..a5762855 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "dependencies": { "@cloudcmd/dropbox": "^4.0.1", "@cloudcmd/fileop": "^5.0.0", - "@cloudcmd/move-files": "^3.0.0", + "@cloudcmd/move-files": "^4.0.0", "@cloudcmd/read-files-sync": "^2.0.0", "@putout/plugin-cloudcmd": "^1.2.0", "apart": "^2.0.0", From bcc11bda7467a6a03d372cedb38d72af3986317d Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 19 Feb 2021 22:26:13 +0200 Subject: [PATCH 0043/1230] chore(lint) add progress --- .madrun.mjs | 3 ++- .yaspellerrc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.madrun.mjs b/.madrun.mjs index 64a8db9b..c967f74f 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -14,8 +14,9 @@ export default { }), 'build:start': () => run(['build:client', 'start']), 'build:start:dev': () => run(['build:client:dev', 'start:dev']), - 'lint:all': () => run(['lint', 'spell']), + 'lint:all': () => run(['lint:progress', 'spell']), 'lint': () => 'putout .', + 'lint:progress': () => run('lint', '-f progress'), 'watch:lint': () => 'nodemon -w client -w server -w test -w common -w .webpack -x "putout -s"', 'fresh:lint': () => run('lint', '--fresh'), 'lint:fresh': () => run('lint', '--fresh'), diff --git a/.yaspellerrc b/.yaspellerrc index e47843b7..2df4b282 100644 --- a/.yaspellerrc +++ b/.yaspellerrc @@ -55,6 +55,7 @@ "nginx", "npm", "or io", + "patreon", "refactor", "sexualized", "sslPort", From b18c738f5b10c3f6d8518f4344d13dcc6ed6bb17 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 19 Feb 2021 22:27:41 +0200 Subject: [PATCH 0044/1230] chore(package) v15.7.0 --- ChangeLog | 13 +++++++++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index a203960c..ad5967f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2021.02.19, v15.7.0 + +fix: +- chore(github-actions) add ability to autofix lint + +feature: +- (package) @cloudcmd/move-files v4.0.0 +- (package) putout v15.0.0 +- (package) copymitter v6.0.0 +- (package) @cloudcmd/olark v3.0.2 +- (client) view: unknown file type: method: GET -> HEAD: speed up + + 2021.02.03, v15.6.0 feature: diff --git a/HELP.md b/HELP.md index ea75f526..23fd7cdf 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.6.0 +# Cloud Commander v15.7.0 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 8f78b5fa..80224e3e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.6.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.7.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index a5762855..a9f7e5ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.6.0", + "version": "15.7.0", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 07fe299ad684e5e1469114e88af7c7349c808efe Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 21 Feb 2021 11:25:32 +0200 Subject: [PATCH 0045/1230] fix(cloudcmd) prefix env has no effect (#328) --- bin/cloudcmd.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 0a20e7e9..74824584 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -95,7 +95,7 @@ const args = require('minimist')(argv.slice(2), { 'zip' : config('zip'), 'username' : env('username') || config('username'), 'root' : choose(env('root'), config('root')), - 'prefix' : choose(env('cloudcmd_prefix'), config('prefix')), + 'prefix' : choose(env('prefix'), config('prefix')), 'console' : choose(env.bool('console'), config('console')), 'contact' : choose(env.bool('contact'), config('contact')), 'terminal' : choose(env.bool('terminal'), config('terminal')), From 71a7e9dd938b1113d5975b3c261e82ce03e17b92 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 21 Feb 2021 11:35:51 +0200 Subject: [PATCH 0046/1230] chore(package) v15.7.1 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index ad5967f0..13100880 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.02.21, v15.7.1 + +fix: +- (cloudcmd) prefix env has no effect (#328) + + 2021.02.19, v15.7.0 fix: diff --git a/HELP.md b/HELP.md index 23fd7cdf..8c46b30e 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.7.0 +# Cloud Commander v15.7.1 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 80224e3e..62609fe7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.7.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.7.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index a9f7e5ce..3079d285 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.7.0", + "version": "15.7.1", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 0831723565250aec5493260728685658b48a3171 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 22 Feb 2021 00:18:07 +0200 Subject: [PATCH 0047/1230] chore(cloudcmd) rm dead code --- server/cloudcmd.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/cloudcmd.js b/server/cloudcmd.js index 845f92c7..6faa6ed0 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.js @@ -34,7 +34,6 @@ const dword = require('dword'); const deepword = require('deepword'); const nomine = require('nomine'); const fileop = require('@cloudcmd/fileop'); -//const readzip = require('readzip/lib/middle.js'); const isDev = process.env.NODE_ENV === 'development'; const getDist = (isDev) => isDev ? 'dist-dev' : 'dist'; @@ -239,13 +238,6 @@ function cloudcmd({modules, config}) { token: dropboxToken, }), - /* - readzip({ - prefix: cloudfunc.apiURL + '/fs', - root, - }), - */ - restafary({ prefix: cloudfunc.apiURL + '/fs', root, From f0fd4031bb595efff286d68b2874399464a4b383 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 23 Feb 2021 12:45:30 +0200 Subject: [PATCH 0048/1230] feature(package) supertape v5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3079d285..0b4c58b3 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "smalltalk": "^4.0.0", "style-loader": "^2.0.0", "supermenu": "^4.0.1", - "supertape": "^4.1.0", + "supertape": "^5.0.0", "tar-stream": "^2.0.0", "unionfs": "^4.0.0", "url-loader": "^4.0.0", From 40f885e7c4cced90c9b4bb2472783740858a0cc2 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 23 Feb 2021 12:54:35 +0200 Subject: [PATCH 0049/1230] feature(cloudcmd) add ability to suggest option, when wrong provided --- bin/cloudcmd.mjs | 53 +++++++++++++++++++++++++++++++++++------------- package.json | 5 +++-- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 74824584..5971faba 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -6,6 +6,7 @@ import {createRequire} from 'module'; import {promisify} from 'util'; import tryToCatch from 'try-to-catch'; import {createSimport} from 'simport'; +import parse from 'yargs-parser'; import exit from '../server/exit.js'; import { @@ -34,8 +35,21 @@ const require = createRequire(import.meta.url); const Info = require('../package.json'); -const {argv} = process; -const args = require('minimist')(argv.slice(2), { +const maybeRoot = (a) => { + if (a === '.') + return process.cwd(); + + return a; +}; + +const yargsOptions = { + configuration: { + 'strip-aliased': true, + 'strip-dashed': true, + }, + coerce: { + root: maybeRoot, + }, string: [ 'name', 'port', @@ -81,6 +95,7 @@ const args = require('minimist')(argv.slice(2), { 'import', 'import-listen', 'log', + 'zip', 'dropbox', ], default: { @@ -127,19 +142,19 @@ const args = require('minimist')(argv.slice(2), { 'dropbox-token': config('dropboxToken'), }, alias: { - v: 'version', - h: 'help', - p: 'password', - o: 'online', - u: 'username', - s: 'save', - a: 'auth', - c: 'config', + version: 'v', + help: 'h', + password: 'p', + online: 'o', + username: 'u', + save: 's', + auth: 'a', + config: 'c', }, - unknown: (cmd) => { - exit('\'%s\' is not a cloudcmd option. See \'cloudcmd --help\'.', cmd); - }, -}); +}; + +const {argv} = process; +const args = parse(argv.slice(2), yargsOptions); if (args.version) version(); @@ -149,6 +164,16 @@ else main(); async function main() { + const validateArgs = await simport('@putout/cli-validate-args'); + + const error = await validateArgs(args, [ + ...yargsOptions.boolean, + ...yargsOptions.string, + ]); + + if (error) + return exit(error); + if (args.repl) repl(); diff --git a/package.json b/package.json index 0b4c58b3..6d709ad7 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "@cloudcmd/fileop": "^5.0.0", "@cloudcmd/move-files": "^4.0.0", "@cloudcmd/read-files-sync": "^2.0.0", + "@putout/cli-validate-args": "^1.0.1", "@putout/plugin-cloudcmd": "^1.2.0", "apart": "^2.0.0", "chalk": "^4.0.0", @@ -111,7 +112,6 @@ "just-snake-case": "^1.1.0", "markdown-it": "^12.0.0", "mellow": "^3.0.0", - "minimist": "^1.2.0", "nomine": "^4.0.0", "object.omit": "^3.0.0", "once": "^1.4.0", @@ -137,7 +137,8 @@ "tryrequire": "^3.0.0", "win32": "^5.1.11", "wraptile": "^3.0.0", - "writejson": "^3.0.0" + "writejson": "^3.0.0", + "yargs-parser": "^20.2.5" }, "devDependencies": { "@babel/code-frame": "^7.5.5", From a6a1e80afb994a83fdda8d1777580c953e4f4414 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 23 Feb 2021 14:31:19 +0200 Subject: [PATCH 0050/1230] chore(package) v15.8.0 --- ChangeLog | 7 +++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13100880..218aac3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2021.02.23, v15.8.0 + +feature: +- (cloudcmd) add ability to suggest option, when wrong provided +- (package) supertape v5.0.0 + + 2021.02.21, v15.7.1 fix: diff --git a/HELP.md b/HELP.md index 8c46b30e..d588e118 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.7.1 +# Cloud Commander v15.8.0 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 62609fe7..233cf079 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.7.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.8.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 6d709ad7..a64ce306 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.7.1", + "version": "15.8.0", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 6622d508af70ae1330d2bb224e655b0565035dd4 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 16:06:54 +0200 Subject: [PATCH 0051/1230] feature(package) restafary v9.7.0 (#330) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a64ce306..f661771d 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "putout": "^15.0.0", "redzip": "^1.6.4", "rendy": "^3.0.0", - "restafary": "^9.6.0", + "restafary": "^9.7.0", "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", From 1a5dc6228c8e6f42ffd3a190fbc6d1a9a7717c89 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 14:10:23 +0000 Subject: [PATCH 0052/1230] chore(cloudcmd) lint using actions --- .madrun.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.madrun.mjs b/.madrun.mjs index c967f74f..248a9243 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -30,7 +30,7 @@ export default { 'wisdom:type': () => 'bin/release.mjs', 'coverage': async () => [testEnv, `c8 ${await cutEnv('test')}`], 'coverage:report': () => 'c8 report --reporter=lcov', - 'report': () => 'c8 report --reporter=text-lcov | coveralls', + 'report': () => 'c8 report --reporter=lcov', '6to5': () => 'webpack --progress', '6to5:client': () => run('6to5', '--mode production'), '6to5:client:dev': async () => await run('6to5', '--mode development', { From 775850c004d6f961bea697f1c6d1080650e6df96 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 16:10:45 +0200 Subject: [PATCH 0053/1230] chore(package) v15.8.1 --- ChangeLog | 6 ++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 218aac3c..9b1b01da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021.02.27, v15.8.1 + +feature: +- (package) restafary v9.7.0 (#330) + + 2021.02.23, v15.8.0 feature: diff --git a/HELP.md b/HELP.md index d588e118..7d3db6b0 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.8.0 +# Cloud Commander v15.8.1 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 233cf079..77d39b4a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.8.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.8.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index f661771d..3b6e305d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.8.0", + "version": "15.8.1", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From a092a2fc9d8cdee65728337c6d79d6ff2eb6b183 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 16:11:58 +0200 Subject: [PATCH 0054/1230] chore(travis) rm --- .travis.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 775c27be..00000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: node_js -node_js: - - 15 - - 14 - -cache: - npm: false - -os: - - linux - - os x - -script: - - npm run lint && npm run build && npm run coverage && npm run report - -notifications: - email: - on_success: never - on_failure: change - -sudo: required From fec91e7093b5b82e54d4705ad675996aeb0fbde9 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 20:52:22 +0200 Subject: [PATCH 0055/1230] feature(package) redzip v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3b6e305d..1bf0c627 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "ponse": "^6.0.0", "pullout": "^4.0.0", "putout": "^15.0.0", - "redzip": "^1.6.4", + "redzip": "^2.0.0", "rendy": "^3.0.0", "restafary": "^9.7.0", "restbox": "^3.0.0", From 89af33fb9dc1ddd449086f458db08210267db0ab Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 27 Feb 2021 20:52:32 +0200 Subject: [PATCH 0056/1230] feature(package) win32 v6.0.0 --- package.json | 2 +- server/fixture/route.js | 1 + server/route.js | 1 + server/route.spec.js | 15 +++++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 server/fixture/route.js diff --git a/package.json b/package.json index 1bf0c627..d9b39cc8 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", - "win32": "^5.1.11", + "win32": "^6.0.0", "wraptile": "^3.0.0", "writejson": "^3.0.0", "yargs-parser": "^20.2.5" diff --git a/server/fixture/route.js b/server/fixture/route.js new file mode 100644 index 00000000..ce013625 --- /dev/null +++ b/server/fixture/route.js @@ -0,0 +1 @@ +hello diff --git a/server/route.js b/server/route.js index c243e816..f3a50dfc 100644 --- a/server/route.js +++ b/server/route.js @@ -95,6 +95,7 @@ async function route({config, options, request, response}) { } response.setHeader('Content-Type', contentType(extname(fullPath))); + //response.setHeader('Content-Length', contentLength); await pipe([ stream, diff --git a/server/route.spec.js b/server/route.spec.js index 2c2d6abc..c07c5f69 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -411,3 +411,18 @@ test('cloudcmd: route: dropbox', async (t) => { t.end(); }); +test('cloudcmd: route: content type', async (t) => { + const options = { + root: fixtureDir, + }; + + const {headers} = await request.get('/route.js', { + options, + }); + + const result = headers.get('content-length'); + + t.equal(result, '78'); + t.end(); +}); + From ce511812d5586d8ff9a9c75d069e63b1a552a641 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 28 Feb 2021 10:29:50 +0200 Subject: [PATCH 0057/1230] feature(client) rm unused loadCurrentTime --- client/dom/index.js | 14 -------------- package.json | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/client/dom/index.js b/client/dom/index.js index f1dce437..38b6ddef 100644 --- a/client/dom/index.js +++ b/client/dom/index.js @@ -254,20 +254,6 @@ module.exports.loadCurrentHash = async (currentFile) => { return data; }; -/** - * load current modification time of file - * @callback - * @currentFile - */ -module.exports.loadCurrentTime = async (currentFile) => { - const current = currentFile || DOM.getCurrentFile(); - const query = '?time'; - const link = DOM.getCurrentPath(current); - - const [, data] = await RESTful.read(link + query); - return data; -}; - /** * set size * @currentFile diff --git a/package.json b/package.json index d9b39cc8..07313402 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "putout": "^15.0.0", "redzip": "^2.0.0", "rendy": "^3.0.0", - "restafary": "^9.7.0", + "restafary": "^10.0.0", "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", From f391a3391fe5f152a37ee9ec6ee20f4dc340cf66 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 17:38:37 +0200 Subject: [PATCH 0058/1230] feature(cloudcmd) add archive icon --- css/urls.css | 4 ++++ img/archive.png | Bin 0 -> 386 bytes 2 files changed, 4 insertions(+) create mode 100644 img/archive.png diff --git a/css/urls.css b/css/urls.css index b53c3626..ee6bea39 100644 --- a/css/urls.css +++ b/css/urls.css @@ -45,6 +45,10 @@ background-image: url(../img/file.png); } +.archive, .archive-link { + background-image: url(../img/archive.png); +} + .file-link { background-image: url(../img/file-link.png); } diff --git a/img/archive.png b/img/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4bbccdf1643f4ff5022fbc59b82546e259317e GIT binary patch literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!T Date: Mon, 1 Mar 2021 17:42:21 +0200 Subject: [PATCH 0059/1230] chore(madrun) spell --- .madrun.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.madrun.mjs b/.madrun.mjs index 248a9243..582c19e2 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -20,7 +20,7 @@ export default { 'watch:lint': () => 'nodemon -w client -w server -w test -w common -w .webpack -x "putout -s"', 'fresh:lint': () => run('lint', '--fresh'), 'lint:fresh': () => run('lint', '--fresh'), - 'spell': () => 'yaspeller .', + 'spell': () => 'yaspeller . || true', 'fix:lint': () => run('lint', '--fix'), 'lint:stream': () => run('lint', '-f stream'), 'test': () => [testEnv, `tape 'test/**/*.js' '{client,static,common,server}/**/*.spec.js' -f fail`], From a71dca0e70cc5ece1b2fbd847f887f56bd0ac0cd Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 18:03:12 +0200 Subject: [PATCH 0060/1230] chore(route) set content length --- server/route.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/route.js b/server/route.js index f3a50dfc..787bab4a 100644 --- a/server/route.js +++ b/server/route.js @@ -94,8 +94,10 @@ async function route({config, options, request, response}) { })); } + const {contentLength} = stream; + + response.setHeader('Content-Length', contentLength); response.setHeader('Content-Type', contentType(extname(fullPath))); - //response.setHeader('Content-Length', contentLength); await pipe([ stream, From 33f25729792d0cc20e0f118e50e40e81cef17fec Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 18:04:42 +0200 Subject: [PATCH 0061/1230] test(route) ci --- server/route.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/route.spec.js b/server/route.spec.js index c07c5f69..0752cd80 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -411,7 +411,7 @@ test('cloudcmd: route: dropbox', async (t) => { t.end(); }); -test('cloudcmd: route: content type', async (t) => { +test('cloudcmd: route: content length', async (t) => { const options = { root: fixtureDir, }; @@ -422,7 +422,7 @@ test('cloudcmd: route: content type', async (t) => { const result = headers.get('content-length'); - t.equal(result, '78'); + t.ok(result); t.end(); }); From 2fe6dcf1664b5166531e7b8218bb7aa749cebbd2 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 17:42:50 +0200 Subject: [PATCH 0062/1230] chore(package) v15.9.0 --- ChangeLog | 10 ++++++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9b1b01da..a8a46b7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2021.03.01, v15.9.0 + +feature: +- feature(cloudcmd) add archive icon +- feature(client) rm unused loadCurrentTime +- feature(package) win32 v6.0.0 +- feature(package) redzip v2.0.0 + + + 2021.02.27, v15.8.1 feature: diff --git a/HELP.md b/HELP.md index 7d3db6b0..ac894c29 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.8.1 +# Cloud Commander v15.9.0 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 77d39b4a..92f5ef66 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.8.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.9.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index 07313402..a120a94d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.8.1", + "version": "15.9.0", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From c92815d78d4b043565d00d18cec2b19c5b41453c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 22:32:24 +0200 Subject: [PATCH 0063/1230] feature(cloudcmd) add archive-link image --- css/urls.css | 10 +++++++--- img/archive-link.png | Bin 0 -> 576 bytes 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 img/archive-link.png diff --git a/css/urls.css b/css/urls.css index ee6bea39..7291d6a9 100644 --- a/css/urls.css +++ b/css/urls.css @@ -45,12 +45,16 @@ background-image: url(../img/file.png); } -.archive, .archive-link { +.file-link { + background-image: url(../img/file-link.png); +} + +.archive { background-image: url(../img/archive.png); } -.file-link { - background-image: url(../img/file-link.png); +.archive-link { + background-image: url(../img/archive-link.png); } .loading-svg { diff --git a/img/archive-link.png b/img/archive-link.png new file mode 100644 index 0000000000000000000000000000000000000000..fadbdb6d7f2e127fa999d041a668fd50c144f582 GIT binary patch literal 576 zcmV-G0>Axe`X6jW5DN=CA^9iqfmqmB2{!(W)PmpxMN=dY6$Lf; znwjiH5QoD7 zm&g<`%O#Z zFEil94qB}i!r?G-xg75|mdhpj{k|};?zMkiU+J*uKA(?g2z9$%z1?o>r_Y!XMi>;EyOW5spMtIk{$)MS6ey&t1252xCh%7iTtKq3M6Ce}{y<4x>$Ye4|CX+~| zQo_i4f6uI{>OZ=w24JyR{0s(ze9r&W>-FDqCWUs$X0zY#K-kQ`HvR+8M9lZ&YnEdG O0000 Date: Mon, 1 Mar 2021 22:58:33 +0200 Subject: [PATCH 0064/1230] feature(cloudcmd) icons: add archive icon for small screens --- css/icons.css | 5 +++-- css/query.css | 9 +++++++++ font/fontello.eot | Bin 13012 -> 14436 bytes font/fontello.svg | 4 +++- font/fontello.ttf | Bin 12844 -> 14268 bytes font/fontello.woff | Bin 8048 -> 8796 bytes font/fontello.woff2 | Bin 6704 -> 7360 bytes 7 files changed, 15 insertions(+), 3 deletions(-) diff --git a/css/icons.css b/css/icons.css index 253b3593..c657bc15 100644 --- a/css/icons.css +++ b/css/icons.css @@ -28,7 +28,7 @@ content : '\e806 '; } -.icon-directory::before { +.icon-directory { font-family : 'Fontello'; content : '\e807 '; } @@ -58,7 +58,7 @@ content : '\e80c '; } -.icon-file::before { +.icon-file::before, { font-family : 'Fontello'; content : '\e80d '; } @@ -137,3 +137,4 @@ font-family : 'Fontello'; content : '\e81c '; } + diff --git a/css/query.css b/css/query.css index 332e7ea5..f6aca9e2 100644 --- a/css/query.css +++ b/css/query.css @@ -163,6 +163,15 @@ background-image: none; } + .archive, .archive-link { + background-image: none; + } + + .archive::before, .archive-link { + color: rgba(26, 224, 124, 0.56); + content: '\e81d'; + } + /* убираем заголовок */ .fm-header { display: none; diff --git a/font/fontello.eot b/font/fontello.eot index c886783f811e722665b18fb0c993c2d45f84d749..c6b5875af90f3191bb1f67a76c6b4daa763f52e6 100644 GIT binary patch delta 6428 zcmcIodu&_RdH>FR^C6PrQx^5O)Rib%ypnB6l>DG$hLkMZVlCNDEHaOZv?R+;<3@E{ z*U1u5?c&5!(sacw_Q$%U0oDe=FrbIh+BxkoqzD#t1KK}={xd8a)}nu;!!QIxGhkSn z>~}6DLoU)K!>}uf-*?XW&iP)y?>krg+43(}wWWhZe>L%SZCpvb`Sc54&p%)PMoUw!jA zqW*Ol{p9M^<<+(CANfAfgbDdSalXywS;P5&9Z}zSm)`Aka#H`^7l~nw=oZN?XM=jN z`$badA~_tZ2^9r4O9HM1oR z2Pi5jE2NSntI`U|jLGvP%dAFBW@i}LgI21&EgaG{@-x4##hsVbmyVQ3kz`4c*9p61 zb&YhA6kWQEbBL+50%J5bPmF0b(wKH8)|H9G(`n1lx|}a+KOKT*iBylIu8_ya4B2Bq zH8EXgD>#budD3;Nc@+txGtR2MN7CAz=k*^R+NBs4(;C!C#MVfIehvDWsfB2|*q zc~Vtrfh1L$P0ny1_U+x4*V(7okhn`x{nKj7AJ}ai@{Bltf_0TjB_Ai6EFR4r7~Y%i zO2#7yiWc=~iA>)_zaATnG3TiFo%(A2iUkilnTPsKNmu0(&el*yD}JECqmoCUL043L z1uDIU;$0zwB%dLzv@joIzIhNITObT($Ho|q<;HSH4vlB`?;E!F4)pc*q}me!zel5P z))mm=88#A6v_>^O)syberkrp1Zs$rKO`?+svv!l1A}dS)32>6upju%n04bqx=1G!h z0SwJX(vd`@BPtSk%m2#!s>(eGBB% zeY4KdK%1m>Z_NiXY_KF8k%c2N43$w?2(DWZ!XZYp=`4OmHLb(>^WdLOltKZIuF$Ey z{V7>Ki4ukBD$opf7*MUqvQmM6a!vSkCepPx+Ljc1pAG$OUrAKzO*BH(gCu|=xfLu> zD@(KKfsU|(;cX`%%D?A`}z88LKtb`9+CPdqA#C3nLnOmy5SMn zkV<6e#!U|zhklbZ#709sD^OigaVRX3VF>I%EEH+>*wNm;cu%81p1R=m zORA#IIuFG=BrWMY89z1%hv=h*yd?W5OP%@ltZlWo8X7Q*q;02RZ~BM`<}c#6Q)q6o za#JMora(7pV_PN~J9M~B#i2h;ye6b1NFlipWf0wwIvh>3PY9`J+P-<|(hP4w^BF)| zNn1rsQD?#*_Kc2>jhIlyWk{(aUopU7w&(L&Z9X&+$NyxKChDS3llLs010Oi07S{(93UZ3K0|Wh;_DIN&5__ZlTkQ1d{7l%3rZK`KCCT6vG$9l^t)pMbiXn^s zg_NN7fGk}gi!_bqp-)>7zRqT?Y$VYeNudFBJAc;kO=q&x#0}%oJU5YI9l>yMCGa%= zadwJzrLIMZOAEs*1ZsLS`j2gY7Can2IZE9zN)Y*}2rvxQhBiYeb4}fEJU&vRRP~0b&oplclYdH@i5t7ZpVX*$SeW} zx}YF4H2c{H&!0OzlihwskxFOU{IKqEi?D(slo25x1<9g8nxIp3jy<3E^)kGAlqOkN zT-_qNRrE2x1yh^aF6-#8T&TSg&>teB;%e{4Md?JO*9`73IeJmYmwZx5Y#jI?ql_lb_ zs5Z>{$0o)nvZJxlk+?iEK9=qYuy~yYtdlTf#G4gM+yN$(Ej)o<4En#I*bQ_o1=2->kVu$WMX9 zL+Q6$weRX5a4BcTes$u+2d^^c&0t{o9_jG@K+yWZ^#19=_{)?9%T^_1kUA%Pp`Z76f1^}DXw3LPd`tFRei5v<`~qPg;NWi!r%tN7$pom%ATU<#|wfAuF%RZN~gSBA=D zisyH<4sqS)o?>PbiE|@jU}zOAlap1bap}TE&K9AQ>w`nwW1GUTfYZoCGn1|*UVGCM zpyE_vFtrIJxJUSGPDN|-&e-p~Ja7*}^zuN$`Sn0&Jz%@1Z?*VIoMYHn0b-U=Uv zc-Wq~uiQ|UCM&(XW!bth#3S}h{Y-i0Tyr*=!a~Gdh}sPb7w<1O!r>xkwE}O=RNw}e z`U;Jp_z2;Hvp6Cn_sx|X!dIlIu(4qZy`jOBg>5@L@*vj57OBr&t-zIOI51s}AgTxe z(weVUM0mF&>WmG>>M@%dBu(8{=3%Q~PVoQ|+X94C3ug5%+u9hlQiKYHg77hlHCAgx zjSPQ2lk5R-;&39C8R7}M!31qXL*~(r&1NcGwL~&`!Id3))q;8-`%I z?S@Ctj17OAA?8{Y!L-a_&K?#(9OCw_#rU1YFEkg2b}gpwEM9Fcnl|xZ=3^YKH$8=0 z-)lN6Jl*YK3Lcs;tOp(nYQaN6d*Pv=eeh7wG&~fvA07%i01pM-3kL-qgoA<(+h)!M z@;=+F^0tAhi59@BBJVX&J}iK_-{$)=d><;{04iV_uoNYb@LA@@{pCC3j`Jfs$!i3( zDFGIKV6dUG*i?Cc#m&#?F28@5%$RLvU5m0fO`PNS?LAB=j5vqv*3cM>37f`YI8--_ z(Ya#lp$U69ksIO%cQ5z>Vfay8JUGM;Ip4N>>jxQ&Md8U|6lt6%03oFhzth&VRcrXE zzZI&!y|IqV9WT(b&0(k8Ep0?nT(Zz-l~CbyKd+FmJ$9^x&cAlx0+ z@haC4Rr_w}1H~+3Zfw-h?uykVi>v76s0^i8OLEou`M!knm;aS8H;Pq)=)m5+cDcjvefjp*;Wo79lf)}y(lr$JZ?>koi(i8v$N*(4=?+V?Tp}v z^NrzjJr7I|3rmjkM6o=VJX3KZ^oN_ujR7HaU0KYT>TcoxQuy`|TY?n;*{X z7O3y++R->^^COuJWJ;uC)^IW z$L)p}ElvPMY^nAA@6td0acTObgpbsl(VRx1AI|J}dIF;(nUp}K@O9h5J8qqXTQPH5 z+*!DF0Px5#9|y=!{f_w=9LJ&&J^`7M%@2WmMnq-`A*`Fn(a?87aM~6q;h#b5X6;R) z<6!2%Fu|O$H<>$g7K}S{PRLAS={_MNnEQo{V9pB}!OYuRcsnYBD}%#50j^?i;mu8O z57fanCm$4oOiVr`1YPc7A?R|S6>=`OAe2r)tSXcWrY4jM=7LZvm_;FT0?d+-5zMlX z5zIv)BbXJ}u=*s}ORi;tyX;yfxJO*W1ot`DFu^_Q8YZ|au3>`vyla@?9z&ROcXGJu zj(8pmUud%Tg1su@F2r~NqsQ$=oq-oZ*U;j@3ZXB$LSiI@u4DJnJI8*>9l1MhG+D9Z zi6$$=pTs#wn@9d$lNAC_HCZ9>G-U6&b6$PT9l8hNI>d@=!g`Yx@?XYQ%nBR7(qzSf zzu#nqz%!6NcIUvG?#LB?w#f?d=bEe#zlEL0n&QtNG~*q2AkA-7kwRI z^tm%l?!njb?-ETmdfBZrctyEY7UQMK#()^#HmEs4la*wnUrhY~-;FROe{1nRR}u^2 ZX;5JBHv8x%SH9YiXmU$k(r9w>zX8kGJ9Pj6 delta 4923 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 -Copyright (C) 2019 by original authors @ fontello.com +Copyright (C) 2021 by original authors @ fontello.com @@ -63,6 +63,8 @@ + + \ No newline at end of file diff --git a/font/fontello.ttf b/font/fontello.ttf index 57d3d33173116cfd592e11de175917715a215633..4fc26184e1cd73e9158c547a0f354069f042bb85 100644 GIT binary patch delta 6312 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 diff --git a/font/fontello.woff b/font/fontello.woff index fd4d9d12c41f37dd2611bcc2872deeab13cd143d..16fa9d71203ef2b7d396e36e65551d2e5d8ecccf 100644 GIT binary patch delta 8626 zcmXY%1yCJ5+lCMB4#nM}xE0sJ!QCmv-Q5>0?!}6`yA^jUR;;+YON-lo-f#ZQT$4O^ zo_n*Cot?}ixe{5E!u3>^mIgtAAce{Rgz;a^*O`bb3ap#j8#{qOP)iVH0R)19SMIw= zHuZ3$0D++EAQ}n;bO;~|Crf*X)(HZ^pF<>66V^u`OJi4v7pV%;jrjjyTH1MAK(rxyKR6Y8egR#9iM1u?jp)3BjV5P8Q32?kMqZTT zB>zOCDWmu!j0IHEv1kxL@L*IwkXP3E?5RC82Z7W~M;{b6xStuxyADqUJFEycK=sfK z>Td=kb!r@~{+-P};TBf<(hLzQKDelRSW*{psfWdwrGl!?;b=eb*@)S%5iiN>%}< zibe%;X;6P#o|6Pa7G9K`{`QN?{3c@-BXVhUKYyXq4nvkOaw{n8Ik10HY&$N`NnhnB zAHy02?gch-D{|O#Sihp=_EcM+XAECNw)8j1M0jPH8i~RG_obl#NKmb9t4}O?20ga<_z?y)`NWMsVs%`Vx`EC@0~`#-K=D&RR~U#jXz z9&`%{R4A7OzjIfDg5AW5H@3@E7`6y1$PH@#o>_GtJfzX)-NxRU1j#+IKodYXN*OYSlXHoMDwmW5)xSKlE&8`B|1%ynkw9 zKPM^YP10D%HJDdr&lI};r9ymdekyXBI!zAawpDfpgwip4Z>7FTrnsmn)`g8DQ6Be? z)~A50GTj-%;^DEG>P}wQ!&8~MbFr&5XRC0Ufp=W9= ztY?=2zSBzW?i1RRFAY66{1k+~=u zo@_i_k>W;dd2LJc)HHW3<45;w#rn>IM(fng-^=`|Ia<39>a^lTDRzl}(Kl1+j!mPP zlZWEZO#UwIoS0pkb}%&Op=@LX^p^wr+RM|sZwuSGpN}C&b$GYP$2A{- zk(6h^M3GxLsz^nLM{o^JtW- zp?nr?DE2iHHLVNq$l9^%#&#K+;j-0TE)T={LFN0nR)3W>)Rw>hclhSe`Nw|f*M&%1 z-wGBXHmx_>2glR6l~IRJJa@NrJ5T_EQY(2H?Yh-0O1pdgdQt4V^k?IHaR7@En;C66 ziPQlJ@qB%|u2A5J5{pd4?Mo+^I8I$(I@B@Wv-j{2j8Q*hoxB4z9P^oJAB+E}Z` z2!@aP<)u+?fUJi9X%7L>$0DpqcgEO;%nYvQ*PIhh>QN{f0w6*ts41t=D^P-#LnJMpTbv$iAIG zN*Ldgaqx9d8KJ$mzz*&}6rVKo^^4v5rmgRW)B4iPb}(|Mj5mcMKCHgh1k>+i|Yk)u*CTi2=Sk7iTTXd`3%J-r8MbU^9bY|KQQB#QS)?MJhx zT4yDthuAQMhiV9RYtbf@xx_^G4G`C=l1g zlwjxqg0SkS%I;;sUolvM;z0?Xja(f7SI4u(#`9}{V_Y3^G+&P8+=QYKjZ&0ZS$+3- zL4#RnSB$E_a1f>}-7HBWk~wEKHEN(D*02#d6nwIn56ZC_H}*f~EU(@|r$Pj|4@ZVz zykm;ciWCEkqMz7*&>9UY_9as~KjmLJf%*Q3mBUYy`tOe>YS#q(HGGRqd;6jepjQ%Y z9MlyA4V&L4S4{9s@|4<4`2V|MV)X314_A1>Su)S`qT z-5QlzHb+MdHBO9)V~0$)dTij5zNw3JW#PA#-SS7$LQ$CG!@KB!`x4!rZSoV>=WUsb z>N~-^_;b&e_H}*nFp@I;_1}Pt|NC&;+`sw|;^)O&p_@_aI>P6vjg!0Qb$`jX%TS5j zfSWPpaF?f-!LF28bd%*vTbx%N5enr(pUpC+Fq!7AmyW#o;!YiIwYM+`jNW?4 z=5?C=BBYGo?&C6YavTUkQSA)`>nfJA8%?AUErU;49q!Cdy#ZPSbjc}%H64Uz%o-!2 z*CwK}`QNgNC|439;iW&Z#hT<&ZEW*{Nzp7M+L7hD4VjIrPOmbD9tT<&Vyg8UXOI2==U4Vfm$H^-S*V8>awbD zSH89G{Z{2KJV1OGsEvI6lc`>=#XVjTc|$xbjO(t@GEawJ|N7D6!8f~EWU!{ez6i%( zFnU8+?80^}dAR%-gg-`KM%BoX#i>M)`m2SAj3K`%`Hh6niX&T?hkRkf@BX1ef(MwElsP?2K85;Em6ZXP4=Z%hvupW{Pp=yiejJHOY}+TwK2V@VL- zbAPaEBhWeeE^q7(Ol~9&QL895$@N3pyxdlPR>C1 zFBN`4z7NJPWkdm2LMxV=53J9${?T5MpDkpjTa5>cIW%ZIa_dw8+=PUV_;52vjrJ260js=K|#;>RNQcxN)rV z2?HVM;hsq;W@yV1YeK6_eD2KqHl7W_ThMV%!gSPC#(^*yBc60+;@@#T!Lcr!{`lLh zx=^T!&Lkt}+CeJkI*r-7L)PQ!v6&OE;0SE;inMrpy$T2y9u9t8nHKZ~trO~Q1cmXi z+`rX%FeIQJeaM>(0qy&-<{m_meDH@>^czE%?MISw%*q#N_)2dCm0Dr}TW(r^Wq4c5 zU979wgtb~&fooV;VI%6pLN_+;iu9(hZp&g;78UTG?s-duKM~CQPEwJNe-7Z#8v|Vo zqInL}v%NdD!tEu;|E6v^Z&p40c6Mr`C5fZB_c{kh`km|k#apwyttqm#{>k4cb2FZ& zFpC(&@9UFtq5z;Jog)Z#Bj~Yc#D-lpU)Ws99ET!$5fN^USXn>M9hY_hcN|&s$e5M zprw1$H&4}Q8j1yT&Fr{5Mj{eaVT?c^8>mPQYa;64bDV8X!iM%+u!7EqviVr?d6?$* zusUr%1=cL61*j8B+yOf6Q1G4{t0>|l6+_!cn^5uZat4g&tg_d`O0KJKk-%u&?RLs) zl!N)uA8-fmGP{F=zUDgN1}{n4imC4})={!g!t$3sXP9S`)d^7@mL1yq>$G}j^;(Cb z0=fpxOsaw1ewP~;L1y_)?F3)eg*ytCO5M_U$v<5^K>1jWy?HL{3Pj4WOIE}tp}=*9 zNsRXP$`theVbqu|3$;?mLIN__yi#Va4YY+A@|On6Y=aECBi%~22L9|Ik>lrM4BWl{ zG9){Exm|RQG83gLQ}CoX_=2YdramhBd`30Wme%u@Y@z+!e%4xB`WZnLb6ae0SbW}r zEtw>eZ^bk)j^|syJ(nStqg$MLall_BZX%^&Qrzt*}-}b?=cFE+5zxfn7m~1GF0uX@}Yx*yV+VYG#?^Auez)A#X4ouh3!#@z^#)^ zqG~2@V;&F$-J8i1V){{JRYhF_5_=aC0MK{mhKB0ax7vb0)>110+mo{1v90|YHbm(h z)~#{W^TzcwyMvj%)I2WIZL6J3zM1lb=}28h?O<=mkQb$s0u0BLqlLg`hm1=dnB^cn zM&yfb{z^kP@dBf>$#IPm&3d(0R+KiPvq``S(}v+PG~{c^HGLqlJ~I+0&8J{%YA}w1 zrXGfVVtH&h8>uZ3DP#0xUI{s3_7th}y*^vBUTTNR5$3(sX{c;J@NhN5SSvM=dE~se zP77N#`19uQ1VDMc)FdKQjn-SP`Ev4THxn<1-7f=-$I(I%0L@?rMePUT@f}_>77cws~;BDi_ol-2JD?E5o;)k zy185lCqQ@cFUzlDx@m|#Ml{3N4?(PRz~p)N0pGwP$wSYd!B)w$TxV9HpR>=zT!C4z z41rjO8JN7t7GmjFt`%1}&=^>|?8#g94k!I2ByjZ~1uJB7W`s0S_pV!bC03~Hv0^?8 zO3ogwu$G~TSteS4Al{E%Cp`1`@b^&qIJZ7?-EVi(_yXSqeYV}2HZ!k%OiPtzUb|x) z-GMW=KB5Z-Kauv8+`GqB<&cx}_?jUO!R|HHz>SAA&#mR=PgaLh80}jVkDps&IR^Vg zW*2o-M+Xzc{W{Ar*qxM+r1@zF_scUaj<@xns5z(d*b&iGQxl^K%M<$hxPJ)9Ggvm2 zW%%~FO0NlfV=)%@Jq{u9u?h)Hq-|85qyoI&Sk~sG;Q@B)i+i-X4qHfPSbV6T%0|<& zek`^LIAhiRQrz^;Irm^Mh_AB2?GRW^qzNYbBZU;&q8^MmLu7PGI9r=J({2hr4I4T! za*Keo?sC$>N4eMk5ak}sHil2ny?*HBxF+n3q+3ThAbO1CN6&h4Q!IPf4%N`lrUcle z?j8_ekeyMS`Mz2d28HMg>j?pfkJiLg5`t}&87OW@vXhsR8UrsSB_HfIdf>Oh+$$sPw+cTuS9G(lON5x4cIcxeLfm84B~&q*$2JIr@gjz zd0I}HT@*WR>n@y}G#m+D_u~{VF9W(VrADl-84E{(410p$mc)~YOejSOt)bseP<9-t zwt-#=H{fXjM6=U2qb@DJA#@U@j3CvTJSNG7Vgmu2cbi4kNGcQM~*M`4hZI7sXqyXW9Bo;G# zezCXj6UpIY^u!~VqJId!8=PGGUUb_!3?P5@5dLQgXO&L$gc6Zww0tt)~ zzZ0Q@)d|H!n@_4=41~c3U;$R#%m^gxpb#o9Px%$`;Ow=z!SfFVbCYx!6H|V6i&GL! zmCTzsXph2Fx>&0=pY^!Rv91B3lxZd*`%kktc&bW!#9;9fP?UjTmW25CO8&!-ZaT#{ z4gHENDtmgYxi~Kt>C$b3PAgL5C4Me% z!9_fpzeixJohhTqDHN;O@25uAcQ;TiMCsE-^XrllsqGs$yU5qmaTEgn`}R2cQI&+6 zDdG>@=)`^7(Fldtcqu-VG2u5S7k7BqWiwsvof39}f8I+zX!!b5#Ab#{F$t^>VGRtZ%v&uZ_{xNn$v(=hVfSkb zJMV-dE15A7G#$Y}Qd?3<$%P|lva!BQO%H?KS%ih{nl9{IKNABiYp`fcjbCntI=6fo z_@<-pg}(8jgKBeRZMJ)J`D>sIp8fV3e_iTjHw~(QDNS!-_cq_~cA&YTaI`LimzQ)* z{rl6J{#~I`>#2bIJL1Av&XgKv5?5ppq?Kmy>Mx&!4BbF4e)kI}uov z5+wm?h`NFatflHe@x2syN}i=`AuVnkXQ+XemxM&fywft0)Hzs<3I_A)nUZLaMVX~5 zp`y7fjA#%~_qRU^;t+}j!`5h`(MXcAZz@xK!2_5;N6b=NyA*CUCiUOZ5G8|As!J7H zLvlKC`XJS&ofUy@6=^d!DY5XSi-&kd5%>(TrtV`h^(QevA_q(VLg`mt@aRaXM*VFk zJ{+&Y;E#u{3Vx-G_W=Z6x$zMvs_FMP@wvHJ3QE#z9b7ban0y=lEeRj_f+k(~bJ={Z zSxp7u?>5-)+rXXaigRwVhmh9MrsL)~cI{Hg)$Q_facE)B)gVr^WZm)2HGN$4rj?Wf zy>gvw6=MYOH$B#8Rmfp-Xoh-N<6pEYQdVeFIT@mRFPV6{X$=i0mF^K$;ww$%dP23u zKnazyfuJ%EK~s-|D3tAaTCIU`@*?%w$xdVI>*GfF`>|98cp!B&QY^S>T`n-D7dgANMnV`m)rb-Q>*4%?GKn)UB@1ixx5ln8y2>e zlI*XXGap-cDc0tB3eK&v&Gjj%tR%;U*2YRWq%)t3E}4&8_4}foZGZeRc@3%Ub8OD( zT%DQqETq@(#fT2^)-h;)H(kd2!T<5)3+|m~syp=Ufp_o(ExRKThjLY6`T{p2#f?4X z>NXn@aDj@65rZbK^0Gp)2CyAmlAU0^p^*9HMz-PClyQ@_6~}eDik?kz+f{Jew8K`3VUhfqU?vHcBqTv72VUUt zm$r&t+1S~^C5_5cd?L(t_D+PDEKFIPuv><`EBd$WD!7rgp-Q6ZCek_$p0 zflkS;xS>>JZS@05Gcp`(nBi0J)z#?eXr21o=-0@PIZh6JWKID{qyB8YJp~4$$_Uuo zd@|BCqA%ZDuJvu`4`Z2s0>OSbRuJI9U8@jpCDbV0A%it>YQ9bOahMq%Dja4NuD5<15_G= zY(QKBH2DAEbC z9C9j32`UY08JZB97di!oDF_PUCkKUtkpA~1Xb>;R8Wam@522&}r+8(#Cu}P9v*U&X zDWXg?Hr&^L3<-e<=U!|_Fc{44RLD2zWIIf-I;tb94faCY>w+9@a z9v|yM8SD~65B(ift?MN$3|4lE%Gt+$ZQSR49CCqk?}Tic_vqJbL*?%aI9&B17x+zC z1u2h1Ywyh7Ah8Z+LsAR(IomATg7vR$+T=-MDXdv_9PX34^I-yDl-9a3~*D->7{(~5`l|VwI<)G=yo6&e#%6s~%f_N>AT_kHy=`7!|8WIoB zbRMc=?~=6DWyecGUZKfip0(yvwZkv6s2DcjjS&ZX@!dJW$7+HVRz1J>#~$)Uolu$o zO}%~Gm`gu9rque@X97uyyX==hbibqo_$uJnl8da1!p$wm=Q4xY)Q8D#src$L8t=Ye1-OxdbW^)P9 za?bz4wW1p1$T>@?2{pCp*FE^*Y!Xx}64Ws`V#1|tUQTu^aVu6_A9@%V7(Q%UdKfO4 zka20e;ke!iG;~rdih!tbX*5g#0RcuTu#Z;Fr%(WFg)ajGLme$C`UWqoe+ dve_O~>`9FiGH&q)mlqx%AM~As334Uj{{ZfzHT?hp delta 7850 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 diff --git a/font/fontello.woff2 b/font/fontello.woff2 index dae85710040bf58bfd75af9887060d7171d950a2..8b7b62f023217c7ff1966dbd151c423110fa5453 100644 GIT binary patch literal 7360 zcmV;x96#fCPew8T0RR91035&o4*&oF05`k<032oj0RR9100000000000000000000 z0000SR0dW6h6V@@37iZO2nxMOv@;7p00A}vBm;Z|AO(d@2ZDMGfgBs%F?EMPg^dGj z8un8bMQIWR+5i7BL5>(o^7aB)?dCy(X`v+=nZhH(*;F+2!4^7f-I_?Wt81_SDvC=V zjGL>UqZeHs7e$lG9KOfD`s3#Cr6a&U8Z?*YLH4eAuwQJjgIRpAThor}HK}$KpYyEg zcO0KLLXue@)S3Sz%MP)V3##=wWQUH>7bT@!4>-lR05tuvK-*u|w8PZ#FXJDzY#pAq z`40~~EKUqCqVdFN%0ds}WGvOgRbkd5G3u5qgEe1&`WMYA{E@P1T$}>y+HyOvkuNCr z_y5(sIt3sVp87f^M=nsnlRmYauwGG$9fl68w&}{HpYBVEPIh0+C|!&O+q49gh*Cwg zb=Y>A|6Z>Vt!|Dus}&3A!Ft#MtNX$KvRS_Ov0F2O1IG9aJWJ7(BHc!9Wd@42#vlh- z>@tGPNo>UhI1W!QO&qgi<1`&eJE05P-T_O(#OCa?`=K`VZu7g=k;ug9mhV))Vo2mQ zF^6yXdQ%gmCIaDbY;D9HRlJ!bu}Ek$RHB9g)tZGyOcUha|4&t2|3C61SV}7x-OI4l zVM*DB(}93+2S6r3NrqfWxHAnz8bzhFzSlN3P;PK1=~ii{^dkEhkHkxEAsG_h;|4Jz6T7ou#Xe5aNhMCSSLO6Fn3V z0DiQw2HI=C8_&Xz!uD#G1;auixY_BNrsvt_-nQc|sA4wLVz5jie`kw6H@;FjdC<<(wpC0m^C_Y*&GCx~^|4fD} zXECsXEKt;e(6}}FJ7d`UFL?062R{M`B7`s^h$4nK5=bHi9cg4Rfh=;!qktknG(<88 zr;>M2L`fu&;VJh(lb|GlB|%MsmIO}{yh-pS!JmXc5`swxB_W)IND`t+h$SJOghUdO zNk}C@PeM8gnIudkA)AC;67oqXB%$~~KQm@?;Lx>%=xrC_-M7&8KRL|gP#yYNiianl zW;pP|i<>1+E3JVcAh=nBKzM6FZ1B;n0kv7PHc)J;ek#eUS+{|NAn$FW$%aj)B0$CX zJ|Sp;ibklwcJ^yZsqhx3Zr|2~S%*_S-P`mIwsnFe>~9S0xEZN+LMvNrC>Bz}(H6h- zJ@Koeitxu8v+}39N0(%Y^%!QUsRghw|I0)S+Zc?|= zRdGY43Ibw@a1U|pI|7bfXvC_llFw_*wgQM-u{AtK&n?zoGF6+|y^52FQxnB8d#Nu(~r&1krY2~Tmvd*%dA zjN5O=U1GPI@&KXRystrG`G|Wvwse(lQi-vXc0ycCnDL_m#I=Z7B2JN-Hbqt#Ed$Y+ zpqRZ(s*8e|Hh$(+7NT{{DaOfGG@u=uwh0R&qJtgCLm!nK?Jb&n-H>2 zPTAQnv_I|;H!QUfJ{m*F07jPl-%O?lF(lBnR(eR*4C1Dw*TNSocV7&2J0WEmq%T4s zLnurT1+s)ej;N3)8We~Jio^>g;#;Cm3+p}vZS;2B{RTP6)sDjIyV?n@diwdyjn;Dd z#XH7jW5kkiIf(mv$>C<41Szcby=`sdPA8S5`tFfP z=uE5THq)2QpyymKo|VD9^y_-%vDR1 zoPy|%1EOyxHjAi;3v4#aIiAmbf~Faa>_?7{DzQ7c@iL%iS{fgliZBVn&YIsynQ^_C< ztMrC=Y1MS0mRJBQyF!``5XzwsqBp5$r5LQ}L6D_KErZWRzqxfa2S3ehgICBc*tJI1 z1j%TbY115>*18`MY%^l>?bVqI%DKPnU+^=MpP5}icjtda$Ah^%dZ8aj$O0q2mCuz$hie?F5sQke&sI zSxU&;2^J}3Ss$vTLY34|C3RF~V}b^0@(Hxs2)2nS6f4`onSwuH2@AcObMfQ zg5#7|Oz08gSn4i1!X zq!g#Ib$Ct>FX`bmJ-q1vcS?9riYHo+uk`VqK7P{2uMY5|g!IppEc;^r4!o+}b7;Am zQKj!#D=lLC;JpoHa(MrVdJvNlkiQfJQCkVh8rE?u!y(at{NLSJcY)b|gou|J3eZV7oAWc(EIzOC^;W69VGUZ_ zg{~n9g#cndiJ|kU9d(r_6tEVEoySxJh#9dQ*5+A-S9!n8HyVgTE(GcX$C)gu9O+Kj=yyL5YFg-zQq(I@k8M7 z*(9jkWocr&j?7fk2GujKa2ue|2k{Ufd!!35%wQzkzi%95F#5w>&Zd6@+e;Lzb|~mB zUAV?h%9Nty%qVuN@1M5TWN*o4|Ef86hc}77hJP@5bb0B6e&#l7$&zS>-W9Du)~{DQ z_K8Dqg;Db-=QMRfFI+hgE0RxD@niFxMWgCoLj5gzio|J;)tyu{3V!JtO%Dc^yP4?z zyGBUCe0%}EZo^Cm@;VyX8qwImW8Z{FhK{a)@(EDBZlicDO|Xi8>Q0)2>^i>3^7@FB z0vYjQTt2!-kVW`<pgF7T7nkkemj~up3?Bz#T&txX-5D#km^f3qmgJ zqgOip4X9=(;g6zmZhDtKZ)L^QCKt5-F-c=pCYD`5-fQ=kMF%pGk=ZrtQ zw3ZS0drkC4W;TLDA7wCx0ea)KFUzbt!ahf~w}IlTvF|IH0deTLNU+?+zI`O&(9qp_ zk`rz+c~4y+fmBN)FJ*RhNZ0yZ9tLJZXb~fD?4!8aZETxOzt~ob(s8IXZy88VF;C4O zGW~$hc&p{DU^i)l8CHW+>T(Y+WkivUKDv2Ezo9a(beqKG6Ekw2TRHK@%~r0FD6#zVRX}_&NbZ-0-t6-d`(jeJurqYBQy;OG zqnbMx160V;>_@%@xmFn1_+`IDs6T%&SAA%WOW=R!~5R_18=b#8Z;$%h>Rsxzmy zzn7dk%dqSJv3}q{QI(_kcNr2^12)x40|_aU?Osc4^@g0C%ZdE-fHT$+3G3)tft52q zTRy?JcC30tI|P*-J5U<&K~bb+dJGx)kw)_%AHPvVF+GM1N$G%i&1)!BH;3YtM`}Ch z_q?4xFt2Ogr2y%V;h8Tx>(O{%v4rD^)}tYNPnHq|69a2g@THptW*3NxxX`ZbH8HT$<;;kDm5JZ+u#2$anATpmD44@ z;_BVI_oy3@F#qQxM@)B3oUu|ZU(rQ}`U=iLdrNm6aj_HXS|EdiaX0YlRO4CM6r$@7T7QIt!ykou*nn;g%Vn zsmJ1<6w}wAz>eYx0*!&ZEIUWEkeGu(Q#*&TW8BRhw|R)is?jdB1mV46BdA@g$c-g9 zKyp~9lI5`=aHw)%C$a6R8hjf3(xCZ{s>oOsM4b7Ed(M`{meGnL>lL1veDTyMOcoiX zi}jiFlQg<|4K$-RE2Yq9PIs(hQJgQ8xr+H`AY$#IY0*I|17dS4D*A{DTKB99Ep5&m zi8zu@7qS$?I17I`*Yilh!iPonC>;{oD9E#Xc=@aS>BEIx4h}6CotC=~pHR&xdd2*QUQU^^mHe zK?P=Xdb`0aL)wt#30LpgQ?1mN`4lZhQ{?iL@G^=0v?|fXd}g+J_60rx>Z$_bvo8_| z?*`wsrdzX?^(4OLx+?V=(VF9&uNcbxonFRK94IdzDM9k{p`rX_@PN13yuoY3*gRx; zA6Gkp$cPvty4bMu1-5vI-S z`VykYWCQYz# z{ay?^V-VWMQ~1#D%$cI1{T?{WrtX{#D>}EP-L@LNF@zO)t0-8Cmx`F3bXXKwj*(ux zKPC{=j{9=`0r-Y9qB8$Ybo`-w2JiJ6Hkml`l#nGdIvCp~@z|>89;C-7uR)I(k3p|b z-(M`H|ICuv;lzA@Lg!B`oNZX6(F8amN?cP16;;&`#2N&uAP|W}sf5hi%*07&lxZDl zv&xP&K4pm}kUNcqyF0&TXLKL)bsL+Ie3bYTjzsIdTX9f>Ycg8&EH?@(_#9;^OaeSM zWlOoFQV=W%sT5-^lViqEX|m6hWlyD8u}_cr(r~x>^4qQV)Q*J2|C9LhK*6AU?&TPM znBdx+0%sLSfh?zsc<&_tiRZ-F3;KTwUqPHq~*a~f|Ypw+a=$V{>S!Iznn;)QV~ z@%AtN)QkOm|1K|}$r=t8zME;{j9HG~U8f6x$r z{gl^UaK4_DEpr)%@&3>vXc;#gn9ZaYxv$4w{6Sr=4%ryi)tx@At}rrepnRZbB#tIN zJ6ik8z%R8Ia7Z?e12FDWrc2Z3rY60_6fXpQ>(<%xA2Zi6hRt#Us}t+!{o0O||SJ1htQD6_K7LUs+)Lu$z8e-#5%`~#=NhmGpqayx%6 zQxzFBfH|zeA?nhgq>fPKF{nHuDS-+<(6i4t|HSlb(6v$s8DOGfIze63PmmBx z*}?%j8W_P5WE>+HN2&dcS=ZG;Tz_INCSi3B8i7~whT5@cEe#5$vLS&Sk%?n}3KB<+ znbX&O-Y#3;o)49x6Q7Vk=OivaF(NRD$(&H00D!tc0Z$MR3)zD1ToZVL(~r`uAyhCw zuF+1W%-Zk57AEX12^ls>^1H8=`c510=9{KXfRXqK3WHknBElKp!$o|AyKEpX2f6QY zoa5A3AFl^~;CUqvGo9_TGjPJ@aQ+TEI>6^*_0Quvc6-e*2*lYM7oM2M21HzA#RG1o z>i|VSqXhxgQ5zg-o(+asu~|cbbVXW7M|R_x&~XEHJeYYyyj|%U|NXVC_uF+DhqgJN z6wmq^xIwNj97?%ht%>_I7Y#vl@KwP#2#+0TYBZxNrgDG|qg#UjGC~9!KyZ-gFvk_K z-#_s0ae8>-7(mVR2Ni?@P9Xn*iP#7;`3NyN%$d_bO?N387&i^5~W($OEhHHIdtRQ23>Xsw{N-EE)Vzj zwl~k8-B>3L>7smHcsIt1nE{#?NYPwoRE|`tG(a$dlpW}n*JbLL7gwK{9`(h(pveuY z=@89o8osUdCtJS(;Dm2Mh*7pMRa?VMkD;bViTy}~E+T#^r1CnU=P6(UlCr~cQAn5a zM<`%Zp>j|jD&(}l(g_Vg4kGvlMCu5Bn>^Q+Ke?j-uiH|rg(LzQ4VaM?Y~iD7@mgAt ztNJLIs9^(jJ;+x=5aJqewX~@FozSY1gl~q?bY^G#G!%MjS^U9t>k#qkjz!EV)B)k} zz@(%KaT*9Zwh%Md0b}<7J1~Zo)GZ8d)+fk#b;nguaswGWO5r^y8k=x7sH^LN1JMy1 zBlWq;nH89&LIiXWCCkpo)Z8J|G;D%FY^~xbqS(SrhhT%Q|7}`!M(vkCk@dfj>x2pi zs8Ey>n8G|khGd)o5QQ|an0HbwYJ<7^ZIW;NP2Bt-)PecM#d!a#nlI3cQ?wbB#g!)} zyDqgVgRoeqwa%_}zpvYv8f}X%!~Lc;wH;J+H(z#)ktF^4CESA6)f^7e7CYUm?ok*C z$v_%t*b?FDL+_;Pu7UvK2dL3>TJX4NnZx?| zy{mW`8B@d;`S4raIkS00aPj;0?(G|A&8g*&$B*va?KXU`f4`q>;@@fCBX?$hrL1n| z12RfvnIN5Zq7wq8M%kjmQGE-525tvM=-e#=irpGr*S?_J?44WJubv#$)iCt4!bM`^ z<2#5)V)~k5SLmVxl3-#&fm+c9gSbh9gXwrvBLX9U*i0Y}X6qI62A_(sq^y`7T4L%N zb?0SdaR1YGa~!8!{Zqf{^K%RSkExf4kYO+mpOF};Y5LQd;SQpxIOxV_csWDI$%Ok6 zKi!8p+uEHxPf$+yVP=Z`Sq6N<4Go7*9N=1BD{ui9Vt9R(p+hE2W%It9)lhQqI?nu# zF`O7N5cmzqaO*{ghZbYzjPYtl^W_SM+nfq}D(o@%>entG?QaccBkN_zbq0Q-=g=b$ zztfsK3TdA7Vw=3aGe4xEM~3GV6IPy%Jbi+?V2|3j6eLV(&Hsva4A*Eljk5_vezNck zR*^HSp9#1uWjPXqzd@<_YX(Gjck4LWc!GP(jq*=UneaXihfZ&EV9iNiiWzXYJ=ove zKY#X2f9>!5u_SKm`}KTWm##hSB}YKs_s>D9nI&#Qj1OR%pk0b5YIXSUah|^psKF=SgCb&+9PKAMG>dOJZ$p~*N zSZ&1u%$b9A05}`A1<_ImzwryGei}ssUNAe#0(iixfNZoU=%AaU7$5)+geB1}Er2deZs6I6P2;zk}TX{U_HNOC#1ttu5&^+t)YyE(Fn+Z|+XLdUa>)nRA9} z{AvRFh@YF))ielCJ@eiR_uX~RD_oUO!%bV$Q^5kPDGC`H^bKakzj^v9&N16na3vrL!9GdDa45sX~Goj zGh-bb^B>9RIycTCvu!yck28i=XZB9iw&HpCh;U}Y3JNYBR({n2g34;ztXzY_*|380L z-utMkK1gac@iLgOcQhb#FOcRhU>{iq;w-|@;T{K(GpChg8lY`<2zpo`254gj;)ynr z788UMqwv5gYTX!hOXe!s_W!Ubz5*BRNAtfbjKTBR?fu;?(O_@%6&bdkZWF24RA1U}x36%5#7f8~9nna_x4Ku+h*>sW1&}m4gSMzc zYdbA)_gEA~;QyJeH&T>hG?%=HF%kPRG1j62QD)^Ab&8sv8OE;&)WvO3_tc@4i{?ix6teYpMfCr4mhGQe z&+Q!B7g7iu!lJGbzF3L zsZ%s5y0mqQs?B3;fuPMCNqQ}30|^x~LbGvXv9|X-1@tWS0T_;Z$>7%m0veCW<1k;F zSplKH_HqY*I0H(Ho$ty1-uWT${b`I5l&8j%eU`sxfP?IE3GkQw56=&e#{m#tu!#Kf zHhKc)uLf%Qx*gSJ1>?mrN*z`DL(Qr1eCquUioIiDH8t}RpBt&yz_oqC0Bfug?v%Lq z|MO%;qt)q+j7^Yu^5V@08HF!D{sIIF0&u{h+`)lN;TTn1fks_Z2&oiGDut0s;iOUo zsT7G+icBg+A(f&bm7*n;q9c`}CzWDED#e&oiV3L{8>CW9Nu}5%m12ujifvLUc1Wez zC6!{2REm94DGo@bI3$(gh}13PnCg2=x0J8jr~sIN`nG(fS(cvu!`9nV;^R}|sdEy4 zWlweW7m4A2#tPb%EuHt^56Gq?3@R}|kwCQgd=@wp6=#ie<|$ zj$zB|R9?B^O-`0QRrw>O+_gxqRHS)1BIweHIk^C@3h0=COEMtM9&BNSj{^c#!#1^6 z{|t?CyL_g~ughghha((?b!ZkZdP#%0xa4(J0aYqZ8Vrk~S-rE?T1ghp6?q3|=g6wD z(eUb1_;pdgYjRfv!ctSvu-3dwW4ks#P2QQ$7kxm>M$b)ovz`WYgsLPodXnT;&ts;) zLhnfH1oSKl26+VZk40PWtYc16Q9V#~pI~7IK7E&(b<=!WpYH94YJ5z8ou0lOn$Blk z<};hvu&wv%c=E$KGERj0kch1tp*{$YOfd0E!z5S2?zQ@-n=-3oZz0NAcRY~XAWa%G zofhPQWRo<2Q_he^3*urzH z!~b+?$y2&hIbdPK{-uDGjp~C9(_qI8I4}!N%z+E@;Kl-YFaa+XZ6EjHhR#|bKe|Ez zMj?o42w?`on1u-DAc}d2VFBWpKmv=?l2mU?kn$BKl_ur$iMn&f;(kO0(j=9n#`fe4 zrNz=^?b@(qacbGQw)43tO6s4RM`XrOhgVx>WEHZs$J27uttM)D|5h>uuE8vEsn1*- z{lensGr4D5Eob6lpg{FnG|>ifKcPU8-LXDU%2tP3X-6ru(KtGzP7C0eo&C7}>BT#5 zP+Gcp7suoHq`||(7XuZ7BiJaU*Wnah+SEr}>TCV$Qq^8{`CV9#0^-UK962bzrJr(h zuy(aq4%!@p+bu+@VZo1dWg%dnm(Q1SfAZ;QR{{w6&dbJxPYK~vUQQdkY$_tOU1UJoIV@zZs>@^f5pP`SlwAnd2nxA&YQa8bMyF+B$Te>;fgo5 z1>0&b8qp6O(;DG}>LH01##d%^_81%NWKyL1I4RFCF%*twrcU#EXRRV@l2|mkzBf&A z1fDFK#s)LvD4w<8e zs>4O9&M&DngRAZaT&EgvlWM?issVT1O}I}r;UU$8$5itkPy8t^%>5}+W9cV7GMT%+ z{P8X6V+{zd?etiTI|2O!26!2WO(6Xhi`Khh0(DQ}7G7;eo6q3ny+jH;W(`){AeLeb}IP_?;>iB)#od+-7~X)p>sCz!jmOKd+{+QYUi?Bvp_FA3-|=hQx5^<& z*`&EGKG7IM?6gYcvwX&mM0x!GFF|*kh6bFm4$+vWnqnhhiM&Rzme_PhBkv_GOmXN; ze=1V=?~HfmKO|8XiOEg+9z;i>v0m6z=hkK0D@|j!Ay54>=*QMnxv!eyJ9e*);5m*G zye{1&g|_t$ssj0}lj#@GA1^YzGt^jv(;_ESvgB8ZE9iCfp(AX z<<`mi8KYXo9)n-Dqy(KQ@qupUDDW*DRTau$&|h911-dG3UpYb;DoilS{tJx%Ag}*m zEC2Dy(KiRc(<*B}u2KvqNi=4kGD^#kuwzS&Q2NYOvFV?HG4-pX5B#Dd^n=a!AU}uC zwncSrtETuc%_@J&?eV4q^T3e73-B|t1UMvN?5O$Oi>4M<;=!+79R+0wr8X49A&D__?CxlxDmx*6jo zfI0oKbV=_>gSH>AJEa)q=TaZEu!gMJ}|QCt5AYTs++>5Yxw{Xq>Pzng{xqyq)#%FI zE^}yulSS*48Y4kS!Q-lpJLgSX|A8*od<%#qopb5;W(-D*-_HVgg@c-c$0y7kbMG` z9k>zyeqx8;@)w@i*t;BzfyLY z9j%MZ7nRpOYsaHtM=BPt%+%Nc?gT!eDzKb`UxMe9gU(e>E44IH=4~G zN$e8g1?}v*I<^H^(Ja6+oL&>AIIbPO;bw`Xg~7lja?Tn!L=@ivfF_`s zT*SM%(+RALj=ItSwh3~>_eg^5eQ&7mDY0fsCN(OJw#0u=P1kpiFK}N&pY=YFMw)(| zF7al_gFYx51vj+ zqO&6{k@Nz0F9;;$L{#nCi^8*%-D_6$B!BFvc!ga_ z`vGdno^7&9X~-b3ezI)Mnud!E`9__neMbUs(W`x{JN}PD<1WSQjC&JvG3HX7DJFzX zz4YeNy0S{&O3H@uqR2Nrc#hf3@d)D*QT(#c@hI2{uJrR|e`)fGswGRRfQIwoL16!c zU`as`s5yLCBh|^MW&KdLSezX%<9pPpx!;uF-z$0m?f|(OAe{9LLZnYI{IrA0t%NP| zCB;u_P;$4NBhL#V$}cz@W>>JqCBzD1NeQ+JJ{*jN*lc~lJL-2XfBgtWH$xO#bOhLa zM(4{JOTG9BSX+VX+jVHyWaa7~C#QbW|Mb)3PyDhP=mz}m2M-dgySI%nbR*`vn3)_9~d z9MOj(-3g{GN@au>Q3@*;VawE71ldBwDi9){FO_0#`)p6o+aS|8;@Ax8{%gRFV~lBpptrx$^b|wi2te&B5z6F+pLou!Oyi_hqF@M{<= z`WFU(illjhy!M>+jXCQOi`Y`06NGk>=Y?k}zu+2VpFVv*f?u&(T-zU7|2=RCjQwB; zN7ny6VT2#E6R?m7fq0+5$sX2oV85o{0M<6$M}NhfY+&AG+V7N!`6{EI=_g9hZD+f$ zDl+2?&h=?QHT0MHo}@CpI35E}0e9^v%4U5>cW zGWJ9I=2>0$iG5*$Jw-xhead)kT2Xy@L(YSwrpcCok$4LVgW5nygfni#Mf?)(@&d$V z?*1w27$YgVy#m>Wx0kY+D@^a3flH=tw*LXL4d7z9^V)CblQNSG1Y)cB_Ji&+3=zjH zxHsS>*O`Vuag+rd$vh1(G})Q~8PaAM5TP$XwY#om+wujFJ#Umx5KpyFujl=8-fcIl z`D{FD8>{+V37k?VBQ(*e^qjbd=9~zkGcg1g2#*zLYSf`1rt&HsMz;k7kgq}n&jEs) z<_S|Q=cfA`{!_GH-jKsU&GZe95DK^i`E{6xUBXPBhnU=QyAV**RfYtcvJv9gr8vPT zFk&CI{Y($nN9oA-pBsW0pv*WG27*|!B1nOBg%L^~l|kQ2?ivZ^SRl16nv=ILpiS-k z^yF}Fdvkeder9sK-{T`bSvW%+9@lN<88pujXx3#=K2VElyW;^s6Nq{2+&Ra{5AyeX zgr@LOnw(NiXNG=BhG&w~#@7n~PWS*qj55GfTgtRHx9Qwm&biJYMl2#KPYB(iKxeqn z6{d?q{D}n!kakg-$7VSVoUhrLL69?cFF<7W;q6E}^lZsIP-ARMVhb%30x1?iLl$tM zn>uDMd7+`J`d68IeZWIKxz?PA1|0c2p)7PJSi{vQQuG?z^eGg&F@}FFLn(-O{7#SP zDbyLl;ejPX%CNYMNP?J2TEzM>v3YoQ=EE^|`gXkqWITRnsG#HqieS-fy#=KL;RKbY zj9@+WBKfcl>9=9Z1tK6#+^d>X(A=S>VM~q;@e~6LT}fU+&RxFIdymGlrQ^G%speaD zD5`LV(Gs=FQj+qdE2NM?uLz@WrC5{&{tpq|b(r~cs!rT{zoG4cey>yhmnRHH=;+4A zD75eU4?5R*HMArNL-iQxu;k=9ue2CtzUVk`cTrPYK}A>B%SzB^5%-48DGS#g% z?Nk|(w5VK1si!u%ve)OI1Zp(pQgBhg6m}aC-Su$6jf&)G;HiwR%sibAw`aqmylLlF~@U5 zE|CWmIEoJdXkb*sZBF5}muTBbl2+$uC;Ph_YbiUMO_!G8u9n`L2~#SjPf+ZTE;>UZ zn6QLF+++a<6Iz-yzkr;<0zQPJL?1UQ!!uJO)?fs4+i(S@u$jH0L|G9=iWQQk6;f8a zL=HE{1G{(UH9QX6!)!0A6DHj!LT1y7_!$vNNTzRP!X3m`F_axJP3We7br#ut5vSfS zxWlJj$g_jel5OUS;`cG&OO|MJQ#Jt{dol}lv1?@KBS8pB-01gR+mujpMyR|7rBDTK zE()$#l9HUe#|ieVmUKjmN_zuBePhtyYKDY_S*8?bY;Qm+LSdm z?Zx5Eb?;Y$KIbiIwF1EZ-oJ%#pZ1w`n+vrZ05XBz5_eVweDT1CJpd!%Cv&*k*7N=} z`|)}%-y^oH?P^_r)D1vQyFtI|+vEis?RHTr8;_(niM5$J#obodGg@VS>>@u_5>Gv` z0ckJdObR6ce`$LW%)->qdxfXvG)vjjS&@7)tFjAZWS(`c%WTMQXB!V{*?()(5EN?x z@Vf_@xJh+mvrQm37Ik6w%P zYty2Y3RMiYSX8M}&}5=&f*YxNdNjA`CesOi88wyGT9XnqrqP<6)-7lX^L=;fkp$7B z%hk%E+CuI2DAV7v|eeILSy!Cm?a>(~!-@HG5 zCiHBXe;Wn%bKiM7e7<1e+| zHvFHylh>aAGaOpiz|{qb*frD{hW2t1NS8k7K^z#~Y)gN~A*F908{hN&(=+#t!8*Sj z=Rx9|USCw(@=5#nI~NjFyiWkP{@{Z*X+ZIBn+ioTxDNyPrECiiM7Mrd39~w0ht~Mq zKl(q2;vh}HXTlX1g9!hyxS_~jHXOW(V-5evFF?DS$1ARii_LcQ?;2tEz`wa(r`TTy Gf(sZKC(cv= From 3976056ee8d28d3c3418df1b1e8f5f37b450d3e4 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 1 Mar 2021 23:17:42 +0200 Subject: [PATCH 0065/1230] chore(package) v15.9.1 --- ChangeLog | 7 +++++++ HELP.md | 2 +- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8a46b7d..f323c505 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2021.03.01, v15.9.1 + +feature: +- (cloudcmd) icons: add archive icon for small screens +- (cloudcmd) add archive-link image + + 2021.03.01, v15.9.0 feature: diff --git a/HELP.md b/HELP.md index ac894c29..c9095f34 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.9.0 +# Cloud Commander v15.9.1 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL]) diff --git a/README.md b/README.md index 92f5ef66..1dbb1717 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v15.9.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v15.9.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL]) diff --git a/package.json b/package.json index a120a94d..9d07f6b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "15.9.0", + "version": "15.9.1", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", "homepage": "http://cloudcmd.io", From 90eae0e9446ce5e6e019b026c822ebc68f415c55 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 2 Mar 2021 14:40:56 +0200 Subject: [PATCH 0066/1230] test(route) flop -> win32 --- .putout.json | 3 +++ server/route.spec.js | 48 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/.putout.json b/.putout.json index 9827b5e3..cbb9353c 100644 --- a/.putout.json +++ b/.putout.json @@ -6,6 +6,9 @@ "fontello.json" ], "match": { + "*.js": { + "convert-esm-to-commonjs": "on" + }, "*.md": { "convert-commonjs-to-esm": "on" }, diff --git a/server/route.spec.js b/server/route.spec.js index 0752cd80..1ce0266b 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -1,5 +1,7 @@ 'use strict'; +const {Readable} = require('stream'); + const path = require('path'); const fs = require('fs'); @@ -25,6 +27,10 @@ const {request} = serveOnce(cloudcmd, { config: defaultConfig, }); +const {stringify} = JSON; + +const {assign} = Object; + test('cloudcmd: route: buttons: no console', async (t) => { const options = { config: { @@ -222,15 +228,24 @@ test('cloudcmd: route: not found', async (t) => { test('cloudcmd: route: sendIndex: encode', async (t) => { const name = '">'; const nameEncoded = '"><svg onload=alert(3);>'; + const path = '/'; const files = [{ name, }]; - const read = stub().returns({ - type: 'directory', + const stream = Readable.from(stringify({ + path, files, + })); + + assign(stream, { + path, + files, + type: 'directory', }); + const read = stub().resolves(stream); + mockRequire('win32', { read, }); @@ -242,7 +257,8 @@ test('cloudcmd: route: sendIndex: encode', async (t) => { configManager: createConfigManager(), }); - const {body} = await request.get('/'); + const response = await request.get('/'); + const {body} = response; stopAll(); @@ -252,16 +268,25 @@ test('cloudcmd: route: sendIndex: encode', async (t) => { test('cloudcmd: route: sendIndex: encode: not encoded', async (t) => { const name = '">'; + const path = '/'; const files = [{ name, }]; - const read = async (path) => ({ + const stream = Readable.from(stringify({ path, files, + })); + + assign(stream, { + path, + files, + type: 'directory', }); - mockRequire('flop', { + const read = stub().resolves(stream); + + mockRequire('win32', { read, }); @@ -279,16 +304,25 @@ test('cloudcmd: route: sendIndex: encode: not encoded', async (t) => { test('cloudcmd: route: sendIndex: ddos: render', async (t) => { const name = '$$$\'"'; + const path = '/'; const files = [{ name, }]; - const read = async (path) => ({ + const stream = Readable.from(stringify({ path, files, + })); + + assign(stream, { + path, + files, + type: 'directory', }); - mockRequire('flop', { + const read = stub().resolves(stream); + + mockRequire('win32', { read, }); From edbebd983eae1f203ac5322eb390dc8ae0c84571 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 2 Mar 2021 12:42:54 +0000 Subject: [PATCH 0067/1230] chore(cloudcmd) lint using actions --- server/route.spec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/route.spec.js b/server/route.spec.js index 1ce0266b..556da03b 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -257,8 +257,7 @@ test('cloudcmd: route: sendIndex: encode', async (t) => { configManager: createConfigManager(), }); - const response = await request.get('/'); - const {body} = response; + const {body} = await request.get('/'); stopAll(); From 08cc5dbba41a4c67bce581b652a64bfe1cb65088 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 5 Mar 2021 21:01:10 +0200 Subject: [PATCH 0068/1230] chore(archive-link) update --- img/archive-link.png | Bin 576 -> 563 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/archive-link.png b/img/archive-link.png index fadbdb6d7f2e127fa999d041a668fd50c144f582..b134c2b8f4bdd5bcd9a7ab5d31023587dce49d15 100644 GIT binary patch delta 487 zcmVV2ZMp=cDqui(@BfwMYURequdzDP=7`>xS_b+@At-JGC?Mj zfy?E>cDu!9v%zw?gxl>#KA$huYPA>2zgJ#OB7;E?#N%-=gaL+O$R~><6bhkGD3ltF zhJyS7<5(^MIaUxhu2w6Y&u36S z5Q#)!?}1tdW`DC8QmK?Svv~as@pwG&`FxiaYXuzKgVAWDOJ{(BvxE?qe8Ucy&*!=a z%4n~~5upAM3b+I1Ofp>qft~U70}&qG!yuXo~EvV8knH+-+R5DkG3(aGAVJF%jI4j dAZ+HVjcNol&KVmX>jUX6 z=>f0TU(zp1J#@3@u-Z) zV-8d^ z&zBmFhJ-u=#0?oHlL=z6m>4rqLb#kxC){o~3WY+6ZUg+xZUsc6QH(|-F_sWEZZ;ce zng+@Pfj|J(41eS@Fr7{jkH-x&i`UN(hr9FWNpO0q$Ye4|CX+~|Qo_i4f6uI{>OZ=w24JyR{0s(ze9r&W q>-FDqCWUs$X0zY#K-kQ`HvR+8M9lZ&YnEdG0000 Date: Tue, 9 Mar 2021 17:42:01 +0200 Subject: [PATCH 0069/1230] chore(user-menu) lint --- server/user-menu.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/server/user-menu.js b/server/user-menu.js index 9e803ded..abf752a6 100644 --- a/server/user-menu.js +++ b/server/user-menu.js @@ -5,6 +5,7 @@ const {readFile} = require('fs/promises'); const {join} = require('path'); +const montag = require('montag'); const tryToCatch = require('try-to-catch'); const currify = require('currify'); const findUp = require('find-up'); @@ -77,8 +78,8 @@ async function onGET({req, res, menuName}) { } function getError(error, source) { - return ` - const e = Error(\`
${codeframe({
+    return montag`
+            const e = Error(\`
${codeframe({
         error,
         source,
         highlightCode: false,
@@ -96,8 +97,8 @@ function sendDefaultMenu(res) {
     });
 }
 
-function transpile(source) {
-    return tryToCatch(putout, source, {
+async function transpile(source) {
+    return await tryToCatch(putout, source, {
         plugins: [
             'convert-esm-to-commonjs',
             'strict-mode',
@@ -105,3 +106,4 @@ function transpile(source) {
         ],
     });
 }
+

From a091a382cac863027b1e233f3038ee5164715639 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 9 Mar 2021 15:52:07 +0000
Subject: [PATCH 0070/1230] chore(cloudcmd) lint using actions

---
 client/modules/terminal.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/modules/terminal.js b/client/modules/terminal.js
index 09d67b4c..db203cb9 100644
--- a/client/modules/terminal.js
+++ b/client/modules/terminal.js
@@ -51,7 +51,7 @@ module.exports.init = async () => {
     
     await CloudCmd.View();
     await loadAll();
-    await create();
+    create();
 };
 
 module.exports.show = show;

From 21e7ea7d4c9912877400ca6b855f2e5f109e0363 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 9 Mar 2021 18:41:47 +0200
Subject: [PATCH 0071/1230] test(cloudcmd) ok -> match

---
 .putout.json                          |  3 +++
 server/fixture-user-menu/io-cp-fix.js |  4 +++-
 server/fixture-user-menu/io-cp.js     | 12 +++++++-----
 server/fixture-user-menu/io-mv-fix.js |  4 +++-
 server/fixture-user-menu/io-mv.js     | 12 +++++++-----
 server/markdown/index.spec.js         |  2 +-
 server/route.spec.js                  |  2 +-
 server/terminal.spec.js               |  2 +-
 8 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/.putout.json b/.putout.json
index cbb9353c..9eb3904a 100644
--- a/.putout.json
+++ b/.putout.json
@@ -6,6 +6,9 @@
         "fontello.json"
     ],
     "match": {
+        "route.spec.js": {
+            "tape/convert-ok-to-match": "off"
+        },
         "*.js": {
             "convert-esm-to-commonjs": "on"
         },
diff --git a/server/fixture-user-menu/io-cp-fix.js b/server/fixture-user-menu/io-cp-fix.js
index 8ce51b3b..a8d5279f 100644
--- a/server/fixture-user-menu/io-cp-fix.js
+++ b/server/fixture-user-menu/io-cp-fix.js
@@ -1,2 +1,4 @@
 'use strict';
-await IO.copy(dirPath, mp3Dir, mp3Names);
+async function copy() {
+    await IO.copy(dirPath, mp3Dir, mp3Names);
+}
diff --git a/server/fixture-user-menu/io-cp.js b/server/fixture-user-menu/io-cp.js
index 5b3e0fa4..0547933c 100644
--- a/server/fixture-user-menu/io-cp.js
+++ b/server/fixture-user-menu/io-cp.js
@@ -1,5 +1,7 @@
-await IO.cp({
-    from: dirPath,
-    to: mp3Dir,
-    names: mp3Names,
-});
+async function copy() {
+    await IO.cp({
+        from: dirPath,
+        to: mp3Dir,
+        names: mp3Names,
+    });
+}
diff --git a/server/fixture-user-menu/io-mv-fix.js b/server/fixture-user-menu/io-mv-fix.js
index c56998a8..5c66858a 100644
--- a/server/fixture-user-menu/io-mv-fix.js
+++ b/server/fixture-user-menu/io-mv-fix.js
@@ -1,2 +1,4 @@
 'use strict';
-await IO.move(dirPath, mp3Dir, mp3Names);
+async function move() {
+    await IO.move(dirPath, mp3Dir, mp3Names);
+}
diff --git a/server/fixture-user-menu/io-mv.js b/server/fixture-user-menu/io-mv.js
index 8d11ed43..56884891 100644
--- a/server/fixture-user-menu/io-mv.js
+++ b/server/fixture-user-menu/io-mv.js
@@ -1,5 +1,7 @@
-await IO.mv({
-    from: dirPath,
-    to: mp3Dir,
-    names: mp3Names,
-});
+async function move() {
+    await IO.mv({
+        from: dirPath,
+        to: mp3Dir,
+        names: mp3Names,
+    });
+}
diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.js
index 38637bf8..60fff869 100644
--- a/server/markdown/index.spec.js
+++ b/server/markdown/index.spec.js
@@ -71,7 +71,7 @@ test('cloudcmd: markdown: put: error', async (t) => {
     
     const [e] = await tryToCatch(_markdown, name, '/', mdStream);
     
-    t.ok(e.message.includes('ENOENT: no such file or directory'), 'should emit error');
+    t.match(e.message, /ENOENT: no such file or directory/, 'should emit error');
     t.end();
 });
 
diff --git a/server/route.spec.js b/server/route.spec.js
index 556da03b..10f67b7e 100644
--- a/server/route.spec.js
+++ b/server/route.spec.js
@@ -221,7 +221,7 @@ test('cloudcmd: route: not found', async (t) => {
         options,
     });
     
-    t.ok(body.includes('ENOENT: no such file or directory'), 'should return error');
+    t.match(body, /ENOENT: no such file or directory/, 'should return error');
     t.end();
 });
 
diff --git a/server/terminal.spec.js b/server/terminal.spec.js
index 259d3aaf..863f4b48 100644
--- a/server/terminal.spec.js
+++ b/server/terminal.spec.js
@@ -58,7 +58,7 @@ test('cloudcmd: terminal: enabled: no string', (t) => {
     const msg = 'cloudcmd --terminal: Cannot find module \'hello\'';
     const [arg] = log.args[0];
     
-    t.ok(arg.includes(msg), 'should call with msg');
+    t.match(arg, RegExp(msg), 'should call with msg');
     t.end();
 });
 

From df60dd7ba081e7bc62272810b043fb018a18f950 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 17:44:54 +0200
Subject: [PATCH 0072/1230] fix(route) unable to navigate between folders
 (#333)

---
 server/route.js      |  5 ++++-
 server/route.spec.js | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/server/route.js b/server/route.js
index 787bab4a..c35c1716 100644
--- a/server/route.js
+++ b/server/route.js
@@ -79,7 +79,10 @@ async function route({config, options, request, response}) {
     const fullPath = root(rootName, config('root'));
     
     const read = getReadDir(config);
-    const [error, stream] = await tryToCatch(read, fullPath);
+    const [error, stream] = await tryToCatch(read, fullPath, {
+        root: config('root'),
+    });
+    
     const {html} = options;
     
     if (error)
diff --git a/server/route.spec.js b/server/route.spec.js
index 10f67b7e..ed677e3f 100644
--- a/server/route.spec.js
+++ b/server/route.spec.js
@@ -28,7 +28,6 @@ const {request} = serveOnce(cloudcmd, {
 });
 
 const {stringify} = JSON;
-
 const {assign} = Object;
 
 test('cloudcmd: route: buttons: no console', async (t) => {
@@ -459,3 +458,35 @@ test('cloudcmd: route: content length', async (t) => {
     t.end();
 });
 
+test('cloudcmd: route: read: root', async (t) => {
+    const read = stub();
+    
+    mockRequire('win32', {
+        read,
+    });
+    
+    reRequire(routePath);
+    
+    const cloudcmd = reRequire(cloudcmdPath);
+    const configManager = createConfigManager();
+    const root = '/hello';
+    configManager('root', root);
+    
+    const {request} = serveOnce(cloudcmd, {
+        configManager,
+    });
+    
+    await request.get('/fs/route.js');
+    
+    stopAll();
+    
+    const expected = [
+        '/hello/route.js', {
+            root,
+        },
+    ];
+    
+    t.calledWith(read, expected);
+    t.end();
+});
+

From a3f0f4ecae1c2ad7549e9274d98564cafb1fc90a Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 17:45:59 +0200
Subject: [PATCH 0073/1230] feature(package) socket.io v4.0.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 9d07f6b2..b445baee 100644
--- a/package.json
+++ b/package.json
@@ -127,7 +127,7 @@
     "restbox": "^3.0.0",
     "shortdate": "^2.0.0",
     "simport": "^1.0.1",
-    "socket.io": "^3.0.5",
+    "socket.io": "^4.0.0",
     "socket.io-client": "^3.0.5",
     "squad": "^3.0.0",
     "table": "^6.0.1",

From bb3e07def34456dac46ebf0f7ab33edb894e4196 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 17:46:09 +0200
Subject: [PATCH 0074/1230] feature(package) socket.io-client v4.0.0

---
 json/modules.json | 2 +-
 package.json      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/json/modules.json b/json/modules.json
index 3403b5bc..f9713e9c 100644
--- a/json/modules.json
+++ b/json/modules.json
@@ -21,7 +21,7 @@
     ],
     "remote": [{
         "name": "socket",
-        "version": "3.1.0",
+        "version": "4.0.0",
         "local": "/socket.io/socket.io.js",
         "remote": "https://cdnjs.cloudflare.com/ajax/libs/socket.io/{{ version }}/socket.io.js"
     }],
diff --git a/package.json b/package.json
index b445baee..b90ee265 100644
--- a/package.json
+++ b/package.json
@@ -128,7 +128,7 @@
     "shortdate": "^2.0.0",
     "simport": "^1.0.1",
     "socket.io": "^4.0.0",
-    "socket.io-client": "^3.0.5",
+    "socket.io-client": "^4.0.0",
     "squad": "^3.0.0",
     "table": "^6.0.1",
     "thread-it": "^1.1.0",

From b5618412c355cb624dfccd8a5d5e26fe0a6045ca Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 17:46:21 +0200
Subject: [PATCH 0075/1230] feature(package) open v8.0.2

---
 package.json     | 2 +-
 server/server.js | 4 +---
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index b90ee265..8ea066f0 100644
--- a/package.json
+++ b/package.json
@@ -116,7 +116,7 @@
     "object.omit": "^3.0.0",
     "once": "^1.4.0",
     "onezip": "^5.0.0",
-    "open": "^7.0.0",
+    "open": "^8.0.2",
     "package-json": "^6.0.0",
     "ponse": "^6.0.0",
     "pullout": "^4.0.0",
diff --git a/server/server.js b/server/server.js
index 97ef762b..ec97345d 100644
--- a/server/server.js
+++ b/server/server.js
@@ -84,9 +84,7 @@ module.exports = async (options, config) => {
     if (!config('open'))
         return;
     
-    const [openError] = await tryToCatch(opn, url, {
-        url: true,
-    });
+    const [openError] = await tryToCatch(opn, url);
     
     if (openError)
         console.error('cloudcmd --open:', openError.message);

From b090b498a824a5e0f949cb3c6ea34924862cc052 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 17:54:44 +0200
Subject: [PATCH 0076/1230] test(route) coverage

---
 server/route.spec.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/server/route.spec.js b/server/route.spec.js
index ed677e3f..dce63b15 100644
--- a/server/route.spec.js
+++ b/server/route.spec.js
@@ -459,7 +459,10 @@ test('cloudcmd: route: content length', async (t) => {
 });
 
 test('cloudcmd: route: read: root', async (t) => {
-    const read = stub();
+    const stream = Readable.from('hello');
+    stream.contentLength = 5;
+    
+    const read = stub().returns(stream);
     
     mockRequire('win32', {
         read,

From e77d8a709a5bfcb0db9b7d0d1d022075512b5bbb Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 16 Mar 2021 18:02:52 +0200
Subject: [PATCH 0077/1230] chore(package) v15.9.2

---
 ChangeLog    | 11 +++++++++++
 HELP.md      |  2 +-
 README.md    |  2 +-
 package.json |  2 +-
 4 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f323c505..b7e483d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2021.03.16, v15.9.2
+
+fix:
+- (route) unable to navigate between folders (#333)
+
+feature:
+- (package) open v8.0.2
+- (package) socket.io-client v4.0.0
+- (package) socket.io v4.0.0
+
+
 2021.03.01, v15.9.1
 
 feature:
diff --git a/HELP.md b/HELP.md
index c9095f34..8f29d02d 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.1
+# Cloud Commander v15.9.2
 
 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL])
 
diff --git a/README.md b/README.md
index 1dbb1717..dbc1b054 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
+# Cloud Commander v15.9.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
 
 ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
 
diff --git a/package.json b/package.json
index 8ea066f0..29b00e33 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cloudcmd",
-  "version": "15.9.1",
+  "version": "15.9.2",
   "author": "coderaiser  (https://github.com/coderaiser)",
   "description": "File manager for the web with console and editor",
   "homepage": "http://cloudcmd.io",

From 1801689ef7780592804480b5931b589ab7c498a1 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Wed, 17 Mar 2021 16:01:02 +0200
Subject: [PATCH 0078/1230] fix(cloudcmd) Docker latest-alpine (15.9.2) stopped
 with errors (#337)

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 29b00e33..f7a85d18 100644
--- a/package.json
+++ b/package.json
@@ -104,7 +104,7 @@
     "for-each-key": "^2.0.0",
     "format-io": "^2.0.0",
     "fullstore": "^3.0.0",
-    "http-auth": "^4.1.2",
+    "http-auth": "4.1.2 || >4.1.3",
     "inly": "^4.0.0",
     "jaguar": "^6.0.0",
     "jju": "^1.3.0",

From ad689ece31c54fab475619b347d66e50330833dd Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Wed, 17 Mar 2021 16:08:43 +0200
Subject: [PATCH 0079/1230] chore(package) v15.9.3

---
 ChangeLog    | 6 ++++++
 HELP.md      | 2 +-
 README.md    | 2 +-
 package.json | 2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b7e483d0..6f135104 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021.03.17, v15.9.3
+
+fix:
+- (cloudcmd) Docker latest-alpine (15.9.2) stopped with errors (#337)
+
+
 2021.03.16, v15.9.2
 
 fix:
diff --git a/HELP.md b/HELP.md
index 8f29d02d..04cc9a3c 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.2
+# Cloud Commander v15.9.3
 
 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL])
 
diff --git a/README.md b/README.md
index dbc1b054..bb1c587a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
+# Cloud Commander v15.9.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
 
 ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
 
diff --git a/package.json b/package.json
index f7a85d18..ab336483 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cloudcmd",
-  "version": "15.9.2",
+  "version": "15.9.3",
   "author": "coderaiser  (https://github.com/coderaiser)",
   "description": "File manager for the web with console and editor",
   "homepage": "http://cloudcmd.io",

From 3e303253d26fbad6d7e1186b0986ee32f27cc15b Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 5 Apr 2021 19:07:07 +0300
Subject: [PATCH 0080/1230] feature(package) putout v16.4.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index ab336483..4e3e39ee 100644
--- a/package.json
+++ b/package.json
@@ -120,7 +120,7 @@
     "package-json": "^6.0.0",
     "ponse": "^6.0.0",
     "pullout": "^4.0.0",
-    "putout": "^15.0.0",
+    "putout": "^16.4.0",
     "redzip": "^2.0.0",
     "rendy": "^3.0.0",
     "restafary": "^10.0.0",

From 879bc2ff8c3e8b8c9276ac9ca9fe7a0de64813ae Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 5 Apr 2021 19:07:17 +0300
Subject: [PATCH 0081/1230] feature(package) open v8.0.5

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 4e3e39ee..2a303238 100644
--- a/package.json
+++ b/package.json
@@ -116,7 +116,7 @@
     "object.omit": "^3.0.0",
     "once": "^1.4.0",
     "onezip": "^5.0.0",
-    "open": "^8.0.2",
+    "open": "^8.0.5",
     "package-json": "^6.0.0",
     "ponse": "^6.0.0",
     "pullout": "^4.0.0",

From 843c319b1e01cf33119ab63b8b90bb358760960d Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 5 Apr 2021 19:07:25 +0300
Subject: [PATCH 0082/1230] feature(package) socket.io-client v4.0.1

---
 json/modules.json | 2 +-
 package.json      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/json/modules.json b/json/modules.json
index f9713e9c..17691e0b 100644
--- a/json/modules.json
+++ b/json/modules.json
@@ -21,7 +21,7 @@
     ],
     "remote": [{
         "name": "socket",
-        "version": "4.0.0",
+        "version": "4.0.1",
         "local": "/socket.io/socket.io.js",
         "remote": "https://cdnjs.cloudflare.com/ajax/libs/socket.io/{{ version }}/socket.io.js"
     }],
diff --git a/package.json b/package.json
index 2a303238..34891060 100644
--- a/package.json
+++ b/package.json
@@ -128,7 +128,7 @@
     "shortdate": "^2.0.0",
     "simport": "^1.0.1",
     "socket.io": "^4.0.0",
-    "socket.io-client": "^4.0.0",
+    "socket.io-client": "^4.0.1",
     "squad": "^3.0.0",
     "table": "^6.0.1",
     "thread-it": "^1.1.0",

From 8c8ac3bab4e0ce0eeb2a0a187e6614c5137bbc78 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 5 Apr 2021 19:12:18 +0300
Subject: [PATCH 0083/1230] chore(package) v15.9.4

---
 ChangeLog    | 6 ++++++
 HELP.md      | 2 +-
 README.md    | 2 +-
 package.json | 2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6f135104..693411fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021.04.05, v15.9.4
+feature:
+- (package) socket.io-client v4.0.1
+- (package) open v8.0.5
+- (package) putout v16.4.0
+
 2021.03.17, v15.9.3
 
 fix:
diff --git a/HELP.md b/HELP.md
index 04cc9a3c..dbfd5bfc 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.3
+# Cloud Commander v15.9.4
 
 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL])
 
diff --git a/README.md b/README.md
index bb1c587a..53fe0e45 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
+# Cloud Commander v15.9.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
 
 ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
 
diff --git a/package.json b/package.json
index 34891060..7b3912d4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cloudcmd",
-  "version": "15.9.3",
+  "version": "15.9.4",
   "author": "coderaiser  (https://github.com/coderaiser)",
   "description": "File manager for the web with console and editor",
   "homepage": "http://cloudcmd.io",

From 9a724a4bbab42a548d2082e0486f2e87062661a9 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 12 Apr 2021 18:46:58 +0300
Subject: [PATCH 0084/1230] fix(server) user-menu: e.message ->
 errorFind.message

---
 server/user-menu.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/user-menu.js b/server/user-menu.js
index abf752a6..b4647125 100644
--- a/server/user-menu.js
+++ b/server/user-menu.js
@@ -51,7 +51,7 @@ async function onGET({req, res, menuName}) {
     if (errorFind && errorFind.code !== 'ENOENT')
         return res
             .status(404)
-            .send(e.message);
+            .send(errorFind.message);
     
     const homeMenuPath = join(homedir(), menuName);
     const menuPath = currentMenuPath || homeMenuPath;

From 8c59333a020aab6e8fa5496ab9760ae7c3fa698e Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Mon, 12 Apr 2021 19:17:20 +0300
Subject: [PATCH 0085/1230] fix(load) put: replace #: single -> multiple

---
 client/dom/load.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/dom/load.js b/client/dom/load.js
index 8292909d..4351f271 100644
--- a/client/dom/load.js
+++ b/client/dom/load.js
@@ -99,7 +99,7 @@ module.exports.put = (url, body) => {
     const xhr = new XMLHttpRequest();
     
     url = encodeURI(url)
-        .replace('#', '%23');
+        .replace(/#/g, '%23');
     
     xhr.open('put', url, true);
     

From 241efe971b0bd04f90c0e24f809ad2edcbcbacd3 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 4 May 2021 20:50:48 +0300
Subject: [PATCH 0086/1230] feature(package) putout v17.0.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7b3912d4..c694bb4a 100644
--- a/package.json
+++ b/package.json
@@ -120,7 +120,7 @@
     "package-json": "^6.0.0",
     "ponse": "^6.0.0",
     "pullout": "^4.0.0",
-    "putout": "^16.4.0",
+    "putout": "^17.0.0",
     "redzip": "^2.0.0",
     "rendy": "^3.0.0",
     "restafary": "^10.0.0",

From 5d93d5752cc6e216859309586c153f4aa1981e15 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 4 May 2021 21:02:06 +0300
Subject: [PATCH 0087/1230] chore(cloudcmd) lint

---
 .github/workflows/docker.yml | 2 +-
 .github/workflows/nodejs.yml | 2 +-
 .putout.json                 | 5 +++++
 client/modules/edit.js       | 4 +++-
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 6b857c86..305dea9c 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -15,7 +15,7 @@ jobs:
       - name: Use Node.js 14.x
         uses: actions/setup-node@v1
         with:
-          node-version: 14.x
+          node-version: 16.x
 
       - name: NPM Install
         run: |
diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index f56766f6..f14344dd 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -13,7 +13,7 @@ jobs:
       - name: Use Node.js 14.x
         uses: actions/setup-node@v1
         with:
-          node-version: 14.x
+          node-version: [14.x, 16.x]
 
       - name: Install Redrun
         run:
diff --git a/.putout.json b/.putout.json
index 9eb3904a..ebac046c 100644
--- a/.putout.json
+++ b/.putout.json
@@ -37,5 +37,10 @@
         "storage.js": {
             "remove-useless-async": "off"
         }
+    },
+    "match": {
+        "docker.yml": {
+            "github/set-node-versions": "off"
+        }
     }
 }
diff --git a/client/modules/edit.js b/client/modules/edit.js
index 1807145b..151b3f5d 100644
--- a/client/modules/edit.js
+++ b/client/modules/edit.js
@@ -66,7 +66,9 @@ function initConfig(options = {}) {
     
     checkFn('options.afterShow', options.afterShow);
     
-    const afterShow = {config};
+    const afterShow = {
+        config,
+    };
     
     config.afterShow = () => {
         afterShow();

From 5e63a524c1da436aac7aa9c726a74f95b40537dc Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 4 May 2021 22:23:46 +0300
Subject: [PATCH 0088/1230] docs(readme) example: io.listen -> new Server
 (#341)

---
 HELP.md   | 13 +++++++------
 README.md |  4 ++--
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/HELP.md b/HELP.md
index dbfd5bfc..374a17d8 100644
--- a/HELP.md
+++ b/HELP.md
@@ -665,7 +665,7 @@ And create `index.js`:
 ```js
 import http from 'http';
 import cloudcmd from 'cloudcmd';
-import io from 'socket.io';
+import {Server} from 'socket.io';
 import express from 'express';
 
 const app = express();
@@ -673,7 +673,7 @@ const port = 1337;
 const prefix = '/';
 
 const server = http.createServer(app);
-const socket = io.listen(server, {
+const socket = new Server(server, {
     path: `${prefix}socket.io`,
 });
 
@@ -718,9 +718,10 @@ Here is example with two `Config Managers`:
 ```js
 import http from 'http';
 import cloudcmd from 'cloudcmd';
-import io from 'socket.io';
-const app = require('express')();
+import {Server} from 'socket.io';
+import express from 'express';
 
+const app = express();
 const port = 8000;
 const prefix1 = '/1';
 const prefix2 = '/2';
@@ -728,11 +729,11 @@ const prefix2 = '/2';
 const {createConfigManager} = cloudcmd;
 
 const server = http.createServer(app);
-const socket1 = io.listen(server, {
+const socket1 = new Server(server, {
     path: `${prefix1}/socket.io`,
 });
 
-const socket2 = io.listen(server, {
+const socket2 = new Server(server, {
     path: `${prefix2}/socket.io`,
 });
 
diff --git a/README.md b/README.md
index 53fe0e45..3a3eda31 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,7 @@ And create `index.js`:
 ```js
 import http from 'http';
 import cloudcmd from 'cloudcmd';
-import io from 'socket.io';
+import {Server} from 'socket.io';
 import express from 'express';
 
 const app = express();
@@ -80,7 +80,7 @@ const port = 1337;
 const prefix = '/';
 
 const server = http.createServer(app);
-const socket = io.listen(server, {
+const socket = new Server(server, {
     path: `${prefix}socket.io`,
 });
 

From 262c72d44aa5e967a91c49846d3bc64328ea8ae8 Mon Sep 17 00:00:00 2001
From: khevin014 
Date: Fri, 28 May 2021 20:57:05 +0800
Subject: [PATCH 0089/1230] docs(help) added instructions to autostart cloudcmd
 on boot for systems using systemd (#347)

---
 HELP.md | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/HELP.md b/HELP.md
index 374a17d8..ac699090 100644
--- a/HELP.md
+++ b/HELP.md
@@ -948,6 +948,43 @@ While using Dropbox remember that there is no remote support for the console/ter
 - view
 - edit
 
+## Automatically start cloudcmd on boot (for systemd users)
+
+First, locate the command to run cloudcmd
+
+```sh
+which cloudcmd
+```
+take note of the result and create a systemd entry by executing
+
+```sh
+sudo nano /etc/systemd/system/cloudcmd.service
+```
+and use this template
+
+```
+[Unit]
+Description = Cloud Commander
+
+[Service]
+TimeoutStartSec = 0
+Restart = always
+ExecStart = THE RESULT OF which cloudcmd WE'VE EXECUTED EARLIER
+User = YOUR_USER
+
+[Install]
+WantedBy = multi-user.target
+```
+Don't forget to change the line for `ExecStart` and `User`
+
+Save the changes and exit editor.
+
+You may now enable cloudcmd and set it to autostart on boot by running:
+
+```sh
+sudo systemctl enable --now cloudcmd
+```
+
 ## Get involved
 
 There are a lot of ways to be involved in `Cloud Commander` development:

From baac531655369562d125633af704ce2ba08f5339 Mon Sep 17 00:00:00 2001
From: IhatemyISP 
Date: Fri, 4 Jun 2021 04:45:08 -0400
Subject: [PATCH 0090/1230] docs(help) added instructions to autostart cloudcmd
 on boot for FreeBSD systems (#348)

---
 HELP.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

diff --git a/HELP.md b/HELP.md
index ac699090..45f4c0fa 100644
--- a/HELP.md
+++ b/HELP.md
@@ -985,6 +985,90 @@ You may now enable cloudcmd and set it to autostart on boot by running:
 sudo systemctl enable --now cloudcmd
 ```
 
+## Automatically start cloudcmd on (for FreeBSD users)
+
+First, locate the command to run cloudcmd
+
+```
+which cloudcmd
+```
+
+take note of the result and create a rc script
+
+```
+vi /usr/local/etc/rc.d/cloudcmd
+```
+and use this template
+
+```
+!/bin/sh
+#
+# PROVIDE: cloudcmd
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+# Author: IhatemyISP (ihatemyisp.net)
+# Version: 1.0.0
+
+# Description:
+#    This script runs Cloud Commander as a service under the supplied user on boot
+
+#    1) Place file in /usr/local/etc/rc.d/
+#    2) Add cloudcmd_enable="YES" to /etc/rc.conf
+#    3) (Optional) To run as non-root, add cloudcmd_runAs="user" to /etc/rc.conf
+#    4) (Optional) To pass Cloud Commander args, add cloudcmd_args="" to /etc/rc.conf
+
+# Freebsd rc library
+. /etc/rc.subr
+
+# General Info
+name="cloudcmd"            # Safe name of program
+program_name="cloudcmd"   # Name of exec
+title="CloudCommander"          # Title to display in top/htop
+
+# RC.config vars
+load_rc_config $name      # Loading rc config vars
+: ${cloudcmd_enable="NO"}  # Default: Do not enable Cloud Commander
+: ${cloudcmd_runAs="root"} # Default: Run Cloud Commander as root
+
+# Freebsd Setup
+rcvar=cloudcmd_enable                   # Enables the rc.conf YES/NO flag
+pidfile="/var/run/${program_name}.pid" # PID file location
+
+# Env Setup
+export HOME=$( getent passwd "$cloudcmd_runAs" | cut -d: -f6 ) # Gets the home directory of the runAs user
+
+# Command Setup
+exec_path="/usr/local/bin/${program_name}" # Path to the cloudcmd exec, /usr/local/bin/ when installed globally
+output_file="/var/log/${program_name}.log" # Path to Cloud Commander output file
+
+# Command
+command="/usr/sbin/daemon"
+command_args="-r -t ${title} -u ${cloudcmd_runAs} -o ${output_file} -P ${pidfile} ${exec_path} ${cloudcmd_args}"
+
+# Loading Config
+load_rc_config ${name}
+run_rc_command "$1"
+```
+
+Enable autostart
+
+```
+echo cloudcmd_enable="YES" >> /etc/rc.conf
+```
+
+(Optional) Set user to run Cloud Commander as (default is root)
+
+```
+echo cloudcmd_runAs="user" >> /etc/rc.conf
+```
+
+Start the service (or just reboot)
+
+```
+service cloudcmd start
+```
+
 ## Get involved
 
 There are a lot of ways to be involved in `Cloud Commander` development:

From 954f2c047c4903768f8cfa53e73703baa54f4cab Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 12:07:02 +0300
Subject: [PATCH 0091/1230] feature(package) putout v18.0.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index c694bb4a..5c7220df 100644
--- a/package.json
+++ b/package.json
@@ -120,7 +120,7 @@
     "package-json": "^6.0.0",
     "ponse": "^6.0.0",
     "pullout": "^4.0.0",
-    "putout": "^17.0.0",
+    "putout": "^18.0.1",
     "redzip": "^2.0.0",
     "rendy": "^3.0.0",
     "restafary": "^10.0.0",

From bbe790e551775d5048a364595ac373e9fc78fdf4 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 12:08:04 +0300
Subject: [PATCH 0092/1230] feature(package) es6-promisify v7.0.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 5c7220df..fac556cd 100644
--- a/package.json
+++ b/package.json
@@ -96,7 +96,7 @@
     "deepword": "^8.0.0",
     "dword": "^13.0.0",
     "edward": "^13.0.0",
-    "es6-promisify": "^6.0.2",
+    "es6-promisify": "^7.0.0",
     "execon": "^1.2.0",
     "express": "^4.13.0",
     "files-io": "^4.0.0",

From f92152195cd72e8291bc39796bd1c025de8612d0 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 12:08:09 +0300
Subject: [PATCH 0093/1230] feature(package) eslint-plugin-putout v8.0.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index fac556cd..74bd155c 100644
--- a/package.json
+++ b/package.json
@@ -164,7 +164,7 @@
     "emitify": "^4.0.1",
     "eslint": "^7.0.0-rc.0",
     "eslint-plugin-node": "^11.0.0",
-    "eslint-plugin-putout": "^7.0.0",
+    "eslint-plugin-putout": "^8.0.1",
     "extract-text-webpack-plugin": "^4.0.0-alpha.0",
     "gritty": "^6.0.0",
     "gunzip-maybe": "^1.3.1",

From fbc8ae25ad3f9df8d45e798e2c7c1be64807fb21 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 14:13:46 +0300
Subject: [PATCH 0094/1230] chore(cloudcmd) lint

---
 .putout.json                 | 9 +++------
 client/dom/current-file.js   | 2 +-
 client/key/index.js          | 1 +
 client/modules/view/index.js | 2 +-
 test/server/env.js           | 4 ++--
 5 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/.putout.json b/.putout.json
index ebac046c..eb480d3d 100644
--- a/.putout.json
+++ b/.putout.json
@@ -22,10 +22,9 @@
             "remove-process-exit": "on"
         },
         "server/{server,exit}.js": {
-            "remove-process-exit": "off",
-            "remove-console": "off"
+            "remove-process-exit": "off"
         },
-        "server/{terminal,distribute/log}.js": {
+        "server/{server,exit,terminal,distribute/log}.js": {
             "remove-console": "off"
         },
         "client/{client,cloudcmd,load-module}.js": {
@@ -36,9 +35,7 @@
         },
         "storage.js": {
             "remove-useless-async": "off"
-        }
-    },
-    "match": {
+        },
         "docker.yml": {
             "github/set-node-versions": "off"
         }
diff --git a/client/dom/current-file.js b/client/dom/current-file.js
index 4e3c36f3..f7acb979 100644
--- a/client/dom/current-file.js
+++ b/client/dom/current-file.js
@@ -212,7 +212,7 @@ module.exports.setCurrentFile = (currentFile, options) => {
          * but it should be false
          * to prevent default behavior
          */
-        if (!o || o.history !== false) {
+        if (!o || o.history) {
             const historyPath = path === '/' ? path : FS + path;
             DOM.setHistory(historyPath, null, historyPath);
         }
diff --git a/client/key/index.js b/client/key/index.js
index 79f58552..dfb5d96c 100644
--- a/client/key/index.js
+++ b/client/key/index.js
@@ -261,6 +261,7 @@ async function switchKey(event) {
             Operation.show('extract');
         else
             CloudCmd.Menu.show();
+        
         event.preventDefault();
         break;
     
diff --git a/client/modules/view/index.js b/client/modules/view/index.js
index 26426429..39b491fe 100644
--- a/client/modules/view/index.js
+++ b/client/modules/view/index.js
@@ -101,7 +101,7 @@ async function show(data, options = {}) {
     if (Loading)
         return;
     
-    if (!options || options.bindKeys !== false)
+    if (!options || options.bindKeys)
         Events.addKey(listener);
     
     El = createElement('div', {
diff --git a/test/server/env.js b/test/server/env.js
index 2357ef63..0c0d9089 100644
--- a/test/server/env.js
+++ b/test/server/env.js
@@ -21,7 +21,7 @@ test('env: big', (t) => {
 
 test('env: bool: false', (t) => {
     process.env.cloudcmd_terminal = 'false';
-    t.equal(env.bool('terminal'), false, 'should return false');
+    t.notOk(env.bool('terminal'), 'should return false');
     
     delete process.env.cloudcmd_terminal;
     t.end();
@@ -30,7 +30,7 @@ test('env: bool: false', (t) => {
 test('env: bool: true', (t) => {
     process.env.cloudcmd_terminal = 'true';
     
-    t.equal(env.bool('terminal'), true, 'should be true');
+    t.ok(env.bool('terminal'), 'should be true');
     
     delete process.env.cloudcmd_terminal;
     t.end();

From 1736ec7be2cae3e271636ef79026f1fa9ed0b6ad Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 14:14:55 +0300
Subject: [PATCH 0095/1230] chore(cloudcmd) spell

---
 .yaspellerrc | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/.yaspellerrc b/.yaspellerrc
index 2df4b282..7e29119e 100644
--- a/.yaspellerrc
+++ b/.yaspellerrc
@@ -29,6 +29,7 @@
         "Zalitok",
         "WebSocket",
         "auth",
+        "autostart",
         "binded",
         "cd",
         "cloudcmd",
@@ -56,6 +57,7 @@
         "npm",
         "or io",
         "patreon",
+        "rc",
         "refactor",
         "sexualized",
         "sslPort",
@@ -64,6 +66,7 @@
         "v0",
         "v1",
         "v2",
-        "yml"
+        "yml",
+        "systemd"
     ]
 }

From f3e03375843c97b1a4ad892ff3a7f4a35b8169d3 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Tue, 8 Jun 2021 14:15:52 +0300
Subject: [PATCH 0096/1230] chore(package) v15.9.5

---
 ChangeLog    | 13 +++++++++++++
 HELP.md      |  2 +-
 README.md    |  2 +-
 package.json |  2 +-
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 693411fb..2ff026d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2021.06.08, v15.9.5
+
+fix:
+- (load) put: replace #: single -> multiple
+- (server) user-menu: e.message -> errorFind.message
+
+feature:
+- (package) eslint-plugin-putout v8.0.1
+- (package) es6-promisify v7.0.0
+- (package) putout v18.0.1
+- (package) putout v17.0.0
+
+
 2021.04.05, v15.9.4
 feature:
 - (package) socket.io-client v4.0.1
diff --git a/HELP.md b/HELP.md
index 45f4c0fa..07e2bc4b 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.4
+# Cloud Commander v15.9.5
 
 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL])
 
diff --git a/README.md b/README.md
index 3a3eda31..854759cd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
+# Cloud Commander v15.9.5 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
 
 ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
 
diff --git a/package.json b/package.json
index 74bd155c..08be4b8c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cloudcmd",
-  "version": "15.9.4",
+  "version": "15.9.5",
   "author": "coderaiser  (https://github.com/coderaiser)",
   "description": "File manager for the web with console and editor",
   "homepage": "http://cloudcmd.io",

From e73c327687e4f91682dbc37847ece40e36f50b72 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Thu, 10 Jun 2021 22:41:01 +0300
Subject: [PATCH 0097/1230] docs(help) add missing "boot"

---
 HELP.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/HELP.md b/HELP.md
index 07e2bc4b..7eacf844 100644
--- a/HELP.md
+++ b/HELP.md
@@ -948,7 +948,7 @@ While using Dropbox remember that there is no remote support for the console/ter
 - view
 - edit
 
-## Automatically start cloudcmd on boot (for systemd users)
+## Automatically start cloudcmd on boot for `systemd`
 
 First, locate the command to run cloudcmd
 
@@ -985,7 +985,7 @@ You may now enable cloudcmd and set it to autostart on boot by running:
 sudo systemctl enable --now cloudcmd
 ```
 
-## Automatically start cloudcmd on (for FreeBSD users)
+## Automatically start cloudcmd on boot for `FreeBSD`
 
 First, locate the command to run cloudcmd
 

From 26fad025078bc97a204f4e7dc7f5f08fd932e7d7 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Sun, 13 Jun 2021 15:27:00 +0300
Subject: [PATCH 0098/1230] feature(package) @cloudcmd/move-files v5.0.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 08be4b8c..ec842ac2 100644
--- a/package.json
+++ b/package.json
@@ -81,7 +81,7 @@
   "dependencies": {
     "@cloudcmd/dropbox": "^4.0.1",
     "@cloudcmd/fileop": "^5.0.0",
-    "@cloudcmd/move-files": "^4.0.0",
+    "@cloudcmd/move-files": "^5.0.0",
     "@cloudcmd/read-files-sync": "^2.0.0",
     "@putout/cli-validate-args": "^1.0.1",
     "@putout/plugin-cloudcmd": "^1.2.0",

From e236e87171825b0caf4869a6bd205ad9c5a615df Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Sun, 13 Jun 2021 15:45:24 +0300
Subject: [PATCH 0099/1230] chore(package) v15.9.6

---
 ChangeLog    | 6 ++++++
 HELP.md      | 2 +-
 README.md    | 2 +-
 package.json | 2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2ff026d8..ef61d816 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021.06.13, v15.9.6
+
+feature:
+- (package) @cloudcmd/move-files v5.0.0
+
+
 2021.06.08, v15.9.5
 
 fix:
diff --git a/HELP.md b/HELP.md
index 7eacf844..89abbfa8 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.5
+# Cloud Commander v15.9.6
 
 ### [Main][MainURL] [Blog][BlogURL] Live(![Heroku][Heroku_LIVE_IMG] [Heroku][HerokuURL])
 
diff --git a/README.md b/README.md
index 854759cd..f9455f32 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Cloud Commander v15.9.5 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
+# Cloud Commander v15.9.6 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
 
 ### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
 
diff --git a/package.json b/package.json
index ec842ac2..61b1c583 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cloudcmd",
-  "version": "15.9.5",
+  "version": "15.9.6",
   "author": "coderaiser  (https://github.com/coderaiser)",
   "description": "File manager for the web with console and editor",
   "homepage": "http://cloudcmd.io",

From b67526f09b9a8ae1a3f9938a512b0f8aef9ec0ff Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Sun, 13 Jun 2021 22:57:19 +0300
Subject: [PATCH 0100/1230] chore(actions) node: add versions matrix

---
 .github/workflows/nodejs.yml | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index f14344dd..f87c88a8 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -7,13 +7,19 @@ jobs:
     runs-on: ubuntu-latest
     env:
       NAME: cloudcmd
-
+    
+    strategy:
+      matrix:
+        node-version:
+          - 14.x
+          - 16.x
     steps:
-      - uses: actions/checkout@master
-      - name: Use Node.js 14.x
+      - uses: actions/checkout@v1
+      - name: Use Node.js ${{ matrix.node-version }}
         uses: actions/setup-node@v1
         with:
-          node-version: [14.x, 16.x]
+          node-version: ${{ matrix.node-version }}
+
 
       - name: Install Redrun
         run:

From abe512c6556c14e3e8a03ebd031021477ab4a8e3 Mon Sep 17 00:00:00 2001
From: coderaiser 
Date: Sun, 27 Jun 2021 15:38:35 +0300
Subject: [PATCH 0101/1230] feature(config) add more descriptive titles

---
 tmpl/config.hbs | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/tmpl/config.hbs b/tmpl/config.hbs
index b7a3e757..68683617 100644
--- a/tmpl/config.hbs
+++ b/tmpl/config.hbs
@@ -1,5 +1,5 @@
 
    -
  • +
  • -
  • +
  • -
  • +
  • -
  • -
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
'; diff --git a/common/try-to-promise-all.spec.js b/common/try-to-promise-all.spec.js index 628bc931..0e4a25a9 100644 --- a/common/try-to-promise-all.spec.js +++ b/common/try-to-promise-all.spec.js @@ -6,7 +6,7 @@ const tryToPromiseAll = require('./try-to-promise-all'); const resolve = Promise.resolve.bind(Promise); const reject = Promise.reject.bind(Promise); -test('try-to-promise-all', async (t) => { +test('commons: try-to-promise-all', async (t) => { const [, ...result] = await tryToPromiseAll([ resolve('a'), resolve('b'), @@ -18,7 +18,7 @@ test('try-to-promise-all', async (t) => { t.end(); }); -test('try-to-promise-all: error', async (t) => { +test('commons: try-to-promise-all: error', async (t) => { const [e] = await tryToPromiseAll([ reject('a'), ]); diff --git a/server/distribute/log.spec.js b/server/distribute/log.spec.js index 1078c82a..64549a49 100644 --- a/server/distribute/log.spec.js +++ b/server/distribute/log.spec.js @@ -31,4 +31,6 @@ test('distribute: log: config', (t) => { config('log', logOriginal); t.end(); +}, { + checkAssertionsCount: false }); diff --git a/test/server/columns.js b/test/server/columns.js index c57705d7..cd48247e 100644 --- a/test/server/columns.js +++ b/test/server/columns.js @@ -5,7 +5,7 @@ const fs = require('fs'); const {reRequire} = require('mock-require'); const columnsPath = '../../server/columns'; -test('columns', (t) => { +test('columns: prod', (t) => { const {NODE_ENV} = process.env; process.env.NODE_ENV = ''; const columns = reRequire(columnsPath); From f5f30489086b2d0ccf049b74f08f24269da917cc Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 6 Mar 2022 17:48:21 +0000 Subject: [PATCH 0173/1230] chore(cloudcmd) lint using actions --- server/distribute/log.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/distribute/log.spec.js b/server/distribute/log.spec.js index 64549a49..462b9875 100644 --- a/server/distribute/log.spec.js +++ b/server/distribute/log.spec.js @@ -32,5 +32,5 @@ test('distribute: log: config', (t) => { t.end(); }, { - checkAssertionsCount: false + checkAssertionsCount: false, }); From 23fcc2b8f711cad9d1d3ea0345a27001b0ead98d Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 13:01:07 +0300 Subject: [PATCH 0174/1230] feature(package) win32 v7.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7379d6b9..114bae8b 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", - "win32": "^6.0.0", + "win32": "^7.0.0", "wraptile": "^3.0.0", "writejson": "^3.0.0", "yargs-parser": "^21.0.0" From aa0c15f6b66a092714509c3fa767cf55852b8658 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 13:01:20 +0300 Subject: [PATCH 0175/1230] feature(package) @cloudcmd/stub v4.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 114bae8b..20407e3b 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,7 @@ "@cloudcmd/create-element": "^2.0.0", "@cloudcmd/modal": "^2.0.0", "@cloudcmd/olark": "^3.0.2", - "@cloudcmd/stub": "^3.0.0", + "@cloudcmd/stub": "^4.0.1", "auto-globals": "^2.0.0", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.0", From c5e3134f37bedea4641f179493108cd39a83dca0 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 13:02:21 +0300 Subject: [PATCH 0176/1230] feature(package) restafary v11.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 20407e3b..e4b44b91 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "putout": "^25.0.1", "redzip": "^2.0.0", "rendy": "^3.0.0", - "restafary": "^10.0.0", + "restafary": "^11.0.0", "restbox": "^3.0.0", "shortdate": "^2.0.0", "simport": "^1.0.1", From 46a84c54eaca16992d88adea9e58c0a873ed8a1c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 14:07:40 +0300 Subject: [PATCH 0177/1230] feature(package) dword v14.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4b44b91..8d6e9c36 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "currify": "^4.0.0", "deepmerge": "^4.0.0", "deepword": "^8.0.0", - "dword": "^13.0.0", + "dword": "^14.0.0", "edward": "^13.0.0", "es6-promisify": "^7.0.0", "execon": "^1.2.0", From 6e4667aa856c322a8fdf794a3452dd2fae492f0c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 14:25:58 +0300 Subject: [PATCH 0178/1230] chore(cloudcmd) lint --- .github/workflows/nodejs.yml | 2 +- client/key/vim/index.js | 1 + client/modules/view/index.js | 1 + client/sw/register.js | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 5d47ab07..95ce0d0c 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -10,7 +10,7 @@ jobs: matrix: node-version: - 16.x - - 17.x + - 18.x steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} diff --git a/client/key/vim/index.js b/client/key/vim/index.js index 7b781057..a0831773 100644 --- a/client/key/vim/index.js +++ b/client/key/vim/index.js @@ -91,6 +91,7 @@ function setCurrent(sibling, {count, isVisual, isDelete}) { select(current); const position = `${sibling}Sibling`; + for (let i = 0; i < count; i++) { const next = current[position]; diff --git a/client/modules/view/index.js b/client/modules/view/index.js index 44fb3384..be765bd4 100644 --- a/client/modules/view/index.js +++ b/client/modules/view/index.js @@ -225,6 +225,7 @@ function initConfig(options) { return config; const names = Object.keys(options); + for (const name of names) { const isConfig = Boolean(config[name]); const item = options[name]; diff --git a/client/sw/register.js b/client/sw/register.js index 518bceff..3f99395b 100644 --- a/client/sw/register.js +++ b/client/sw/register.js @@ -19,6 +19,7 @@ async function registerSW(prefix) { return await navigator.serviceWorker.register(`${prefix}/sw.js`); } + async function unregisterSW(prefix) { const reg = await registerSW(prefix); reg?.unregister(prefix); From e129ab6a79fdd4ea48686b16269975fba7958b5e Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 22 Apr 2022 14:43:02 +0300 Subject: [PATCH 0179/1230] chore(package) v16.0.1 --- .madrun.mjs | 2 +- ChangeLog | 10 ++++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.madrun.mjs b/.madrun.mjs index 2f020589..82ce4fba 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -7,7 +7,7 @@ const testEnv = { THREAD_IT_COUNT: 0, }; -const is17 = /^v17/.test(process.version); +const is17 = /^v1[78]/.test(process.version); // fix for ERR_OSSL_EVP_UNSUPPORTED on node v17 // flag '--openssl-legacy-provider' not supported diff --git a/ChangeLog b/ChangeLog index 2d4921f0..614ba844 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2022.04.22, v16.0.1 + +feature: +- (package) dword v14.0.0 +- (package) restafary v11.0.0 +- (package) @cloudcmd/stub v4.0.1 +- (package) win32 v7.0.0 +- (package) eslint-plugin-putout v14.4.0 + + 2022.02.19, v16.0.0 feature: diff --git a/HELP.md b/HELP.md index a72b28f0..7cbd2c75 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.0.0 +# Cloud Commander v16.0.1 ### [Main][MainURL] [Blog][BlogURL] @@ -1082,6 +1082,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2022.04.22*, **[v16.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.1)** - *2022.02.19*, **[v16.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.0)** - *2022.01.20*, **[v15.9.15](//github.com/coderaiser/cloudcmd/releases/tag/v15.9.15)** - *2022.01.13*, **[v15.9.14](//github.com/coderaiser/cloudcmd/releases/tag/v15.9.14)** diff --git a/README.md b/README.md index ff803934..4ad9465b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.0.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v16.0.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] diff --git a/package.json b/package.json index 8d6e9c36..fcae317a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "16.0.0", + "version": "16.0.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 42c8fd7bfec91655638a408bd513ec672bcbe93d Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 23 Apr 2022 01:23:27 +0300 Subject: [PATCH 0180/1230] feature(cloudcmd) improve support of NBSP --- client/dom/current-file.js | 31 ++++++++++++++----------------- client/dom/current-file.spec.js | 17 +++++++++++++++++ client/dom/index.js | 10 ---------- client/modules/operation/index.js | 9 +++------ common/entity.js | 2 +- package.json | 2 +- server/route.spec.js | 2 +- test/common/entity.js | 6 +++--- 8 files changed, 40 insertions(+), 39 deletions(-) diff --git a/client/dom/current-file.js b/client/dom/current-file.js index 8ed027b3..da52d748 100644 --- a/client/dom/current-file.js +++ b/client/dom/current-file.js @@ -1,8 +1,3 @@ -/** - * Parse a `data-name` attribute string back into the original filename - * @param attribute The string we wish to decode - */ - 'use strict'; /* global DOM */ @@ -24,8 +19,8 @@ const { let Title; const CURRENT_FILE = 'current-file'; -const NBSP_REG = RegExp(String.fromCharCode(160), 'g'); -const SPACE = ' '; +const encodeNBSP = (a) => a?.replace('\xa0', ' '); +const decodeNBSP = (a) => a?.replace(' ', '\xa0'); module.exports._CURRENT_FILE = CURRENT_FILE; @@ -81,16 +76,22 @@ const createNameAttribute = (name) => { */ const parseNameAttribute = (attribute) => { attribute = attribute.replace('js-file-', ''); - return decodeURI(atob(attribute)); + return decodeNBSP(decodeURI(atob(attribute))); }; +module.exports._parseNameAttribute = parseNameAttribute; + +const parseHrefAttribute = (prefix, attribute) => { + attribute = attribute.replace(RegExp('^' + prefix + FS), ''); + return decode(decodeNBSP(attribute)); +}; +module.exports._parseHrefAttribute = parseHrefAttribute; /** * get current direcotory path */ module.exports.getCurrentDirPath = (panel = DOM.getPanel()) => { const path = DOM.getByDataName('js-path', panel); - return path.textContent - .replace(NBSP_REG, SPACE); + return path.textContent; }; /** @@ -103,12 +104,7 @@ module.exports.getCurrentPath = (currentFile) => { const [element] = DOM.getByTag('a', current); const {prefix} = CloudCmd; - const path = element - .getAttribute('href') - .replace(RegExp('^' + prefix + FS), '') - .replace(NBSP_REG, SPACE); - - return decode(path); + return parseHrefAttribute(prefix, element.getAttribute('href')); }; /** @@ -161,8 +157,9 @@ module.exports.getCurrentFile = () => { /** * get current file by name */ + module.exports.getCurrentByName = (name, panel = DOM.CurrentInfo.panel) => { - const dataName = 'js-file-' + btoa(encodeURI(name)); + const dataName = 'js-file-' + btoa(encodeURI(encodeNBSP(name))); return DOM.getByDataName(dataName, panel); }; diff --git a/client/dom/current-file.spec.js b/client/dom/current-file.spec.js index c82afe04..57702d3d 100644 --- a/client/dom/current-file.spec.js +++ b/client/dom/current-file.spec.js @@ -302,6 +302,23 @@ function getCloudCmd({emit} = {}) { }; } +test('current-file: parseNameAttribute', (t) => { + const result = currentFile._parseNameAttribute('js-file-aGVsbG8mbmJzcDt3b3JsZA=='); + const expected = 'hello\xa0world'; + + t.equal(result, expected); + t.end(); +}); + +test('current-file: parseHrefAttribute', (t) => { + const prefix = '/api/v1'; + const result = currentFile._parseHrefAttribute(prefix, '/api/v1/fs/hello world'); + const expected = '/hello\xa0world'; + + t.equal(result, expected); + t.end(); +}); + function getDOM({ link = {}, getCurrentDirPath = stub(), diff --git a/client/dom/index.js b/client/dom/index.js index fe665336..abc1c607 100644 --- a/client/dom/index.js +++ b/client/dom/index.js @@ -148,16 +148,6 @@ module.exports.getNotCurrentDirPath = () => { return path; }; -/** - * get current file by name - */ -module.exports.getCurrentByName = (name, panel = CurrentInfo.panel) => { - const dataName = 'js-file-' + btoa(encodeURI(name)); - const element = DOM.getByDataName(dataName, panel); - - return element; -}; - /** * unified way to get selected files * diff --git a/client/modules/operation/index.js b/client/modules/operation/index.js index c58e629d..4d7dd527 100644 --- a/client/modules/operation/index.js +++ b/client/modules/operation/index.js @@ -405,18 +405,15 @@ async function _processFiles(options, data) { panelPassive, } = Info; - const setCurrent = () => { - const currentName = name || data.names[0]; - DOM.setCurrentByName(currentName); - }; - if (!Info.isOnePanel) CloudCmd.refresh({ panel: panelPassive, noCurrent: true, }); - CloudCmd.refresh({panel}, setCurrent); + CloudCmd.refresh({ + panel, + }); }); } } diff --git a/common/entity.js b/common/entity.js index bad8ef77..e0e6715e 100644 --- a/common/entity.js +++ b/common/entity.js @@ -1,7 +1,7 @@ 'use strict'; const Entities = { - ' ': ' ', +// ' ': ' ', '<': '<', '>': '>', '"': '"', diff --git a/package.json b/package.json index fcae317a..bcf887f3 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "onezip": "^5.0.0", "open": "^8.0.5", "package-json": "^7.0.0", - "ponse": "^6.0.0", + "ponse": "^7.0.0", "pullout": "^4.0.0", "putout": "^25.0.1", "redzip": "^2.0.0", diff --git a/server/route.spec.js b/server/route.spec.js index 504182ca..c1bde432 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -229,7 +229,7 @@ test('cloudcmd: route: not found', async (t) => { test('cloudcmd: route: sendIndex: encode', async (t) => { const name = '">'; - const nameEncoded = '"><svg onload=alert(3);>'; + const nameEncoded = '"><svg onload=alert(3);>'; const path = '/'; const files = [{ name, diff --git a/test/common/entity.js b/test/common/entity.js index 8e38f46a..20a005f2 100644 --- a/test/common/entity.js +++ b/test/common/entity.js @@ -5,21 +5,21 @@ const entity = require('../../common/entity'); test('cloudcmd: entity: encode', (t) => { const result = entity.encode(' '); - const expected = '<hello> '; + const expected = '<hello> '; t.equal(result, expected, 'should encode entity'); t.end(); }); test('cloudcmd: entity: decode', (t) => { - const result = entity.decode('<hello> '); + const result = entity.decode('<hello> '); const expected = ' '; t.equal(result, expected, 'should decode entity'); t.end(); }); -test('cloudcmd: entity: encode', (t) => { +test('cloudcmd: entity: encode quote', (t) => { const result = entity.encode('"hello"'); const expected = '"hello"'; From 0c28633bbdf881d1cef8a0876a9e357b6fc4911b Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 23 Apr 2022 01:35:30 +0300 Subject: [PATCH 0181/1230] chore(package) v16.1.0 --- ChangeLog | 6 ++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 614ba844..dcc3942f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2022.04.23, v16.1.0 + +feature: +- (cloudcmd) improve support of NBSP + + 2022.04.22, v16.0.1 feature: diff --git a/HELP.md b/HELP.md index 7cbd2c75..c59344ae 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.0.1 +# Cloud Commander v16.1.0 ### [Main][MainURL] [Blog][BlogURL] @@ -1082,6 +1082,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2022.04.23*, **[v16.1.0](//github.com/coderaiser/cloudcmd/releases/tag/v16.1.0)** - *2022.04.22*, **[v16.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.1)** - *2022.02.19*, **[v16.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.0)** - *2022.01.20*, **[v15.9.15](//github.com/coderaiser/cloudcmd/releases/tag/v15.9.15)** diff --git a/README.md b/README.md index 4ad9465b..8ee3d31d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.0.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v16.1.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] diff --git a/package.json b/package.json index bcf887f3..6e97fc24 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "16.0.1", + "version": "16.1.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 95ede62e813d57b03d4b3a5994ec984f4acbc23c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 11 May 2022 11:44:58 +0300 Subject: [PATCH 0182/1230] feature(package) putout v26.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e97fc24..2ea034b6 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "package-json": "^7.0.0", "ponse": "^7.0.0", "pullout": "^4.0.0", - "putout": "^25.0.1", + "putout": "^26.0.1", "redzip": "^2.0.0", "rendy": "^3.0.0", "restafary": "^11.0.0", From 6af8f19bb6e7513ae5483f98f5479d16910ce9f6 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 11 May 2022 14:21:25 +0300 Subject: [PATCH 0183/1230] chore(cloudcmd) lint --- client/dom/events/index.js | 2 +- client/dom/files.js | 6 +++--- client/modules/user-menu/parse-user-menu.js | 2 +- client/sw/sw.js | 4 ++-- server/markdown/index.spec.js | 4 ++-- server/rest/index.js | 4 ++-- test/rest/pack.js | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/client/dom/events/index.js b/client/dom/events/index.js index 195987da..85c24a3d 100644 --- a/client/dom/events/index.js +++ b/client/dom/events/index.js @@ -32,7 +32,7 @@ function EventsProto() { switch(type) { default: - if (!/element$/.test(type)) + if (!type.endsWith('element')) throw Error('unknown eventName: ' + type); parseArgs( diff --git a/client/dom/files.js b/client/dom/files.js index dce0ac39..6d9627d4 100644 --- a/client/dom/files.js +++ b/client/dom/files.js @@ -36,8 +36,8 @@ function check(name) { } function getModule(name) { - const regExpHTML = new RegExp(FILES_HTML + '|' + FILES_HTML_ROOT); - const regExpJSON = new RegExp(FILES_JSON); + const regExpHTML = RegExp(FILES_HTML + '|' + FILES_HTML_ROOT); + const regExpJSON = RegExp(FILES_JSON); const isHTML = regExpHTML.test(name); const isJSON = regExpJSON.test(name); @@ -54,7 +54,7 @@ function getModule(name) { function getPath(name, isHTML, isJSON) { let path; - const regExp = new RegExp(FILES_HTML_ROOT); + const regExp = RegExp(FILES_HTML_ROOT); const isRoot = regExp.test(name); if (isHTML) { diff --git a/client/modules/user-menu/parse-user-menu.js b/client/modules/user-menu/parse-user-menu.js index 78ce016f..d4013405 100644 --- a/client/modules/user-menu/parse-user-menu.js +++ b/client/modules/user-menu/parse-user-menu.js @@ -14,7 +14,7 @@ module.exports = (userMenu) => { continue; } - if (/^_/.test(str)) { + if (str.startsWith('_')) { continue; } diff --git a/client/sw/sw.js b/client/sw/sw.js index 3c849bd8..ff9a23fe 100644 --- a/client/sw/sw.js +++ b/client/sw/sw.js @@ -15,7 +15,7 @@ const respondWith = currify((f, e) => { const {url} = request; const pathname = getPathName(url); - if (/\/$/.test(url) || /\^\/fs/.test(pathname)) + if (url.endsWith('/') || /\^\/fs/.test(pathname)) return; if (!isGet(request)) @@ -24,7 +24,7 @@ const respondWith = currify((f, e) => { if (!isBasic(request)) return; - if (/^\/api/.test(pathname)) + if (pathname.startsWith('/api')) return; if (/^socket.io/.test(pathname)) diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.js index d6e9c338..bc736bef 100644 --- a/server/markdown/index.spec.js +++ b/server/markdown/index.spec.js @@ -27,14 +27,14 @@ const {request} = require('serve-once')(cloudcmd, { test('cloudcmd: markdown: error', async (t) => { const {body} = await request.get('/api/v1/markdown/not-found'); - t.ok(/ENOENT/.test(body), 'should not found'); + t.match(body, 'ENOENT', 'should not found'); t.end(); }); test('cloudcmd: markdown: relative: error', async (t) => { const {body} = await request.get('/api/v1/markdown/not-found?relative'); - t.ok(/ENOENT/.test(body), 'should not found'); + t.match(body, 'ENOENT', 'should not found'); t.end(); }); diff --git a/server/rest/index.js b/server/rest/index.js index cbd65d44..b3989191 100644 --- a/server/rest/index.js +++ b/server/rest/index.js @@ -87,7 +87,7 @@ function rest(config, request, response) { */ function sendData(params, config, callback) { const p = params; - const isMD = /^\/markdown/.test(p.name); + const isMD = p.name.startsWith('/markdown'); const rootDir = config('root'); if (isMD) @@ -122,7 +122,7 @@ function onGET(params, config, callback) { if (p.name[0] === '/') cmd = p.name.replace('/', ''); - if (/^pack/.test(cmd)) { + if (cmd.startsWith('pack')) { cmd = cmd.replace(/^pack/, ''); streamPack(root(cmd, rootDir), p.response, packer); return; diff --git a/test/rest/pack.js b/test/rest/pack.js index aff32c61..8ad25b7a 100644 --- a/test/rest/pack.js +++ b/test/rest/pack.js @@ -137,7 +137,7 @@ test('cloudcmd: rest: pack: tar: put: error', async (t) => { ]), }); - t.ok(/^ENOENT: no such file or directory/.test(body), 'should return error'); + t.match(body, /^ENOENT: no such file or directory/, 'should return error'); t.end(); }); @@ -219,7 +219,7 @@ test('cloudcmd: rest: pack: zip: put: error', async (t) => { ]), }); - t.ok(/^ENOENT: no such file or directory/.test(body), 'should return error'); + t.match(body, /^ENOENT: no such file or directory/, 'should return error'); t.end(); }); From bbf0c04f55048a3265682211b44e494f74639050 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 12 May 2022 14:44:11 +0300 Subject: [PATCH 0184/1230] feature(package) edward v14.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2ea034b6..735201e1 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "deepmerge": "^4.0.0", "deepword": "^8.0.0", "dword": "^14.0.0", - "edward": "^13.0.0", + "edward": "^14.0.0", "es6-promisify": "^7.0.0", "execon": "^1.2.0", "express": "^4.13.0", From b3f3510b2d9dd3b447429cf91adde42e4f8b2d6e Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 12 May 2022 14:45:22 +0300 Subject: [PATCH 0185/1230] chore(package) v16.1.1 --- ChangeLog | 7 +++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index dcc3942f..7e381979 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2022.05.12, v16.1.1 + +feature: +- (package) edward v14.0.0 +- (package) putout v26.0.1 + + 2022.04.23, v16.1.0 feature: diff --git a/HELP.md b/HELP.md index c59344ae..563dcf13 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.1.0 +# Cloud Commander v16.1.1 ### [Main][MainURL] [Blog][BlogURL] @@ -1082,6 +1082,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2022.05.12*, **[v16.1.1](//github.com/coderaiser/cloudcmd/releases/tag/v16.1.1)** - *2022.04.23*, **[v16.1.0](//github.com/coderaiser/cloudcmd/releases/tag/v16.1.0)** - *2022.04.22*, **[v16.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.1)** - *2022.02.19*, **[v16.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v16.0.0)** diff --git a/README.md b/README.md index 8ee3d31d..2c15e248 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v16.1.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v16.1.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] diff --git a/package.json b/package.json index 735201e1..8221fca3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "16.1.0", + "version": "16.1.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 42248bc0f478277f80c4818e8573890365f7e7a1 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 12 May 2022 22:29:01 +0300 Subject: [PATCH 0186/1230] chore(cloudcmd) lint --- client/client.js | 17 +++++++---------- client/cloudcmd.js | 4 +--- client/dom/index.js | 15 +++++---------- client/dom/operations/rename-current.spec.js | 4 +--- client/key/index.spec.js | 10 +++------- client/key/vim/index.spec.js | 3 +-- client/modules/markdown.js | 3 +-- client/modules/view/types.spec.js | 6 ++---- common/datetime.spec.js | 5 ++--- test/common/cloudfunc.js | 3 +-- 10 files changed, 24 insertions(+), 46 deletions(-) diff --git a/client/client.js b/client/client.js index 3b394457..c2fda214 100644 --- a/client/client.js +++ b/client/client.js @@ -40,13 +40,6 @@ load.addErrorListener((e, src) => { function CloudCmdProto(DOM) { let Listeners; - const log = (...a) => { - if (!isDev) - return; - - console.log(...a); - }; - Emitify.call(this); const CloudCmd = this; @@ -57,7 +50,12 @@ function CloudCmdProto(DOM) { Files, } = DOM; - this.log = log; + this.log = (...a) => { + if (!isDev) + return; + + console.log(...a); + }; this.prefix = ''; this.prefixSocket = ''; this.prefixURL = ''; @@ -67,8 +65,7 @@ function CloudCmdProto(DOM) { this.MIN_ONE_PANEL_WIDTH = 1155; this.HOST = location.origin || location.protocol + '//' + location.host; - const TITLE = 'Cloud Commander'; - this.TITLE = TITLE; + this.TITLE = 'Cloud Commander'; this.sort = { left: 'name', diff --git a/client/cloudcmd.js b/client/cloudcmd.js index 854bcf06..bb65a790 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -22,9 +22,7 @@ module.exports = window.CloudCmd = async (config) => { window.Util = require('../common/util'); window.CloudFunc = require('../common/cloudfunc'); - const DOM = require('./dom'); - - window.DOM = DOM; + window.DOM = require('./dom'); window.CloudCmd = require('./client'); await register(config); diff --git a/client/dom/index.js b/client/dom/index.js index abc1c607..5785fd32 100644 --- a/client/dom/index.js +++ b/client/dom/index.js @@ -5,12 +5,8 @@ const Util = require('../../common/util'); const Images = require('./images'); -const load = require('./load'); -const Files = require('./files'); const RESTful = require('./rest'); -const IO = require('./io'); const Storage = require('./storage'); -const Dialog = require('./dialog'); const renameCurrent = require('./operations/rename-current'); const CurrentFile = require('./current-file'); @@ -26,12 +22,12 @@ const DOM = { const CurrentInfo = {}; DOM.Images = Images; -DOM.load = load; -DOM.Files = Files; +DOM.load = require('./load'); +DOM.Files = require('./files'); DOM.RESTful = RESTful; -DOM.IO = IO; +DOM.IO = require('./io'); DOM.Storage = Storage; -DOM.Dialog = Dialog; +DOM.Dialog = require('./dialog'); DOM.CurrentInfo = CurrentInfo; module.exports = DOM; @@ -791,7 +787,6 @@ module.exports.updateCurrentInfo = (currentFile) => { const info = DOM.CurrentInfo; const current = currentFile || DOM.getCurrentFile(); const files = current.parentElement; - const panel = files.parentElement || DOM.getPanel(); const panelPassive = DOM.getPanel({ active: false, @@ -814,7 +809,7 @@ module.exports.updateCurrentInfo = (currentFile) => { info.mode = DOM.getCurrentMode(current); info.name = name; info.path = DOM.getCurrentPath(current); - info.panel = panel; + info.panel = files.parentElement || DOM.getPanel(); info.panelPassive = panelPassive; info.size = DOM.getCurrentSize(current); info.isDir = DOM.isCurrentIsDir(); diff --git a/client/dom/operations/rename-current.spec.js b/client/dom/operations/rename-current.spec.js index 4aa6f7e6..ae60adf5 100644 --- a/client/dom/operations/rename-current.spec.js +++ b/client/dom/operations/rename-current.spec.js @@ -29,12 +29,10 @@ test('cloudcmd: client: dom: renameCurrent: file exist', async (t) => { const name = 'hello'; const {CloudCmd} = global; - const CloudCmdStub = { + global.CloudCmd = { refresh: stub(), }; - global.CloudCmd = CloudCmdStub; - const prompt = stub().returns([null, name]); const confirm = stub().returns([true]); diff --git a/client/key/index.spec.js b/client/key/index.spec.js index 78e42ce7..acc8d15d 100644 --- a/client/key/index.spec.js +++ b/client/key/index.spec.js @@ -13,19 +13,15 @@ const { getCloudCmd, } = require('./vim/globals.fixture'); -const DOM = getDOM(); -const CloudCmd = getCloudCmd(); - -global.DOM = DOM; -global.CloudCmd = CloudCmd; +global.DOM = getDOM(); +global.CloudCmd = getCloudCmd(); test('cloudcmd: client: key: enable vim', async (t) => { const vim = stub(); - const configStub = stub().returns(true); const {CloudCmd} = global; const {config} = CloudCmd; - CloudCmd.config = configStub; + CloudCmd.config = stub().returns(true); mockRequire('./vim', vim); const {_listener, setBind} = reRequire('.'); diff --git a/client/key/vim/index.spec.js b/client/key/vim/index.spec.js index 00cd1603..886eb578 100644 --- a/client/key/vim/index.spec.js +++ b/client/key/vim/index.spec.js @@ -235,10 +235,9 @@ test('cloudcmd: client: key: paste', (t) => { }); test('cloudcmd: client: key: selectFile: ..', (t) => { - const selectFile = stub(); const getCurrentName = stub(); - DOM.selectFile = selectFile; + DOM.selectFile = stub(); DOM.getCurrentName = () => '..'; const current = {}; diff --git a/client/modules/markdown.js b/client/modules/markdown.js index e5810300..759805c5 100644 --- a/client/modules/markdown.js +++ b/client/modules/markdown.js @@ -22,7 +22,6 @@ module.exports.hide = () => { }; async function show(name, options = {}) { - const relativeQuery = '?relative'; const { positionLoad, relative, @@ -31,7 +30,7 @@ async function show(name, options = {}) { Images.show.load(positionLoad); if (relative) - name += relativeQuery; + name += '?relative'; const [error, innerHTML] = await Markdown.read(name); Images.hide(); diff --git a/client/modules/view/types.spec.js b/client/modules/view/types.spec.js index fc93fa97..9f157841 100644 --- a/client/modules/view/types.spec.js +++ b/client/modules/view/types.spec.js @@ -38,14 +38,12 @@ test('cloudcmd: client: view: types: detectType', async (t) => { }); test('cloudcmd: client: view: types: detectType: found', async (t) => { - const fetch = stub().returns({ + const originalFetch = global.fetch; + global.fetch = stub().returns({ headers: [ ['content-type', 'image/png'], ], }); - - const originalFetch = global.fetch; - global.fetch = fetch; const result = await _detectType('/hello'); global.fetch = originalFetch; diff --git a/common/datetime.spec.js b/common/datetime.spec.js index 2d8f529e..cdf221ba 100644 --- a/common/datetime.spec.js +++ b/common/datetime.spec.js @@ -19,15 +19,14 @@ test('common: datetime: no arg', (t) => { const {Date} = global; let called = false; - const myDate = class extends Date { + + global.Date = class extends Date { constructor() { super(); called = true; } }; - global.Date = myDate; - datetime(); global.Date = Date; diff --git a/test/common/cloudfunc.js b/test/common/cloudfunc.js index a9987f10..af701540 100644 --- a/test/common/cloudfunc.js +++ b/test/common/cloudfunc.js @@ -68,7 +68,6 @@ let Expect = '
' + test('cloudfunc: render', (t) => { const template = readFilesSync(FS_DIR, TMPL, 'utf8'); - const expect = fs.readFileSync(EXPECT_PATH, 'utf8'); time('CloudFunc.buildFromJSON'); const result = CloudFunc.buildFromJSON({ @@ -77,7 +76,7 @@ test('cloudfunc: render', (t) => { template, }); - Expect += expect; + Expect += fs.readFileSync(EXPECT_PATH, 'utf8'); let i; const isNotOk = Expect From 18adf0852dc3615c40b2ce6ddf1bcddb6556d2f4 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 2 Jun 2022 12:52:55 +0300 Subject: [PATCH 0187/1230] Create FUNDING.yml --- .github/FUNDING.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..14de807d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,10 @@ +# These are supported funding model platforms + +github: coderaiser +patreon: coderaiser +open_collective: coderaiser +ko_fi: coderaiser +#issuehunt: # Replace with a single IssueHunt username +#otechie: # Replace with a single Otechie username +#lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +liberapay: ~1758956 From 4e406d758f880dcefda10e551ed3ff9ae75a252b Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 2 Jun 2022 12:54:34 +0300 Subject: [PATCH 0188/1230] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 14de807d..f17010c9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -7,4 +7,4 @@ ko_fi: coderaiser #issuehunt: # Replace with a single IssueHunt username #otechie: # Replace with a single Otechie username #lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -liberapay: ~1758956 +#liberapay: ~1758956 From ed0c2ad45a2bdb5b5880839ef9c8ac108868bbbc Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 2 Jun 2022 12:55:16 +0300 Subject: [PATCH 0189/1230] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f17010c9..6e69991e 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -2,7 +2,7 @@ github: coderaiser patreon: coderaiser -open_collective: coderaiser +open_collective: cloudcmd ko_fi: coderaiser #issuehunt: # Replace with a single IssueHunt username #otechie: # Replace with a single Otechie username From 3d4ba373a6015dc6e64d35ccac22333b5d6ea68f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 2 Jun 2022 09:55:39 +0000 Subject: [PATCH 0190/1230] chore(cloudcmd) lint using actions --- client/dom/current-file.spec.js | 6 ++++-- client/dom/index.js | 2 +- client/dom/io/index.spec.js | 6 ++++-- client/dom/operations/rename-current.spec.js | 6 ++++-- client/dom/storage.spec.js | 6 ++++-- client/key/vim/index.spec.js | 6 ++++-- client/key/vim/vim.spec.js | 6 ++++-- client/modules/polyfill.spec.js | 6 ++++-- client/modules/user-menu/parse-user-menu.spec.js | 6 ++++-- client/modules/user-menu/run.spec.js | 6 ++++-- common/base64.spec.js | 6 ++++-- server/cloudcmd.spec.js | 6 ++++-- server/config.spec.js | 6 ++++-- server/exit.spec.js | 6 ++++-- server/rest/info.spec.js | 6 ++++-- server/root.spec.js | 6 ++++-- server/terminal.spec.js | 6 ++++-- server/user-menu.spec.js | 6 ++++-- server/validate.spec.js | 6 ++++-- test/server/modulas.js | 6 ++++-- 20 files changed, 77 insertions(+), 39 deletions(-) diff --git a/client/dom/current-file.spec.js b/client/dom/current-file.spec.js index 57702d3d..12dc49e5 100644 --- a/client/dom/current-file.spec.js +++ b/client/dom/current-file.spec.js @@ -1,8 +1,10 @@ 'use strict'; -const test = require('supertape'); +const { + test, + stub, +} = require('supertape'); const {create} = require('auto-globals'); -const stub = require('@cloudcmd/stub'); const id = (a) => a; const wraptile = require('wraptile'); const returns = wraptile(id); diff --git a/client/dom/index.js b/client/dom/index.js index 5785fd32..31300a29 100644 --- a/client/dom/index.js +++ b/client/dom/index.js @@ -304,7 +304,7 @@ module.exports.getCurrentData = async (currentFile) => { if (e) return [e, null]; - const ONE_MEGABYTE = 1024 * 1024 * 1024; + const ONE_MEGABYTE = 1024 ** 2 * 1024; const {length} = data; if (hash && length < ONE_MEGABYTE) diff --git a/client/dom/io/index.spec.js b/client/dom/io/index.spec.js index 80c9bee2..92c621f7 100644 --- a/client/dom/io/index.spec.js +++ b/client/dom/io/index.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); const {reRequire, stopAll} = mockRequire; diff --git a/client/dom/operations/rename-current.spec.js b/client/dom/operations/rename-current.spec.js index ae60adf5..bc294e15 100644 --- a/client/dom/operations/rename-current.spec.js +++ b/client/dom/operations/rename-current.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); const {reRequire, stopAll} = mockRequire; diff --git a/client/dom/storage.spec.js b/client/dom/storage.spec.js index 84fdfe71..d3b15e33 100644 --- a/client/dom/storage.spec.js +++ b/client/dom/storage.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const storage = require('./storage'); const {stringify} = JSON; diff --git a/client/key/vim/index.spec.js b/client/key/vim/index.spec.js index 886eb578..5fb45367 100644 --- a/client/key/vim/index.spec.js +++ b/client/key/vim/index.spec.js @@ -2,8 +2,10 @@ const {join} = require('path'); -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); const {reRequire, stopAll} = mockRequire; diff --git a/client/key/vim/vim.spec.js b/client/key/vim/vim.spec.js index f39552ee..056b3c76 100644 --- a/client/key/vim/vim.spec.js +++ b/client/key/vim/vim.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const vim = require('./vim'); diff --git a/client/modules/polyfill.spec.js b/client/modules/polyfill.spec.js index 5c31b27f..462a3cb0 100644 --- a/client/modules/polyfill.spec.js +++ b/client/modules/polyfill.spec.js @@ -1,8 +1,10 @@ 'use strict'; -const test = require('supertape'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); -const stub = require('@cloudcmd/stub'); const {stopAll} = mockRequire; diff --git a/client/modules/user-menu/parse-user-menu.spec.js b/client/modules/user-menu/parse-user-menu.spec.js index 3cdd72cd..d2fd9300 100644 --- a/client/modules/user-menu/parse-user-menu.spec.js +++ b/client/modules/user-menu/parse-user-menu.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const parse = require('./parse-user-menu'); test('cloudcmd: user menu: parse', (t) => { diff --git a/client/modules/user-menu/run.spec.js b/client/modules/user-menu/run.spec.js index 98165ec6..a8444e86 100644 --- a/client/modules/user-menu/run.spec.js +++ b/client/modules/user-menu/run.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const {runSelected} = require('./run'); test('cloudcmd: client: user menu: run', async (t) => { diff --git a/common/base64.spec.js b/common/base64.spec.js index 0c8f3ca7..2429a13c 100644 --- a/common/base64.spec.js +++ b/common/base64.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const {btoa, atob} = require('./base64'); diff --git a/server/cloudcmd.spec.js b/server/cloudcmd.spec.js index 1deaef42..264fd799 100644 --- a/server/cloudcmd.spec.js +++ b/server/cloudcmd.spec.js @@ -2,8 +2,10 @@ const path = require('path'); -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const {reRequire} = require('mock-require'); const DIR = './'; diff --git a/server/config.spec.js b/server/config.spec.js index dbd85277..23230842 100644 --- a/server/config.spec.js +++ b/server/config.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const root = '../'; const configPath = './config'; diff --git a/server/exit.spec.js b/server/exit.spec.js index 663bd44a..8fedf1ca 100644 --- a/server/exit.spec.js +++ b/server/exit.spec.js @@ -1,8 +1,10 @@ 'use strict'; -const test = require('supertape'); +const { + test, + stub, +} = require('supertape'); const exit = require('./exit'); -const stub = require('@cloudcmd/stub'); test('cloudcmd: exit: process.exit', (t) => { const {exit: exitOriginal} = process; diff --git a/server/rest/info.spec.js b/server/rest/info.spec.js index a067cc68..4f407a45 100644 --- a/server/rest/info.spec.js +++ b/server/rest/info.spec.js @@ -1,8 +1,10 @@ 'use strict'; -const test = require('supertape'); +const { + test, + stub, +} = require('supertape'); const info = require('./info'); -const stub = require('@cloudcmd/stub'); test('cloudcmd: rest: info', (t) => { const {memoryUsage} = process; diff --git a/server/root.spec.js b/server/root.spec.js index af640fbd..4ee1d61a 100644 --- a/server/root.spec.js +++ b/server/root.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); const {reRequire, stopAll} = mockRequire; diff --git a/server/terminal.spec.js b/server/terminal.spec.js index d734b547..0f5e7e59 100644 --- a/server/terminal.spec.js +++ b/server/terminal.spec.js @@ -1,7 +1,9 @@ 'use strict'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const mockRequire = require('mock-require'); diff --git a/server/user-menu.spec.js b/server/user-menu.spec.js index 623dcfa7..945b74ec 100644 --- a/server/user-menu.spec.js +++ b/server/user-menu.spec.js @@ -3,10 +3,12 @@ const fs = require('fs'); const {join} = require('path'); -const test = require('supertape'); +const { + test, + stub, +} = require('supertape'); const serveOnce = require('serve-once'); const threadIt = require('thread-it'); -const stub = require('@cloudcmd/stub'); const {reRequire} = require('mock-require'); const userMenu = require('./user-menu'); diff --git a/server/validate.spec.js b/server/validate.spec.js index 14868530..242cfbe6 100644 --- a/server/validate.spec.js +++ b/server/validate.spec.js @@ -2,8 +2,10 @@ const fs = require('fs'); -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const tryCatch = require('try-catch'); const mockRequire = require('mock-require'); const {reRequire, stopAll} = mockRequire; diff --git a/test/server/modulas.js b/test/server/modulas.js index d8fc7e90..4af247ce 100644 --- a/test/server/modulas.js +++ b/test/server/modulas.js @@ -1,8 +1,10 @@ 'use strict'; const {join} = require('path'); -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); +const { + test, + stub, +} = require('supertape'); const cloudcmdPath = join(__dirname, '..', '..'); const modulesPath = join(cloudcmdPath, 'json', 'modules.json'); From b12e0690cd3773da8d08ab7730977881170b4a6c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 3 Jun 2022 19:07:50 +0300 Subject: [PATCH 0191/1230] docs(license) 2022 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 50fc1d35..23edaaaa 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2012-2019 Coderaiser +Copyright (c) 2012-2022 Coderaiser Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 81e76857da248a5bb07c0af70436f39022f1f3d9 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sun, 12 Jun 2022 00:01:43 +0300 Subject: [PATCH 0192/1230] feature(package) thread-it v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8221fca3..1f07cccf 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "socket.io-client": "^4.0.1", "squad": "^3.0.0", "table": "^6.0.1", - "thread-it": "^1.1.0", + "thread-it": "^2.0.0", "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", From ef10ebe97ceca072618a3a419691be3145ce5a4b Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 14 Jun 2022 14:38:11 +0300 Subject: [PATCH 0193/1230] chore(cloudcmd) lint --- .eslintrc.js | 2 +- .webpack/css.js | 6 +++--- .webpack/html.js | 6 +++--- bin/cloudcmd.mjs | 23 ++++++++++++----------- client/client.js | 10 +++++----- client/cloudcmd.js | 4 ++-- client/dom/current-file.spec.js | 6 +++--- client/dom/events/event-store.spec.js | 4 ++-- client/dom/upload-files.js | 4 ++-- client/key/index.js | 8 ++++---- client/key/index.spec.js | 8 ++++---- client/key/set-current-by-char.js | 2 +- client/key/vim/index.spec.js | 11 ++++++----- client/listeners/index.js | 4 ++-- client/modules/cloud.js | 4 ++-- client/modules/edit.js | 4 ++-- client/modules/operation/set-listeners.js | 10 +++++----- client/modules/view/index.spec.js | 2 +- client/sw/register.spec.js | 4 ++-- server/cloudcmd.js | 10 +++++----- server/cloudcmd.spec.js | 12 ++++++------ server/config.js | 8 ++++---- server/config.spec.js | 4 ++-- server/distribute/import.js | 4 ++-- server/markdown/index.js | 4 ++-- server/markdown/index.spec.js | 8 ++++---- server/route.js | 12 ++++++------ server/route.spec.js | 18 +++++++++--------- server/server.js | 16 ++++++++-------- server/terminal.spec.js | 2 +- server/validate.spec.js | 10 +++++----- static/user-menu.spec.js | 6 +++--- test/common/cloudfunc.js | 6 +++--- test/rest/copy.js | 3 ++- test/rest/move.js | 2 +- test/rest/pack.js | 14 +++++++------- test/rest/rename.js | 2 +- test/server/console.js | 2 +- test/server/modulas.js | 2 +- test/static.js | 4 ++-- 40 files changed, 137 insertions(+), 134 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 7b6b53ac..5fafec9c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,7 +2,7 @@ module.exports = { extends: [ - 'plugin:putout/recommended', + 'plugin:putout/safe', ], plugins: [ 'putout', diff --git a/.webpack/css.js b/.webpack/css.js index 31ab5f93..1d31bad9 100644 --- a/.webpack/css.js +++ b/.webpack/css.js @@ -7,12 +7,12 @@ const { join, } = require('path'); -const {env} = process; -const isDev = env.NODE_ENV === 'development'; - const ExtractTextPlugin = require('extract-text-webpack-plugin'); const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const {env} = process; +const isDev = env.NODE_ENV === 'development'; + const extractCSS = (a) => new ExtractTextPlugin(`${a}.css`); const extractMain = extractCSS('[name]'); diff --git a/.webpack/html.js b/.webpack/html.js index 28e40c65..6a066e53 100644 --- a/.webpack/html.js +++ b/.webpack/html.js @@ -1,9 +1,9 @@ 'use strict'; -const {env} = process; -const isDev = env.NODE_ENV === 'development'; - const HtmlWebpackPlugin = require('html-webpack-plugin'); +const {env} = process; + +const isDev = env.NODE_ENV === 'development'; const plugins = [ new HtmlWebpackPlugin({ diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 4c8a3056..450350b9 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -1,7 +1,5 @@ #!/usr/bin/env node -const DIR_SERVER = '../server/'; - import {createRequire} from 'module'; import {promisify} from 'util'; import tryToCatch from 'try-to-catch'; @@ -14,13 +12,17 @@ import { configPath, } from '../server/config.js'; -const config = createConfig({ - configPath, -}); - import env from '../server/env.js'; import prefixer from '../server/prefixer.js'; +process.on('unhandledRejection', exit); + +const require = createRequire(import.meta.url); + +const Info = require('../package.json'); + +const simport = createSimport(import.meta.url); + const choose = (a, b) => { if (a === undefined) return b; @@ -28,12 +30,11 @@ const choose = (a, b) => { return a; }; -process.on('unhandledRejection', exit); +const config = createConfig({ + configPath, +}); -const simport = createSimport(import.meta.url); -const require = createRequire(import.meta.url); - -const Info = require('../package.json'); +const DIR_SERVER = '../server/'; const maybeRoot = (a) => { if (a === '.') diff --git a/client/client.js b/client/client.js index c2fda214..bb998a33 100644 --- a/client/client.js +++ b/client/client.js @@ -11,15 +11,11 @@ const {addSlashToEnd} = require('format-io'); const pascalCase = require('just-pascal-case'); const currify = require('currify'); -const isDev = process.env.NODE_ENV === 'development'; - const Images = require('./dom/images'); + const {unregisterSW} = require('./sw/register'); const getJsonFromFileTable = require('./get-json-from-file-table'); const Key = require('./key'); - -const noJS = (a) => a.replace(/.js$/, ''); - const { apiURL, formatMsg, @@ -28,6 +24,10 @@ const { const loadModule = require('./load-module'); +const noJS = (a) => a.replace(/.js$/, ''); + +const isDev = process.env.NODE_ENV === 'development'; + inherits(CloudCmdProto, Emitify); module.exports = new CloudCmdProto(DOM); diff --git a/client/cloudcmd.js b/client/cloudcmd.js index bb65a790..dd433b05 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -8,13 +8,13 @@ require('../css/columns/name-size.css'); const wraptile = require('wraptile'); const load = require('load.js'); -const isDev = process.env.NODE_ENV === 'development'; - const { registerSW, listenSW, } = require('./sw/register'); +const isDev = process.env.NODE_ENV === 'development'; + // prevent additional loading of emitify window.Emitify = require('emitify'); diff --git a/client/dom/current-file.spec.js b/client/dom/current-file.spec.js index 12dc49e5..8000699b 100644 --- a/client/dom/current-file.spec.js +++ b/client/dom/current-file.spec.js @@ -5,11 +5,11 @@ const { stub, } = require('supertape'); const {create} = require('auto-globals'); -const id = (a) => a; const wraptile = require('wraptile'); -const returns = wraptile(id); - const currentFile = require('./current-file'); +const id = (a) => a; + +const returns = wraptile(id); const {_CURRENT_FILE} = currentFile; test('current-file: setCurrentName: setAttribute', (t) => { diff --git a/client/dom/events/event-store.spec.js b/client/dom/events/event-store.spec.js index 7214f3f2..85e5959d 100644 --- a/client/dom/events/event-store.spec.js +++ b/client/dom/events/event-store.spec.js @@ -14,7 +14,7 @@ test('event-store: get', (t) => { [el, name, fn], ]; - t.deepEqual(result, expected, 'should equal'); + t.deepEqual(result, expected); t.end(); }); @@ -29,6 +29,6 @@ test('event-store: clear', (t) => { const result = eventStore.get(); const expected = []; - t.deepEqual(result, expected, 'should equal'); + t.deepEqual(result, expected); t.end(); }); diff --git a/client/dom/upload-files.js b/client/dom/upload-files.js index 8b0e8b7a..e6e7ed79 100644 --- a/client/dom/upload-files.js +++ b/client/dom/upload-files.js @@ -11,10 +11,10 @@ const {alert} = require('./dialog'); const {FS} = require('../../common/cloudfunc'); -const onEnd = wraptile(_onEnd); +const {getCurrentDirPath: getPathWhenRootEmpty} = require('.'); const loadFile = wraptile(_loadFile); -const {getCurrentDirPath: getPathWhenRootEmpty} = require('.'); +const onEnd = wraptile(_onEnd); module.exports = (dir, files) => { if (!files) { diff --git a/client/key/index.js b/client/key/index.js index 3f04fb40..86b39587 100644 --- a/client/key/index.js +++ b/client/key/index.js @@ -2,19 +2,19 @@ /* global CloudCmd, DOM */ -const Info = DOM.CurrentInfo; - const clipboard = require('@cloudcmd/clipboard'); const Buffer = require('../dom/buffer'); -const Events = require('../dom/events'); +const Events = require('../dom/events'); const KEY = require('./key'); + const vim = require('./vim'); const setCurrentByChar = require('./set-current-by-char'); const {createBinder} = require('./binder'); - const fullstore = require('fullstore'); + +const Info = DOM.CurrentInfo; const Chars = fullstore(); const toggleVim = (keyCode) => { diff --git a/client/key/index.spec.js b/client/key/index.spec.js index acc8d15d..2dc3df06 100644 --- a/client/key/index.spec.js +++ b/client/key/index.spec.js @@ -1,18 +1,18 @@ 'use strict'; const autoGlobals = require('auto-globals'); -const test = autoGlobals(require('supertape')); const stub = require('@cloudcmd/stub'); const mockRequire = require('mock-require'); -const {reRequire, stopAll} = mockRequire; - const {ESC} = require('./key'); - const { getDOM, getCloudCmd, } = require('./vim/globals.fixture'); +const {reRequire, stopAll} = mockRequire; + +const test = autoGlobals(require('supertape')); + global.DOM = getDOM(); global.CloudCmd = getCloudCmd(); diff --git a/client/key/set-current-by-char.js b/client/key/set-current-by-char.js index 3fbf79cd..3fb79e2b 100644 --- a/client/key/set-current-by-char.js +++ b/client/key/set-current-by-char.js @@ -2,8 +2,8 @@ 'use strict'; -const Info = DOM.CurrentInfo; const {escapeRegExp} = require('../../common/util'); +const Info = DOM.CurrentInfo; module.exports = function setCurrentByChar(char, charStore) { let firstByName; diff --git a/client/key/vim/index.spec.js b/client/key/vim/index.spec.js index 5fb45367..013611f0 100644 --- a/client/key/vim/index.spec.js +++ b/client/key/vim/index.spec.js @@ -7,12 +7,10 @@ const { stub, } = require('supertape'); const mockRequire = require('mock-require'); -const {reRequire, stopAll} = mockRequire; const dir = '../'; const pathVim = join(dir, 'vim'); -const pathFind = join(dir, 'vim', 'find'); const { getDOM, @@ -22,11 +20,14 @@ const { global.DOM = getDOM(); global.CloudCmd = getCloudCmd(); -const {DOM} = global; -const {Buffer} = DOM; - const vim = require(pathVim); +const {DOM} = global; + +const {Buffer} = DOM; +const pathFind = join(dir, 'vim', 'find'); +const {reRequire, stopAll} = mockRequire; + test('cloudcmd: client: key: set next file: no', (t) => { const element = {}; diff --git a/client/listeners/index.js b/client/listeners/index.js index 2fee5c24..040ed0a3 100644 --- a/client/listeners/index.js +++ b/client/listeners/index.js @@ -9,11 +9,11 @@ const tryToCatch = require('try-to-catch'); const clipboard = require('@cloudcmd/clipboard'); const getRange = require('./get-range'); -const getIndex = currify(require('./get-index')); const uploadFiles = require('../dom/upload-files'); - const {FS} = require('../../common/cloudfunc'); +const getIndex = currify(require('./get-index')); + const NBSP_REG = RegExp(String.fromCharCode(160), 'g'); const SPACE = ' '; diff --git a/client/modules/cloud.js b/client/modules/cloud.js index 4d6e4bd0..05c4dab5 100644 --- a/client/modules/cloud.js +++ b/client/modules/cloud.js @@ -6,11 +6,11 @@ const exec = require('execon'); const currify = require('currify'); const load = require('load.js'); -const {log} = CloudCmd; - const {ajax} = require('../dom/load'); + const Files = require('../dom/files'); const Images = require('../dom/images'); +const {log} = CloudCmd; const upload = currify(_upload); diff --git a/client/modules/edit.js b/client/modules/edit.js index 5676034c..270157d4 100644 --- a/client/modules/edit.js +++ b/client/modules/edit.js @@ -6,10 +6,10 @@ const {promisify} = require('es6-promisify'); const tryToCatch = require('try-to-catch'); const createElement = require('@cloudcmd/create-element'); const load = require('load.js'); -const loadJS = load.js; - const {MAX_FILE_SIZE: maxSize} = require('../../common/cloudfunc'); + const {time, timeEnd} = require('../../common/util'); +const loadJS = load.js; const Name = 'Edit'; diff --git a/client/modules/operation/set-listeners.js b/client/modules/operation/set-listeners.js index df83d243..3378227a 100644 --- a/client/modules/operation/set-listeners.js +++ b/client/modules/operation/set-listeners.js @@ -2,16 +2,16 @@ /* global DOM */ +const forEachKey = require('for-each-key'); + +const wraptile = require('wraptile'); +const format = require('./format'); + const { Dialog, Images, } = DOM; -const forEachKey = require('for-each-key'); -const wraptile = require('wraptile'); - -const format = require('./format'); - module.exports = (options) => (emitter) => { const { operation, diff --git a/client/modules/view/index.spec.js b/client/modules/view/index.spec.js index 8bb03493..e88aa9a9 100644 --- a/client/modules/view/index.spec.js +++ b/client/modules/view/index.spec.js @@ -3,9 +3,9 @@ require('css-modules-require-hook/preset'); const autoGlobals = require('auto-globals'); -const test = autoGlobals(require('supertape')); const stub = require('@cloudcmd/stub'); const mockRequire = require('mock-require'); +const test = autoGlobals(require('supertape')); const {reRequire, stopAll} = mockRequire; test('cloudcmd: client: view: initConfig', (t) => { diff --git a/client/sw/register.spec.js b/client/sw/register.spec.js index 7b5cb98f..24bbcc2a 100644 --- a/client/sw/register.spec.js +++ b/client/sw/register.spec.js @@ -3,11 +3,11 @@ const autoGlobals = require('auto-globals'); const tape = require('supertape'); -const test = autoGlobals(tape); - const stub = require('@cloudcmd/stub'); + const tryCatch = require('try-catch'); const {reRequire} = require('mock-require'); +const test = autoGlobals(tape); test('sw: listen', (t) => { const {listenSW} = reRequire('./register'); diff --git a/server/cloudcmd.js b/server/cloudcmd.js index 527fc633..375ffeea 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.js @@ -1,20 +1,19 @@ 'use strict'; const DIR = __dirname + '/'; -const DIR_ROOT = DIR + '../'; const DIR_COMMON = DIR + '../common/'; - const path = require('path'); -const fs = require('fs'); +const fs = require('fs'); const cloudfunc = require(DIR_COMMON + 'cloudfunc'); + const authentication = require(DIR + 'auth'); const { createConfig, configPath, } = require(DIR + 'config'); - const modulas = require(DIR + 'modulas'); + const userMenu = require(DIR + 'user-menu'); const rest = require(DIR + 'rest'); const route = require(DIR + 'route'); @@ -22,8 +21,8 @@ const validate = require(DIR + 'validate'); const prefixer = require(DIR + 'prefixer'); const terminal = require(DIR + 'terminal'); const distribute = require(DIR + 'distribute'); - const currify = require('currify'); + const apart = require('apart'); const ponse = require('ponse'); const restafary = require('restafary'); @@ -34,6 +33,7 @@ const dword = require('dword'); const deepword = require('deepword'); const nomine = require('nomine'); const fileop = require('@cloudcmd/fileop'); +const DIR_ROOT = DIR + '../'; const isDev = process.env.NODE_ENV === 'development'; const getDist = (isDev) => isDev ? 'dist-dev' : 'dist'; diff --git a/server/cloudcmd.spec.js b/server/cloudcmd.spec.js index 264fd799..d0e47e2e 100644 --- a/server/cloudcmd.spec.js +++ b/server/cloudcmd.spec.js @@ -12,12 +12,6 @@ const DIR = './'; const cloudcmdPath = DIR + 'cloudcmd'; const cloudcmd = require(cloudcmdPath); -const { - createConfigManager, - _getPrefix, - _initAuth, -} = cloudcmd; - const {request} = require('serve-once')(cloudcmd, { config: { auth: false, @@ -25,6 +19,12 @@ const {request} = require('serve-once')(cloudcmd, { }, }); +const { + createConfigManager, + _getPrefix, + _initAuth, +} = cloudcmd; + test('cloudcmd: defaults: config', (t) => { const configManager = createConfigManager(); diff --git a/server/config.js b/server/config.js index 75d6c5a3..7f3783d8 100644 --- a/server/config.js +++ b/server/config.js @@ -2,17 +2,16 @@ const DIR_SERVER = __dirname + '/'; const DIR_COMMON = '../common/'; -const DIR = DIR_SERVER + '../'; - const path = require('path'); + const fs = require('fs'); const Emitter = require('events'); const {homedir} = require('os'); - const exit = require(DIR_SERVER + 'exit'); -const CloudFunc = require(DIR_COMMON + 'cloudfunc'); +const CloudFunc = require(DIR_COMMON + 'cloudfunc'); const currify = require('currify'); + const wraptile = require('wraptile'); const tryToCatch = require('try-to-catch'); const pullout = require('pullout'); @@ -22,6 +21,7 @@ const jju = require('jju'); const writejson = require('writejson'); const tryCatch = require('try-catch'); const criton = require('criton'); +const DIR = DIR_SERVER + '../'; const HOME = homedir(); const resolve = Promise.resolve.bind(Promise); diff --git a/server/config.spec.js b/server/config.spec.js index 23230842..046f8a52 100644 --- a/server/config.spec.js +++ b/server/config.spec.js @@ -12,12 +12,12 @@ const { createConfig, _cryptoPass, } = require(configPath); -const config = createConfig(); - const {apiURL} = require(root + 'common/cloudfunc'); const fixture = require('./config.fixture'); + const {connect} = require('../test/before'); +const config = createConfig(); test('config: manage', (t) => { t.equal(undefined, config(), 'should return "undefined"'); diff --git a/server/distribute/import.js b/server/distribute/import.js index 3bdeefa1..783e4d87 100644 --- a/server/distribute/import.js +++ b/server/distribute/import.js @@ -6,10 +6,10 @@ const squad = require('squad'); const fullstore = require('fullstore'); const io = require('socket.io-client'); -const forEachKey = currify(require('for-each-key')); - const log = require('./log'); + const env = require('../env'); +const forEachKey = currify(require('for-each-key')); const { importStr, diff --git a/server/markdown/index.js b/server/markdown/index.js index 31859918..14616dc8 100644 --- a/server/markdown/index.js +++ b/server/markdown/index.js @@ -8,10 +8,10 @@ const ponse = require('ponse'); const threadIt = require('thread-it'); const {read} = require('redzip'); -const parse = threadIt(join(__dirname, 'worker')); - const root = require('../root'); +const parse = threadIt(join(__dirname, 'worker')); + threadIt.init(); // warm up diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.js index bc736bef..7441b1e8 100644 --- a/server/markdown/index.spec.js +++ b/server/markdown/index.spec.js @@ -10,20 +10,20 @@ const test = require('supertape'); const markdown = require('.'); -const _markdown = promisify(markdown); -const fixtureDir = join(__dirname, 'fixture'); const cloudcmd = require('../..'); const config = { auth: false, }; - const configManager = cloudcmd.createConfigManager(); - const {request} = require('serve-once')(cloudcmd, { config, configManager, }); +const fixtureDir = join(__dirname, 'fixture'); + +const _markdown = promisify(markdown); + test('cloudcmd: markdown: error', async (t) => { const {body} = await request.get('/api/v1/markdown/not-found'); diff --git a/server/route.js b/server/route.js index c35c1716..4978b0b3 100644 --- a/server/route.js +++ b/server/route.js @@ -20,9 +20,11 @@ const root = require(DIR_SERVER + 'root'); const prefixer = require(DIR_SERVER + 'prefixer'); const CloudFunc = require(DIR_COMMON + 'cloudfunc'); -const getPrefix = (config) => prefixer(config('prefix')); +const Columns = require(`${DIR_SERVER}/columns`); -const onceRequire = once(require); +const Template = require(`${DIR_SERVER}/template`); + +const {FS} = CloudFunc; const sendIndex = (params, data) => { const ponseParams = { @@ -33,10 +35,8 @@ const sendIndex = (params, data) => { ponse.send(data, ponseParams); }; -const {FS} = CloudFunc; - -const Columns = require(`${DIR_SERVER}/columns`); -const Template = require(`${DIR_SERVER}/template`); +const onceRequire = once(require); +const getPrefix = (config) => prefixer(config('prefix')); const getReadDir = (config) => { if (!config('dropbox')) diff --git a/server/route.spec.js b/server/route.spec.js index c1bde432..60f0aefc 100644 --- a/server/route.spec.js +++ b/server/route.spec.js @@ -8,19 +8,19 @@ const fs = require('fs'); const tryToCatch = require('try-to-catch'); const {test, stub} = require('supertape'); const mockRequire = require('mock-require'); +const cloudcmdPath = './cloudcmd'; + +const cloudcmd = require(cloudcmdPath); + +const serveOnce = require('serve-once'); +const {createConfigManager} = cloudcmd; + +const routePath = './route'; +const fixtureDir = path.join(__dirname, '..', 'test', 'fixture'); const { reRequire, stopAll, } = mockRequire; - -const fixtureDir = path.join(__dirname, '..', 'test', 'fixture'); - -const routePath = './route'; -const cloudcmdPath = './cloudcmd'; - -const cloudcmd = require(cloudcmdPath); -const {createConfigManager} = cloudcmd; -const serveOnce = require('serve-once'); const defaultConfig = { auth: false, dropbox: false, diff --git a/server/server.js b/server/server.js index abfff494..e12f29f0 100644 --- a/server/server.js +++ b/server/server.js @@ -12,25 +12,25 @@ const wraptile = require('wraptile'); const compression = require('compression'); const threadIt = require('thread-it'); -const two = currify((f, a, b) => f(a, b)); const exit = require(DIR_SERVER + 'exit'); +const opn = require('open'); + +const express = require('express'); +const io = require('socket.io'); +const tryRequire = require('tryrequire'); -const exitPort = two(exit, 'cloudcmd --port: %s'); const bind = (f, self) => f.bind(self); -const promisifySelf = squad(promisify, bind); +const two = currify((f, a, b) => f(a, b)); const shutdown = wraptile(async (promises) => { console.log('closing cloudcmd...'); await Promise.all(promises); threadIt.terminate(); process.exit(0); }); +const promisifySelf = squad(promisify, bind); -const opn = require('open'); -const express = require('express'); -const io = require('socket.io'); - -const tryRequire = require('tryrequire'); +const exitPort = two(exit, 'cloudcmd --port: %s'); const logger = tryRequire('morgan'); module.exports = async (options, config) => { diff --git a/server/terminal.spec.js b/server/terminal.spec.js index 0f5e7e59..88e6a0cb 100644 --- a/server/terminal.spec.js +++ b/server/terminal.spec.js @@ -7,9 +7,9 @@ const { const mockRequire = require('mock-require'); -const terminalPath = './terminal'; const terminal = require('./terminal'); const {createConfigManager} = require('./cloudcmd'); +const terminalPath = './terminal'; const {stopAll} = mockRequire; diff --git a/server/validate.spec.js b/server/validate.spec.js index 242cfbe6..a087938d 100644 --- a/server/validate.spec.js +++ b/server/validate.spec.js @@ -8,17 +8,17 @@ const { } = require('supertape'); const tryCatch = require('try-catch'); const mockRequire = require('mock-require'); -const {reRequire, stopAll} = mockRequire; - const dir = '..'; const validatePath = `${dir}/server/validate`; -const exitPath = `${dir}/server/exit`; -const columnsPath = `${dir}/server/columns`; -const cloudcmdPath = `${dir}/server/cloudcmd`; +const cloudcmdPath = `${dir}/server/cloudcmd`; const validate = require(validatePath); const cloudcmd = require(cloudcmdPath); +const columnsPath = `${dir}/server/columns`; + +const exitPath = `${dir}/server/exit`; +const {reRequire, stopAll} = mockRequire; test('validate: root: bad', (t) => { const config = { diff --git a/static/user-menu.spec.js b/static/user-menu.spec.js index 8382904b..91040308 100644 --- a/static/user-menu.spec.js +++ b/static/user-menu.spec.js @@ -1,13 +1,13 @@ 'use strict'; const autoGlobals = require('auto-globals'); -const test = autoGlobals(require('supertape')); const stub = require('@cloudcmd/stub'); const tryToCatch = require('try-to-catch'); const wraptile = require('wraptile'); - const defaultMenu = require('./user-menu'); +const test = autoGlobals(require('supertape')); + const {create} = autoGlobals; const {_data} = defaultMenu; @@ -173,7 +173,7 @@ test('cloudcmd: static: user menu: compare directories: select names: compare', 2, ]; - t.deepEqual(result, expected, 'should equal'); + t.deepEqual(result, expected); t.end(); }); diff --git a/test/common/cloudfunc.js b/test/common/cloudfunc.js index af701540..6b36c90a 100644 --- a/test/common/cloudfunc.js +++ b/test/common/cloudfunc.js @@ -5,8 +5,6 @@ const tryCatch = require('try-catch'); const DIR = __dirname + '/../../'; const COMMONDIR = DIR + 'common/'; -const TMPLDIR = DIR + 'tmpl/'; - const { time, timeEnd, @@ -17,10 +15,12 @@ const CloudFuncPath = COMMONDIR + 'cloudfunc'; const CloudFunc = require(CloudFuncPath); const test = require('supertape'); -const {reRequire} = require('mock-require'); +const {reRequire} = require('mock-require'); const htmlLooksLike = require('html-looks-like'); + const readFilesSync = require('@cloudcmd/read-files-sync'); +const TMPLDIR = DIR + 'tmpl/'; const FS_DIR = TMPLDIR + 'fs/'; const EXPECT_PATH = __dirname + '/cloudfunc.html'; diff --git a/test/rest/copy.js b/test/rest/copy.js index 8d41e566..15e24756 100644 --- a/test/rest/copy.js +++ b/test/rest/copy.js @@ -5,7 +5,6 @@ const {join} = require('path'); const test = require('supertape'); const rimraf = require('rimraf'); -const fixtureDir = join(__dirname, '..', 'fixture') + '/'; const config = { root: join(__dirname, '..'), }; @@ -19,6 +18,8 @@ const {request} = require('serve-once')(cloudcmd, { configManager, }); +const fixtureDir = join(__dirname, '..', 'fixture') + '/'; + test('cloudcmd: rest: copy', async (t) => { const tmp = join(fixtureDir, 'tmp'); const files = { diff --git a/test/rest/move.js b/test/rest/move.js index d36f2e04..1d8343da 100644 --- a/test/rest/move.js +++ b/test/rest/move.js @@ -7,8 +7,8 @@ const {Volume} = require('memfs'); const {ufs} = require('unionfs'); const mockRequire = require('mock-require'); -const {reRequire, stopAll} = mockRequire; const serveOnce = require('serve-once'); +const {reRequire, stopAll} = mockRequire; const cloudcmdPath = '../../'; const dir = cloudcmdPath + 'server/'; diff --git a/test/rest/pack.js b/test/rest/pack.js index 8ad25b7a..8bc12623 100644 --- a/test/rest/pack.js +++ b/test/rest/pack.js @@ -14,10 +14,9 @@ const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); const pathZipFixture = join(__dirname, '..', 'fixture/pack.zip'); const cloudcmdPath = '../..'; -const fixture = { - tar: fs.readFileSync(pathTarFixture), - zip: fs.readFileSync(pathZipFixture), -}; +const cloudcmd = require(cloudcmdPath); + +const serveOnce = require('serve-once'); const defaultOptions = { config: { @@ -26,9 +25,10 @@ const defaultOptions = { }, }; -const cloudcmd = require(cloudcmdPath); - -const serveOnce = require('serve-once'); +const fixture = { + tar: fs.readFileSync(pathTarFixture), + zip: fs.readFileSync(pathZipFixture), +}; const {request} = serveOnce(cloudcmd, defaultOptions); const once = promisify((name, extract, fn) => { diff --git a/test/rest/rename.js b/test/rest/rename.js index ed7e11c5..823e6c27 100644 --- a/test/rest/rename.js +++ b/test/rest/rename.js @@ -7,8 +7,8 @@ const {Volume} = require('memfs'); const {ufs} = require('unionfs'); const mockRequire = require('mock-require'); -const {reRequire, stopAll} = mockRequire; const serveOnce = require('serve-once'); +const {reRequire, stopAll} = mockRequire; const cloudcmdPath = '../../'; const dir = cloudcmdPath + 'server/'; diff --git a/test/server/console.js b/test/server/console.js index 8eb8bfdc..b5abb7c4 100644 --- a/test/server/console.js +++ b/test/server/console.js @@ -6,8 +6,8 @@ const {once} = require('events'); const test = require('supertape'); const io = require('socket.io-client'); -const configPath = path.join(__dirname, '../..', 'server', 'config'); const {connect} = require('../before'); +const configPath = path.join(__dirname, '../..', 'server', 'config'); const configFn = require(configPath).createConfig(); test('cloudcmd: console: enabled', async (t) => { diff --git a/test/server/modulas.js b/test/server/modulas.js index 4af247ce..7a7a3a5c 100644 --- a/test/server/modulas.js +++ b/test/server/modulas.js @@ -42,7 +42,7 @@ test('cloudcmd: modules', async (t) => { options, }); - t.deepEqual(body, expected, 'should equal'); + t.deepEqual(body, expected); t.end(); }); diff --git a/test/static.js b/test/static.js index f8f3e8a8..66094181 100644 --- a/test/static.js +++ b/test/static.js @@ -4,14 +4,14 @@ const test = require('supertape'); const criton = require('criton'); const cloudcmd = require('..'); -const configFn = cloudcmd.createConfigManager(); - const config = { auth: false, }; + const {request} = require('serve-once')(cloudcmd, { config, }); +const configFn = cloudcmd.createConfigManager(); test('cloudcmd: static', async (t) => { const name = 'package.json'; From 975d4eb8a0960b0209e42c013c2e2cdfa5a5877b Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 14 Jun 2022 14:39:06 +0300 Subject: [PATCH 0194/1230] chore(actions) add typos --- .github/workflows/nodejs.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 95ce0d0c..ade24314 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -23,6 +23,23 @@ jobs: run: npm install - name: Lint run: redrun fix:lint + + - uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Typos Install + run: cargo install typos-cli || echo 'already installed' + + - name: Typos + run: typos --write-changes + - name: Commit fixes uses: EndBug/add-and-commit@v7 with: From c345d8b7ef1957fffa5a5486aa6d296720b17318 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 14 Jun 2022 14:39:43 +0300 Subject: [PATCH 0195/1230] =?UTF-8?q?chore(actions)=20add=20=E2=98=98?= =?UTF-8?q?=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/nodejs.yml | 2 +- .typos.toml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .typos.toml diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index ade24314..06c68db3 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -43,7 +43,7 @@ jobs: - name: Commit fixes uses: EndBug/add-and-commit@v7 with: - message: chore(${{ env.NAME }}) lint using actions + message: 'chore(${{ env.NAME }}) actions: lint ☘️' - name: Build run: redrun build - name: Test diff --git a/.typos.toml b/.typos.toml new file mode 100644 index 00000000..bb698401 --- /dev/null +++ b/.typos.toml @@ -0,0 +1,2 @@ +[files] +extend-exclude= ["ChangeLog", "*.js"] From 42e8e255c0d96b4712b04560146f45d0f0bb8aac Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 17 Jun 2022 12:22:40 +0000 Subject: [PATCH 0196/1230] =?UTF-8?q?chore(cloudcmd)=20actions:=20lint=20?= =?UTF-8?q?=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/rest/pack.js | 8 ++++---- tmpl/config.hbs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/rest/pack.js b/test/rest/pack.js index 8bc12623..96ca2c00 100644 --- a/test/rest/pack.js +++ b/test/rest/pack.js @@ -10,14 +10,14 @@ const tar = require('tar-stream'); const gunzip = require('gunzip-maybe'); const pullout = require('pullout'); -const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); -const pathZipFixture = join(__dirname, '..', 'fixture/pack.zip'); const cloudcmdPath = '../..'; - const cloudcmd = require(cloudcmdPath); - const serveOnce = require('serve-once'); +const pathZipFixture = join(__dirname, '..', 'fixture/pack.zip'); + +const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); + const defaultOptions = { config: { auth: false, diff --git a/tmpl/config.hbs b/tmpl/config.hbs index 68683617..058815e7 100644 --- a/tmpl/config.hbs +++ b/tmpl/config.hbs @@ -34,7 +34,7 @@ Diff -
  • +
  • -
  • +
  • + + + +
  • - From 7f5e5c682500fedcd591fccb42434a9859a7eead Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 13:28:57 +0200 Subject: [PATCH 0457/1230] chore: cloudcmd: v17.3.0 --- ChangeLog | 6 ++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 18dcfedc..ead05ad1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024.03.29, v17.3.0 + +feature: +- 6bc4f3ec dark theme: add (#332) +- 35622082 route: convert to ESM + 2024.03.29, v17.2.1 fix: diff --git a/HELP.md b/HELP.md index 49ffb0ea..8ab50774 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.2.1 +# Cloud Commander v17.3.0 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1093,6 +1093,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.03.29*, **[v17.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.0)** - *2024.03.29*, **[v17.2.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.2.1)** - *2024.03.22*, **[v17.2.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.2.0)** - *2024.03.21*, **[v17.1.6](//github.com/coderaiser/cloudcmd/releases/tag/v17.1.6)** diff --git a/README.md b/README.md index dcc9e596..f5657def 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.2.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.3.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 65f60d68..8d27f51a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.2.1", + "version": "17.3.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 29914c09f1982921a66365e0fe9657bf7359ed14 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 13:30:50 +0200 Subject: [PATCH 0458/1230] docs: Special Thanks: link --- HELP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index 8ab50774..035ec30e 100644 --- a/HELP.md +++ b/HELP.md @@ -1546,7 +1546,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Special Thanks -- [Olena Zalitok](http://www.linkedin.com/in/olena-zalitok-ux-designer "Olena Zalitok") for **logo** and **favicon**. +- [Olena Zalitok](https://www.linkedin.com/in/ozalitok-ux-ui/ "Olena Zalitok") for **logo** and **favicon**. - [TarZak](https://github.com/tarzak "TarZak") - Russian and Ukrainian translations; - config template and style; From faa2cb3f9038edb5dd4acaed527730756c360c0f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 14:28:55 +0200 Subject: [PATCH 0459/1230] docs: help --- HELP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index 035ec30e..e6204f42 100644 --- a/HELP.md +++ b/HELP.md @@ -93,7 +93,8 @@ Cloud Commander supports the following command-line parameters: | `--terminal-command` | set command to run in terminal (shell by default) | `--terminal-auto-restart` | restart command on exit | `--vim` | enable vim hot keys -| `--themes` | set visible themes +| `--columns` | set visible columns +| `--theme` | set theme 'light' or 'dark'" | `--export` | enable export of config through a server | `--export-token` | authorization token used by export server | `--import` | enable import of config From d75818297bd0d9deae1cc8a5dd9821209f368381 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 14:58:38 +0200 Subject: [PATCH 0460/1230] feature: distribute: convert to ESM --- bin/cloudcmd.mjs | 4 +- server/cloudcmd.mjs | 4 +- server/distribute/{export.js => export.mjs} | 19 +++---- server/distribute/{import.js => import.mjs} | 22 ++++---- server/distribute/import.spec.mjs | 6 +-- server/distribute/index.js | 4 -- server/distribute/log.js | 41 --------------- server/distribute/log.mjs | 52 +++++++++++++++++++ .../distribute/{log.spec.js => log.spec.mjs} | 8 ++- 9 files changed, 78 insertions(+), 82 deletions(-) rename server/distribute/{export.js => export.mjs} (91%) rename server/distribute/{import.js => import.mjs} (91%) delete mode 100644 server/distribute/index.js delete mode 100644 server/distribute/log.js create mode 100644 server/distribute/log.mjs rename server/distribute/{log.spec.js => log.spec.mjs} (83%) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 6ec0ec40..4ea301ac 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -241,8 +241,8 @@ async function main() { if (args.showConfig) await showConfig(); - const distribute = await simport('../server/distribute/index.js'); - const importConfig = promisify(distribute.import); + const {distributeImport} = await simport('../server/distribute/import.mjs'); + const importConfig = promisify(distributeImport); await start(options, config); diff --git a/server/cloudcmd.mjs b/server/cloudcmd.mjs index 5c2c9eef..62414a83 100644 --- a/server/cloudcmd.mjs +++ b/server/cloudcmd.mjs @@ -24,7 +24,7 @@ import route from './route.mjs'; import * as validate from './validate.mjs'; import prefixer from './prefixer.js'; import terminal from './terminal.js'; -import distribute from './distribute/index.js'; +import {distributeExport} from './distribute/export.mjs'; import {createDepStore} from './depstore.js'; const __filename = fileURLToPath(import.meta.url); @@ -175,7 +175,7 @@ function listen({prefixSocket, socket, config}) { autoRestart: config('terminalAutoRestart'), }); - distribute.export(config, socket); + distributeExport(config, socket); } function cloudcmdMiddle({modules, config}) { diff --git a/server/distribute/export.js b/server/distribute/export.mjs similarity index 91% rename from server/distribute/export.js rename to server/distribute/export.mjs index abd057a3..02149ca5 100644 --- a/server/distribute/export.js +++ b/server/distribute/export.mjs @@ -1,13 +1,8 @@ -'use strict'; - -const currify = require('currify'); -const wraptile = require('wraptile'); -const squad = require('squad'); -const omit = require('object.omit'); - -const log = require('./log'); - -const { +import currify from 'currify'; +import wraptile from 'wraptile'; +import squad from 'squad'; +import omit from 'object.omit'; +import log, { exportStr, connectedStr, disconnectedStr, @@ -16,7 +11,7 @@ const { getMessage, getDescription, logWraped, -} = log; +} from './log.mjs'; const omitList = [ 'auth', @@ -38,7 +33,7 @@ const omitList = [ const omitConfig = (config) => omit(config, omitList); -module.exports = (config, socket) => { +export const distributeExport = (config, socket) => { if (!config('export')) return; diff --git a/server/distribute/import.js b/server/distribute/import.mjs similarity index 91% rename from server/distribute/import.js rename to server/distribute/import.mjs index 7a88e89d..57d215b8 100644 --- a/server/distribute/import.js +++ b/server/distribute/import.mjs @@ -1,16 +1,14 @@ -'use strict'; +import currify from 'currify'; +import wraptile from 'wraptile'; +import squad from 'squad'; +import fullstore from 'fullstore'; +import io from 'socket.io-client'; +import log from './log.mjs'; +import env from '../env.js'; +import _forEachKey from 'for-each-key'; -const currify = require('currify'); -const wraptile = require('wraptile'); -const squad = require('squad'); -const fullstore = require('fullstore'); - -const io = require('socket.io-client'); -const log = require('./log'); - -const env = require('../env'); const noop = () => {}; -const forEachKey = currify(require('for-each-key')); +const forEachKey = currify(_forEachKey); const { importStr, @@ -67,7 +65,7 @@ const updateConfig = currify((config, data) => { } }); -module.exports = (config, options, fn) => { +export const distributeImport = (config, options, fn) => { fn = fn || options; if (!config('import')) diff --git a/server/distribute/import.spec.mjs b/server/distribute/import.spec.mjs index caf9080a..9df6f846 100644 --- a/server/distribute/import.spec.mjs +++ b/server/distribute/import.spec.mjs @@ -1,15 +1,13 @@ -import {createRequire} from 'node:module'; import process from 'node:process'; import test from 'supertape'; import {promisify} from 'node:util'; import tryToCatch from 'try-to-catch'; import {connect} from '../../test/before.mjs'; import {createConfigManager} from '../cloudcmd.mjs'; - -const require = createRequire(import.meta.url); +import {distributeImport} from './import.mjs'; const distribute = { - import: promisify(require('./import')), + import: promisify(distributeImport), }; const config = createConfigManager(); diff --git a/server/distribute/index.js b/server/distribute/index.js deleted file mode 100644 index 9fae4b04..00000000 --- a/server/distribute/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; - -module.exports.import = require('./import'); -module.exports.export = require('./export'); diff --git a/server/distribute/log.js b/server/distribute/log.js deleted file mode 100644 index 515933f1..00000000 --- a/server/distribute/log.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -const wraptile = require('wraptile'); -const chalk = require('chalk'); - -const datetime = require('../../common/datetime'); - -const log = (isLog, name, msg) => isLog && console.log(`${datetime()} -> ${name}: ${msg}`); -const makeColor = (a) => chalk.blue(a); -const getMessage = (e) => e.message || e; -const getDescription = (e) => e.message; - -module.exports = log; -module.exports.logWraped = wraptile(log); -module.exports.stringToRGB = stringToRGB; -module.exports.makeColor = makeColor; -module.exports.getMessage = getMessage; -module.exports.getDescription = getDescription; - -module.exports.importStr = 'import'; -module.exports.exportStr = 'export'; -module.exports.connectedStr = chalk.green('connected'); -module.exports.disconnectedStr = chalk.red('disconnected'); -module.exports.tokenRejectedStr = chalk.red('token rejected'); -module.exports.authTryStr = chalk.yellow('try to auth'); - -function stringToRGB(a) { - return [ - a.charCodeAt(0), - a.length, - crc(a), - ]; -} - -const add = (a, b) => a + b.charCodeAt(0); - -function crc(a) { - return a - .split('') - .reduce(add, 0); -} diff --git a/server/distribute/log.mjs b/server/distribute/log.mjs new file mode 100644 index 00000000..feb79c8c --- /dev/null +++ b/server/distribute/log.mjs @@ -0,0 +1,52 @@ +import wraptile from 'wraptile'; +import chalk from 'chalk'; +import datetime from '../../common/datetime.js'; + +const {assign} = Object; + +const log = (isLog, name, msg) => isLog && console.log(`${datetime()} -> ${name}: ${msg}`); + +export const makeColor = (a) => chalk.blue(a); +export const getMessage = (e) => e.message || e; +export const getDescription = (e) => e.message; + +export default log; + +export const logWraped = wraptile(log); + +export const importStr = 'import'; +export const exportStr = 'export'; +export const connectedStr = chalk.green('connected'); +export const disconnectedStr = chalk.red('disconnected'); +export const tokenRejectedStr = chalk.red('token rejected'); +export const authTryStr = chalk.yellow('try to auth'); + +export function stringToRGB(a) { + return [ + a.charCodeAt(0), + a.length, + crc(a), + ]; +} + +const add = (a, b) => a + b.charCodeAt(0); + +function crc(a) { + return a + .split('') + .reduce(add, 0); +} + +assign(log, { + getMessage, + makeColor, + getDescription, + authTryStr, + stringToRGB, + logWraped, + importStr, + exportStr, + connectedStr, + disconnectedStr, + tokenRejectedStr, +}); diff --git a/server/distribute/log.spec.js b/server/distribute/log.spec.mjs similarity index 83% rename from server/distribute/log.spec.js rename to server/distribute/log.spec.mjs index 462b9875..50e4df11 100644 --- a/server/distribute/log.spec.js +++ b/server/distribute/log.spec.mjs @@ -1,8 +1,6 @@ -'use strict'; - -const test = require('supertape'); -const log = require('./log'); -const {createConfig} = require('../config'); +import test from 'supertape'; +import log from './log.mjs'; +import {createConfig} from '../config.js'; test('distribute: log: getMessage', (t) => { const e = 'hello'; From 2d37f6c6e98f89d51c56b0df6e3d7581a52b7a38 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 15:00:27 +0200 Subject: [PATCH 0461/1230] docs: env: theme --- HELP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/HELP.md b/HELP.md index e6204f42..108b43cc 100644 --- a/HELP.md +++ b/HELP.md @@ -430,6 +430,7 @@ Some config options can be overridden with environment variables, such as: - `CLOUDCMD_OPEN` - open web browser when server started - `CLOUDCMD_EDITOR` - set editor - `CLOUDCMD_COLUMNS` - set visible themes +- `CLOUDCMD_THEME` - set themes "light" or "dark" - `CLOUDCMD_CONTACT` - enable contact - `CLOUDCMD_CONFIG_DIALOG` - enable config dialog - `CLOUDCMD_CONFIG_AUTH` - enable auth change in config dialog From 91de9b3d278fcdf54e078b6479f36cd40c3aa2d6 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 15:03:21 +0200 Subject: [PATCH 0462/1230] chore: cloudcmd: v17.3.1 --- ChangeLog | 5 +++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index ead05ad1..0dedb4bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024.03.29, v17.3.1 + +feature: +- d7581829 distribute: convert to ESM + 2024.03.29, v17.3.0 feature: diff --git a/HELP.md b/HELP.md index 108b43cc..742f0707 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.0 +# Cloud Commander v17.3.1 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.03.29*, **[v17.3.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.1)** - *2024.03.29*, **[v17.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.0)** - *2024.03.29*, **[v17.2.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.2.1)** - *2024.03.22*, **[v17.2.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.2.0)** diff --git a/README.md b/README.md index f5657def..6724da67 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.3.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 8d27f51a..eb8d2459 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.3.0", + "version": "17.3.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From f7a6a36696c09ca5b00b35999435820fc961ad81 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 16:01:13 +0200 Subject: [PATCH 0463/1230] fix: typo: Wraped -> Wrapped --- server/config.js | 4 ++-- server/distribute/export.mjs | 6 +++--- server/distribute/import.mjs | 18 +++++++++--------- server/distribute/log.mjs | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/server/config.js b/server/config.js index 40be286a..5c1352a2 100644 --- a/server/config.js +++ b/server/config.js @@ -35,7 +35,7 @@ const ConfigPath = path.join(DIR, 'json/config.json'); const ConfigHome = path.join(HOME, '.cloudcmd.json'); const connection = currify(_connection); -const connectionWraped = wraptile(_connection); +const connectionWrapped = wraptile(_connection); const middle = currify(_middle); const readjsonSync = (name) => { @@ -155,7 +155,7 @@ function listen(manage, sock, auth) { return connection(manage, socket); const reject = () => socket.emit('reject'); - socket.on('auth', auth(connectionWraped(manage, socket), reject)); + socket.on('auth', auth(connectionWrapped(manage, socket), reject)); }); } diff --git a/server/distribute/export.mjs b/server/distribute/export.mjs index 02149ca5..aa0dbc1e 100644 --- a/server/distribute/export.mjs +++ b/server/distribute/export.mjs @@ -10,7 +10,7 @@ import log, { makeColor, getMessage, getDescription, - logWraped, + logWrapped, } from './log.mjs'; const omitList = [ @@ -41,9 +41,9 @@ export const distributeExport = (config, socket) => { const distributePrefix = `${prefix}/distribute`; const isLog = config('log'); - const onError = squad(logWraped(isLog, exportStr), getMessage); + const onError = squad(logWrapped(isLog, exportStr), getMessage); - const onConnectError = squad(logWraped(isLog, exportStr), getDescription); + const onConnectError = squad(logWrapped(isLog, exportStr), getDescription); socket .of(distributePrefix) diff --git a/server/distribute/import.mjs b/server/distribute/import.mjs index 57d215b8..72ce438d 100644 --- a/server/distribute/import.mjs +++ b/server/distribute/import.mjs @@ -18,7 +18,7 @@ const { authTryStr, getMessage, getDescription, - logWraped, + logWrapped, } = log; const {entries} = Object; @@ -94,23 +94,23 @@ export const distributeImport = (config, options, fn) => { const close = closeIfNot(socket, importListen); const statusStore = fullstore(); - const statusStoreWraped = wraptile(statusStore); + const statusStoreWrapped = wraptile(statusStore); - const onConfig = squad(close, logWraped(isLog, importStr, `config received from ${colorUrl}`), statusStoreWraped('received'), updateConfig(config)); + const onConfig = squad(close, logWrapped(isLog, importStr, `config received from ${colorUrl}`), statusStoreWrapped('received'), updateConfig(config)); - const onError = squad(superFn('error'), logWraped(isLog, config, importStr), addUrl(colorUrl), getMessage); + const onError = squad(superFn('error'), logWrapped(isLog, config, importStr), addUrl(colorUrl), getMessage); - const onConnectError = squad(superFn('connect_error'), logWraped(isLog, importStr), addUrl(colorUrl), getDescription); + const onConnectError = squad(superFn('connect_error'), logWrapped(isLog, importStr), addUrl(colorUrl), getDescription); const onConnect = emitAuth(importUrl, config, socket); - const onAccept = logWraped(isLog, importStr, `${connectedStr} to ${colorUrl}`); + const onAccept = logWrapped(isLog, importStr, `${connectedStr} to ${colorUrl}`); const onDisconnect = squad( done( fn, statusStore, ), - logWraped( + logWrapped( isLog, importStr, `${disconnectedStr} from ${colorUrl}`, @@ -125,9 +125,9 @@ export const distributeImport = (config, options, fn) => { ), ); - const onChange = squad(logWraped(isLog, importStr), config); + const onChange = squad(logWrapped(isLog, importStr), config); - const onReject = squad(superFn('reject'), logWraped( + const onReject = squad(superFn('reject'), logWrapped( isLog, importStr, tokenRejectedStr, diff --git a/server/distribute/log.mjs b/server/distribute/log.mjs index feb79c8c..acea5759 100644 --- a/server/distribute/log.mjs +++ b/server/distribute/log.mjs @@ -12,7 +12,7 @@ export const getDescription = (e) => e.message; export default log; -export const logWraped = wraptile(log); +export const logWrapped = wraptile(log); export const importStr = 'import'; export const exportStr = 'export'; @@ -43,7 +43,7 @@ assign(log, { getDescription, authTryStr, stringToRGB, - logWraped, + logWrapped, importStr, exportStr, connectedStr, From fceddc20f8a415fd3ace514c306f5f875b0b9cbd Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 29 Mar 2024 16:01:48 +0200 Subject: [PATCH 0464/1230] chore: cloudcmd: v17.3.2 --- ChangeLog | 5 +++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0dedb4bc..8a12957a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024.03.29, v17.3.2 + +fix: +- f7a6a366 typo: Wraped -> Wrapped + 2024.03.29, v17.3.1 feature: diff --git a/HELP.md b/HELP.md index 742f0707..95044a11 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.1 +# Cloud Commander v17.3.2 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.03.29*, **[v17.3.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.2)** - *2024.03.29*, **[v17.3.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.1)** - *2024.03.29*, **[v17.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.0)** - *2024.03.29*, **[v17.2.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.2.1)** diff --git a/README.md b/README.md index 6724da67..46b7e62b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.3.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index eb8d2459..e8da058e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.3.1", + "version": "17.3.2", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From b088b84eb1b3276da995466f75465db16be4a7e0 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Apr 2024 09:36:32 +0300 Subject: [PATCH 0465/1230] feature: cloudcmd: deepword v10.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8da058e..fae2306a 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "criton": "^2.0.0", "currify": "^4.0.0", "deepmerge": "^4.0.0", - "deepword": "^9.0.0", + "deepword": "^10.0.0", "dword": "^15.0.0", "edward": "^15.0.0", "es6-promisify": "^7.0.0", From d061aa82ea3ff6b7ad992194178e35a7e3de45d3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Apr 2024 09:37:44 +0300 Subject: [PATCH 0466/1230] chore: cloudcmd: v17.3.3 --- ChangeLog | 5 +++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8a12957a..38e91267 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024.04.03, v17.3.3 + +feature: +- b088b84e cloudcmd: deepword v10.0.0 + 2024.03.29, v17.3.2 fix: diff --git a/HELP.md b/HELP.md index 95044a11..5f2da049 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.2 +# Cloud Commander v17.3.3 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.04.03*, **[v17.3.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.3)** - *2024.03.29*, **[v17.3.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.2)** - *2024.03.29*, **[v17.3.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.1)** - *2024.03.29*, **[v17.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.0)** diff --git a/README.md b/README.md index 46b7e62b..0de495f2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.3.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index fae2306a..98f5d890 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.3.2", + "version": "17.3.3", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 37ab7068d9090d599fc97e06af3e08d156c1b251 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Tue, 16 Apr 2024 00:47:40 -0400 Subject: [PATCH 0467/1230] feature: publish container image to GHCR (#409) * feat: publish container image to GHCR Fixes: #408 * add permissions to workflow --- .github/workflows/docker.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 5a932ac7..d0f8c6eb 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -6,6 +6,9 @@ on: jobs: buildx: runs-on: ubuntu-latest + permissions: + contents: read + packages: write steps: - name: Checkout uses: actions/checkout@v4 @@ -38,6 +41,12 @@ jobs: with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push base-image uses: docker/build-push-action@v5 with: @@ -48,6 +57,8 @@ jobs: tags: | coderaiser/cloudcmd:latest coderaiser/cloudcmd:${{ steps.build.outputs.version }} + ghcr.io/${{ github.repository }}:latest + ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }} - name: Build and push alpine-image uses: docker/build-push-action@v5 with: @@ -58,3 +69,5 @@ jobs: tags: | coderaiser/cloudcmd:latest-alpine coderaiser/cloudcmd:${{ steps.build.outputs.version }}-alpine + ghcr.io/${{ github.repository }}:latest-alpine + ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }}-alpine From 6fb2102099e1287136c2ba9e40795dd54579452c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 16 Apr 2024 23:04:46 +0300 Subject: [PATCH 0468/1230] fix: server: route: path traversal --- server/route.mjs | 4 ++++ test/rest/fs.mjs | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/server/route.mjs b/server/route.mjs index 5397c27f..d6917ec5 100644 --- a/server/route.mjs +++ b/server/route.mjs @@ -77,7 +77,11 @@ async function route({config, options, request, response}) { const rootName = name.replace(CloudFunc.FS, '') || '/'; const fullPath = root(rootName, config('root')); + if (fullPath.indexOf(config('root'))) + return ponse.sendError(Error(`Path '${fullPath}' beyond root '${config('root')}'`), p); + const {html, win32} = options; + const read = getReadDir(config, { win32, }); diff --git a/test/rest/fs.mjs b/test/rest/fs.mjs index 7557ede0..07f4b7f6 100644 --- a/test/rest/fs.mjs +++ b/test/rest/fs.mjs @@ -18,3 +18,10 @@ test('cloudcmd: rest: fs: path', async (t) => { t.equal(path, '/', 'should dir path be "/"'); t.end(); }); + +test('cloudcmd: path traversal beyond root', async (t) => { + const {body} = await request.get('/fs..%2f..%2fetc/passwd'); + + t.match(body, 'beyond root', 'should return beyond root message'); + t.end(); +}); From 24288536135c15bc6f4cab8837cfae6ae4901f24 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 17 Apr 2024 00:04:02 +0300 Subject: [PATCH 0469/1230] chore: lint --- .npmignore | 1 + .nycrc.json | 3 ++- client/modules/polyfill.spec.js | 8 +++++--- server/config.js | 10 ++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.npmignore b/.npmignore index de3559c7..0ecde705 100644 --- a/.npmignore +++ b/.npmignore @@ -30,3 +30,4 @@ webpack.config.js *.cdr *.eps +*.config.* diff --git a/.nycrc.json b/.nycrc.json index df171b24..bd520eb6 100644 --- a/.nycrc.json +++ b/.nycrc.json @@ -4,7 +4,8 @@ "exclude": [ "**/*.spec.js", "**/fixture", - "**/*.*.js" + "**/*.*.js", + "**/*.config.*" ], "branches": 100, "lines": 100, diff --git a/client/modules/polyfill.spec.js b/client/modules/polyfill.spec.js index ea4524a7..02686c1d 100644 --- a/client/modules/polyfill.spec.js +++ b/client/modules/polyfill.spec.js @@ -23,9 +23,11 @@ test('cloudcmd: client: polyfill: scrollIntoViewIfNeaded', (t) => { mockRequire.stop('scroll-into-view-if-neaded'); global.DOM = DOM; - const args = [el, { - block: 'nearest', - }]; + const args = [ + el, { + block: 'nearest', + }, + ]; stopAll(); diff --git a/server/config.js b/server/config.js index 5c1352a2..5d20af30 100644 --- a/server/config.js +++ b/server/config.js @@ -242,8 +242,10 @@ function cryptoPass(manage, json) { const password = criton(json.password, algo); - return [manage, { - ...json, - password, - }]; + return [ + manage, { + ...json, + password, + }, + ]; } From 52df5bfcf49ac8b72b04a6a712737a529d05e5da Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 17 Apr 2024 00:05:05 +0300 Subject: [PATCH 0470/1230] chore: cloudcmd: v17.4.0 --- ChangeLog | 8 ++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 38e91267..75b23217 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2024.04.17, v17.4.0 + +fix: +- 6fb21020 server: route: path traversal + +feature: +- 37ab7068 publish container image to GHCR (#409) + 2024.04.03, v17.3.3 feature: diff --git a/HELP.md b/HELP.md index 5f2da049..13b1a36c 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.3 +# Cloud Commander v17.4.0 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.04.17*, **[v17.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.0)** - *2024.04.03*, **[v17.3.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.3)** - *2024.03.29*, **[v17.3.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.2)** - *2024.03.29*, **[v17.3.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.1)** diff --git a/README.md b/README.md index 0de495f2..5290718d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.3.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.4.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 98f5d890..0e9ec0df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.3.3", + "version": "17.4.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From c409a2db82180123c4acaa54474cee8b2fbede28 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 6 May 2024 12:20:55 +0300 Subject: [PATCH 0471/1230] feature: cloudcmd: copymitter v9.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e9ec0df..0b24b57b 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "chalk": "^4.0.0", "compression": "^1.7.4", "console-io": "^14.0.0", - "copymitter": "^8.0.1", + "copymitter": "^9.0.0", "criton": "^2.0.0", "currify": "^4.0.0", "deepmerge": "^4.0.0", From 154b4bd6274334afeb240459a615c057fa14552a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 6 May 2024 12:21:01 +0300 Subject: [PATCH 0472/1230] feature: cloudcmd: @cloudcmd/move-files v8.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0b24b57b..17526989 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "@babel/plugin-transform-optional-chaining": "^7.21.0", "@cloudcmd/dropbox": "^5.0.1", "@cloudcmd/fileop": "^8.0.0", - "@cloudcmd/move-files": "^7.0.0", + "@cloudcmd/move-files": "^8.0.0", "@cloudcmd/read-files-sync": "^2.0.0", "@putout/cli-validate-args": "^1.0.1", "@putout/plugin-cloudcmd": "^3.1.1", From 610ba8827f9f1a2bf1761df3f90af9fe93b45d63 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 6 May 2024 14:48:47 +0300 Subject: [PATCH 0473/1230] chore: lint --- .github/workflows/docker.yml | 6 ++---- client/client.js | 15 ++++++++------- client/dom/current-file.spec.js | 20 +++++++++++--------- server/terminal.js | 6 +++++- server/validate.mjs | 19 ++++++++++++++++--- 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d0f8c6eb..f26b3755 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -27,11 +27,9 @@ jobs: run: redrun lint - name: Build id: build - run: > + run: | redrun build - - echo "::set-output name=version::$(grep '"version":' package.json -m1 - | cut -d\" -f4)" + echo "::set-output name=version::$(grep '"version":' package.json -m1 | cut -d\" -f4)" - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx diff --git a/client/client.js b/client/client.js index 58f4ae83..d1bdbcff 100644 --- a/client/client.js +++ b/client/client.js @@ -74,13 +74,14 @@ function CloudCmdProto(DOM) { right: 'asc', }; - this.changeDir = async (path, { - isRefresh, - panel, - history = true, - noCurrent, - currentName, - } = {}) => { + this.changeDir = async (path, overrides = {}) => { + const { + isRefresh, + panel, + history = true, + noCurrent, + currentName, + } = overrides; const refresh = isRefresh; let panelChanged; diff --git a/client/dom/current-file.spec.js b/client/dom/current-file.spec.js index 3c907fcd..3d822206 100644 --- a/client/dom/current-file.spec.js +++ b/client/dom/current-file.spec.js @@ -285,15 +285,17 @@ test('current-file: parseHrefAttribute', (t) => { t.end(); }); -function getDOM({ - link = {}, - getCurrentDirPath = stub(), - getCurrentDirName = stub(), - getByDataName = stub(), - isContainClass = stub(), - getCurrentType = stub(), - getCurrentPath = stub(), -} = {}) { +function getDOM(overrides = {}) { + const { + link = {}, + getCurrentDirPath = stub(), + getCurrentDirName = stub(), + getByDataName = stub(), + isContainClass = stub(), + getCurrentType = stub(), + getCurrentPath = stub(), + } = overrides; + return { getCurrentDirPath, getCurrentDirName, diff --git a/server/terminal.js b/server/terminal.js index 7a291b31..d10cdc8b 100644 --- a/server/terminal.js +++ b/server/terminal.js @@ -12,7 +12,11 @@ function _getModule(a) { return require(a); } -module.exports = (config, arg, {getModule = _getModule} = {}) => { +module.exports = (config, arg, overrides = {}) => { + const { + getModule = _getModule, + } = overrides; + if (!config('terminal')) return noop; diff --git a/server/validate.mjs b/server/validate.mjs index bf825e85..6b928e7b 100644 --- a/server/validate.mjs +++ b/server/validate.mjs @@ -6,7 +6,12 @@ import {getThemes as _getThemes} from './theme.mjs'; const isString = (a) => typeof a === 'string'; -export const root = (dir, config, {exit = _exit, statSync = _statSync} = {}) => { +export const root = (dir, config, overrides = {}) => { + const { + exit = _exit, + statSync = _statSync, + } = overrides; + if (!isString(dir)) throw Error('dir should be a string'); @@ -36,7 +41,11 @@ export const packer = (name, {exit = _exit} = {}) => { exit('cloudcmd --packer: could be "tar" or "zip" only'); }; -export const columns = (type, {exit = _exit, getColumns = _getColumns} = {}) => { +export const columns = (type, overrides = {}) => { + const { + exit = _exit, + getColumns = _getColumns, + } = overrides; const addQuotes = (a) => `"${a}"`; const all = Object .keys(getColumns()) @@ -51,7 +60,11 @@ export const columns = (type, {exit = _exit, getColumns = _getColumns} = {}) => exit(`cloudcmd --columns: can be only one of: ${names}`); }; -export const theme = (type, {exit = _exit, getThemes = _getThemes} = {}) => { +export const theme = (type, overrides = {}) => { + const { + exit = _exit, + getThemes = _getThemes, + } = overrides; const addQuotes = (a) => `"${a}"`; const all = Object .keys(getThemes()) From 25872c3b11c07aa99e3b812a6899881f09944575 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 6 May 2024 14:49:44 +0300 Subject: [PATCH 0474/1230] chore: cloudcmd: v17.4.1 --- ChangeLog | 6 ++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75b23217..bae03a7f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024.05.06, v17.4.1 + +feature: +- 154b4bd6 cloudcmd: @cloudcmd/move-files v8.0.0 +- c409a2db cloudcmd: copymitter v9.0.0 + 2024.04.17, v17.4.0 fix: diff --git a/HELP.md b/HELP.md index 13b1a36c..1d44b4b0 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.0 +# Cloud Commander v17.4.1 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.05.06*, **[v17.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.1)** - *2024.04.17*, **[v17.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.0)** - *2024.04.03*, **[v17.3.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.3)** - *2024.03.29*, **[v17.3.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.2)** diff --git a/README.md b/README.md index 5290718d..63158df4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.4.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 17526989..75da1b5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.4.0", + "version": "17.4.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 14d46c007b84f7dc63523a07bca9b6f6818132f0 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 6 May 2024 11:52:34 +0000 Subject: [PATCH 0475/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/client.js | 1 + server/validate.mjs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/client/client.js b/client/client.js index d1bdbcff..4c4555ff 100644 --- a/client/client.js +++ b/client/client.js @@ -82,6 +82,7 @@ function CloudCmdProto(DOM) { noCurrent, currentName, } = overrides; + const refresh = isRefresh; let panelChanged; diff --git a/server/validate.mjs b/server/validate.mjs index 6b928e7b..fa67a321 100644 --- a/server/validate.mjs +++ b/server/validate.mjs @@ -46,6 +46,7 @@ export const columns = (type, overrides = {}) => { exit = _exit, getColumns = _getColumns, } = overrides; + const addQuotes = (a) => `"${a}"`; const all = Object .keys(getColumns()) @@ -65,6 +66,7 @@ export const theme = (type, overrides = {}) => { exit = _exit, getThemes = _getThemes, } = overrides; + const addQuotes = (a) => `"${a}"`; const all = Object .keys(getThemes()) From 9c8c0533a4a84af50565af63c0b801d58d0f9566 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 13 Jun 2024 09:11:36 +0300 Subject: [PATCH 0476/1230] Update CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 453cbc03..b6b6b4ef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,5 +26,5 @@ For example util, console, view, edit, style etc... **Examples**: -- [fix(style) .name{width}: 37% -> 35%](https://github.com/coderaiser/cloudcmd/commit/94b0642e3990c17b3a0ee3efeb75f343e1e7c050) -- [fix(console) dispatch: focus -> mouseup](https://github.com/coderaiser/cloudcmd/commit/f41ec5058d1411e86a881f8e8077e0572e0409ec) +- [fix: style: .name{width}: 37% -> 35%](https://github.com/coderaiser/cloudcmd/commit/94b0642e3990c17b3a0ee3efeb75f343e1e7c050) +- [fix: console: dispatch: focus -> mouseup](https://github.com/coderaiser/cloudcmd/commit/f41ec5058d1411e86a881f8e8077e0572e0409ec) From 883eee96a2c2fb4829198e2d620caca518110747 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 14 Jun 2024 22:26:27 +0300 Subject: [PATCH 0477/1230] chore: lint --- client/sort.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/sort.js b/client/sort.js index fdcfaf65..863c8379 100644 --- a/client/sort.js +++ b/client/sort.js @@ -4,11 +4,8 @@ const DOM = require('./dom'); const Info = DOM.CurrentInfo; - const {sort, order} = CloudCmd; - const position = DOM.getPanelPosition(); - let sortPrevious = sort[position]; const {getPanel} = DOM; From 05ef0ae4522503900f279da652856c0eb580151b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 14 Jun 2024 22:32:50 +0300 Subject: [PATCH 0478/1230] feature: cloudcmd: c8 v10.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 75da1b5c..9e6ac9bd 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "auto-globals": "^4.0.0", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "cheerio": "^1.0.0-rc.5", "clean-css-loader": "^2.0.0", "codegen.macro": "^4.0.0", From 14d9618a6439f2ff39dc75bb5f4c8a868baf3c3a Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 14 Jun 2024 22:33:14 +0300 Subject: [PATCH 0479/1230] chore: lint --- client/modules/config/index.js | 3 ++- client/modules/edit-names.js | 4 ++-- client/sort.js | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/client/modules/config/index.js b/client/modules/config/index.js index cdd18da1..0ec5b100 100644 --- a/client/modules/config/index.js +++ b/client/modules/config/index.js @@ -225,7 +225,8 @@ function onAuthChange(checked) { const elUsername = input.getElementByName('username', Element); const elPassword = input.getElementByName('password', Element); - elUsername.disabled = elPassword.disabled = !checked; + elUsername.disabled = !checked; + elPassword.disabled = !checked; } function onNameChange(name) { diff --git a/client/modules/edit-names.js b/client/modules/edit-names.js index e1cc3cbe..c0b9ae84 100644 --- a/client/modules/edit-names.js +++ b/client/modules/edit-names.js @@ -63,9 +63,9 @@ async function keyListener(event) { const ctrlMeta = ctrl || meta; const {Key} = CloudCmd; - if (ctrlMeta && event.keyCode === Key.S) + if (ctrlMeta && event.keyCode === Key.S) { hide(); - else if (ctrlMeta && event.keyCode === Key.P) { + } else if (ctrlMeta && event.keyCode === Key.P) { const [, pattern] = await Dialog.prompt('Apply pattern:', '[n][e]'); pattern && applyPattern(pattern); } diff --git a/client/sort.js b/client/sort.js index 863c8379..cf9fb4a4 100644 --- a/client/sort.js +++ b/client/sort.js @@ -20,8 +20,8 @@ CloudCmd.sortPanel = (name, panel = getPanel()) => { else order[position] = 'asc'; - sortPrevious = sort[position] = name; - + sortPrevious = name; + sort[position] = name; const noCurrent = position !== Info.panelPosition; CloudCmd.refresh({ From 2ae6ad34fc7e238b56796694c0cbba5059973be0 Mon Sep 17 00:00:00 2001 From: zilion2000 Date: Wed, 3 Jul 2024 13:57:56 +0200 Subject: [PATCH 0480/1230] feature: docker: Dockerimage update Debian12 (#414) --- docker/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 701a4199..e056e946 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:lts-buster +FROM node:lts-bookworm LABEL maintainer="Coderaiser" RUN mkdir -p /usr/src/app @@ -15,9 +15,9 @@ COPY . /usr/src/app WORKDIR / -ENV cloudcmd_terminal true -ENV cloudcmd_terminal_path gritty -ENV cloudcmd_open false +ENV cloudcmd_terminal=true +ENV cloudcmd_terminal_path=gritty +ENV cloudcmd_open=false EXPOSE 8000 From 79fb49479e38240109a55708902d47788a9d5031 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 3 Jul 2024 12:01:49 +0000 Subject: [PATCH 0481/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .madrun.mjs | 2 +- bin/release.mjs | 2 +- client/cloudcmd.js | 3 ++- server/columns.spec.mjs | 2 +- server/distribute/export.spec.mjs | 2 +- server/distribute/import.mjs | 2 +- server/distribute/import.spec.mjs | 2 +- server/themes.spec.mjs | 2 +- server/user-menu.spec.mjs | 2 +- test/before.mjs | 6 +++--- test/rest/copy.mjs | 2 +- test/rest/move.mjs | 2 +- test/rest/pack.mjs | 4 ++-- test/server/console.mjs | 2 +- 14 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.madrun.mjs b/.madrun.mjs index 428eec7a..0cc7a5ec 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -1,5 +1,5 @@ -import {run, cutEnv} from 'madrun'; import process from 'node:process'; +import {run, cutEnv} from 'madrun'; const testEnv = { THREAD_IT_COUNT: 0, diff --git a/bin/release.mjs b/bin/release.mjs index e9ac53d9..1c12c20e 100755 --- a/bin/release.mjs +++ b/bin/release.mjs @@ -1,13 +1,13 @@ #!/usr/bin/env node import {promisify} from 'node:util'; +import process from 'node:process'; import tryToCatch from 'try-to-catch'; import {createSimport} from 'simport'; import minor from 'minor'; import _place from 'place'; import rendy from 'rendy'; import shortdate from 'shortdate'; -import process from 'node:process'; const simport = createSimport(import.meta.url); const place = promisify(_place); diff --git a/client/cloudcmd.js b/client/cloudcmd.js index 937f6d77..47019e55 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -10,7 +10,7 @@ const {registerSW, listenSW} = require('./sw/register'); const isDev = process.env.NODE_ENV === 'development'; -module.exports = window.CloudCmd = async (config) => { +module.exports = async (config) => { window.Util = require('../common/util'); window.CloudFunc = require('../common/cloudfunc'); @@ -27,6 +27,7 @@ module.exports = window.CloudCmd = async (config) => { window.CloudCmd.init(prefix, config); }; +window.CloudCmd = module.exports; function getPrefix(prefix) { if (!prefix) diff --git a/server/columns.spec.mjs b/server/columns.spec.mjs index 1e62f5f7..8ddcd54c 100644 --- a/server/columns.spec.mjs +++ b/server/columns.spec.mjs @@ -1,7 +1,7 @@ import {dirname} from 'node:path'; import {fileURLToPath} from 'node:url'; -import test from 'supertape'; import fs from 'node:fs'; +import test from 'supertape'; import {getColumns, isDev} from './columns.mjs'; const __filename = fileURLToPath(import.meta.url); diff --git a/server/distribute/export.spec.mjs b/server/distribute/export.spec.mjs index db65638d..e6dd1f8a 100644 --- a/server/distribute/export.spec.mjs +++ b/server/distribute/export.spec.mjs @@ -1,7 +1,7 @@ -import Config from '../config.js'; import {once} from 'node:events'; import test from 'supertape'; import io from 'socket.io-client'; +import Config from '../config.js'; import {connect} from '../../test/before.mjs'; const config = Config.createConfig(); diff --git a/server/distribute/import.mjs b/server/distribute/import.mjs index 72ce438d..f776abc0 100644 --- a/server/distribute/import.mjs +++ b/server/distribute/import.mjs @@ -3,9 +3,9 @@ import wraptile from 'wraptile'; import squad from 'squad'; import fullstore from 'fullstore'; import io from 'socket.io-client'; +import _forEachKey from 'for-each-key'; import log from './log.mjs'; import env from '../env.js'; -import _forEachKey from 'for-each-key'; const noop = () => {}; const forEachKey = currify(_forEachKey); diff --git a/server/distribute/import.spec.mjs b/server/distribute/import.spec.mjs index 9df6f846..9823aaff 100644 --- a/server/distribute/import.spec.mjs +++ b/server/distribute/import.spec.mjs @@ -1,6 +1,6 @@ import process from 'node:process'; -import test from 'supertape'; import {promisify} from 'node:util'; +import test from 'supertape'; import tryToCatch from 'try-to-catch'; import {connect} from '../../test/before.mjs'; import {createConfigManager} from '../cloudcmd.mjs'; diff --git a/server/themes.spec.mjs b/server/themes.spec.mjs index 6c828343..e88a3ec9 100644 --- a/server/themes.spec.mjs +++ b/server/themes.spec.mjs @@ -1,7 +1,7 @@ import {dirname} from 'node:path'; import {fileURLToPath} from 'node:url'; -import test from 'supertape'; import fs from 'node:fs'; +import test from 'supertape'; import {getThemes, isDev} from './theme.mjs'; const __filename = fileURLToPath(import.meta.url); diff --git a/server/user-menu.spec.mjs b/server/user-menu.spec.mjs index 7ac64f97..0125bd9e 100644 --- a/server/user-menu.spec.mjs +++ b/server/user-menu.spec.mjs @@ -1,10 +1,10 @@ import {dirname, join} from 'node:path'; import {fileURLToPath} from 'node:url'; +import {readFileSync} from 'node:fs'; import {test, stub} from 'supertape'; import serveOnce from 'serve-once'; import threadIt from 'thread-it'; import userMenu from './user-menu.mjs'; -import {readFileSync} from 'node:fs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); diff --git a/test/before.mjs b/test/before.mjs index 2c15bdd3..6e6e3f99 100644 --- a/test/before.mjs +++ b/test/before.mjs @@ -1,13 +1,13 @@ import process from 'node:process'; import http from 'node:http'; import os from 'node:os'; +import {promisify} from 'node:util'; +import {fileURLToPath} from 'node:url'; +import {dirname} from 'node:path'; import express from 'express'; import {Server} from 'socket.io'; import writejson from 'writejson'; import readjson from 'readjson'; -import {promisify} from 'node:util'; -import {fileURLToPath} from 'node:url'; -import {dirname} from 'node:path'; import cloudcmd from '../server/cloudcmd.mjs'; const __filename = fileURLToPath(import.meta.url); diff --git a/test/rest/copy.mjs b/test/rest/copy.mjs index 3c673b7b..98e8ea4d 100644 --- a/test/rest/copy.mjs +++ b/test/rest/copy.mjs @@ -1,7 +1,7 @@ import {dirname, join} from 'node:path'; import {fileURLToPath} from 'node:url'; -import serveOnce from 'serve-once'; import {mkdirSync} from 'node:fs'; +import serveOnce from 'serve-once'; import test from 'supertape'; import {rimraf} from 'rimraf'; import cloudcmd from '../../server/cloudcmd.mjs'; diff --git a/test/rest/move.mjs b/test/rest/move.mjs index ee7d1637..e962e5f0 100644 --- a/test/rest/move.mjs +++ b/test/rest/move.mjs @@ -1,5 +1,5 @@ -import wait from '@iocmd/wait'; import {EventEmitter} from 'node:events'; +import wait from '@iocmd/wait'; import {test, stub} from 'supertape'; import serveOnce from 'serve-once'; import cloudcmd from '../../server/cloudcmd.mjs'; diff --git a/test/rest/pack.mjs b/test/rest/pack.mjs index 61332949..5b9c2210 100644 --- a/test/rest/pack.mjs +++ b/test/rest/pack.mjs @@ -1,13 +1,13 @@ import fs from 'node:fs'; import {join, dirname} from 'node:path'; import {promisify} from 'node:util'; +import {fileURLToPath} from 'node:url'; import test from 'supertape'; import tar from 'tar-stream'; import gunzip from 'gunzip-maybe'; import pullout from 'pullout'; -import cloudcmd from '../../server/cloudcmd.mjs'; import serveOnce from 'serve-once'; -import {fileURLToPath} from 'node:url'; +import cloudcmd from '../../server/cloudcmd.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); diff --git a/test/server/console.mjs b/test/server/console.mjs index cf42d5bd..266cce14 100644 --- a/test/server/console.mjs +++ b/test/server/console.mjs @@ -1,8 +1,8 @@ import path, {dirname} from 'node:path'; import {once} from 'node:events'; -import test from 'supertape'; import {fileURLToPath} from 'node:url'; import {createRequire} from 'node:module'; +import test from 'supertape'; import io from 'socket.io-client'; import {connect} from '../before.mjs'; From 6abf327d0d25f88a709a35ce2a4360a04b62f185 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 3 Jul 2024 15:02:39 +0300 Subject: [PATCH 0482/1230] feature: cloudcmd: package-json v10.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e6ac9bd..01df5b74 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "once": "^1.4.0", "onezip": "^6.0.1", "open": "^10.0.3", - "package-json": "^9.0.0", + "package-json": "^10.0.0", "ponse": "^7.0.0", "pullout": "^5.0.0", "putout": "^35.0.0", From d8451e56aaa0a0cafae23720e4669a6254fe0a2b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 3 Jul 2024 15:03:42 +0300 Subject: [PATCH 0483/1230] feature: cloudcmd: just-pascal-case v3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 01df5b74..d204d2e0 100644 --- a/package.json +++ b/package.json @@ -181,7 +181,7 @@ "html-webpack-plugin": "^4.0.1", "inherits": "^2.0.3", "just-capitalize": "^1.0.0", - "just-pascal-case": "^1.1.0", + "just-pascal-case": "^3.2.0", "limier": "^3.0.0", "load.js": "^3.0.0", "madrun": "^10.0.0", From 4cc47e30de98712f7991a0c4f08f0a34a2643b56 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 3 Jul 2024 15:03:54 +0300 Subject: [PATCH 0484/1230] feature: cloudcmd: just-capitalize v3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d204d2e0..7ac0f511 100644 --- a/package.json +++ b/package.json @@ -180,7 +180,7 @@ "html-looks-like": "^1.0.2", "html-webpack-plugin": "^4.0.1", "inherits": "^2.0.3", - "just-capitalize": "^1.0.0", + "just-capitalize": "^3.2.0", "just-pascal-case": "^3.2.0", "limier": "^3.0.0", "load.js": "^3.0.0", From ba2d0b36af8ceff7f37795e9fa1115d46071a9a0 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 3 Jul 2024 15:03:59 +0300 Subject: [PATCH 0485/1230] feature: cloudcmd: just-snake-case v3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ac0f511..12ea387b 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "jaguar": "^6.0.0", "jju": "^1.3.0", "jonny": "^3.0.0", - "just-snake-case": "^1.1.0", + "just-snake-case": "^3.2.0", "markdown-it": "^14.0.0", "mellow": "^3.0.0", "nano-memoize": "^3.0.16", From b5e9ae5ad9ec57b70e4c183586ee29ae9f10e66d Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 3 Jul 2024 16:09:41 +0300 Subject: [PATCH 0486/1230] chore: cloudcmd: v17.4.2 --- ChangeLog | 10 ++++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index bae03a7f..82b6bf51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2024.07.03, v17.4.2 + +feature: +- ba2d0b36 cloudcmd: just-snake-case v3.2.0 +- 4cc47e30 cloudcmd: just-capitalize v3.2.0 +- d8451e56 cloudcmd: just-pascal-case v3.2.0 +- 6abf327d cloudcmd: package-json v10.0.0 +- 2ae6ad34 docker: Dockerimage update Debian12 (#414) +- 05ef0ae4 cloudcmd: c8 v10.1.2 + 2024.05.06, v17.4.1 feature: diff --git a/HELP.md b/HELP.md index 1d44b4b0..d5477ce2 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.1 +# Cloud Commander v17.4.2 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.07.03*, **[v17.4.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.2)** - *2024.05.06*, **[v17.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.1)** - *2024.04.17*, **[v17.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.0)** - *2024.04.03*, **[v17.3.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.3.3)** diff --git a/README.md b/README.md index 63158df4..34bc9fa5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.4.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 12ea387b..c4a9b04a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.4.1", + "version": "17.4.2", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 61ca7f36a449cdd5f97659467aeafde856bab9e1 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 19 Jul 2024 17:34:06 +0300 Subject: [PATCH 0487/1230] feature: cloudcmd: putout v36.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4a9b04a..5fd6f969 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "package-json": "^10.0.0", "ponse": "^7.0.0", "pullout": "^5.0.0", - "putout": "^35.0.0", + "putout": "^36.0.2", "redzip": "^3.0.0", "rendy": "^4.1.3", "restafary": "^12.0.0", From 6e8348b8437a4cf997652b84a5b9399097615725 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 19 Jul 2024 17:34:34 +0300 Subject: [PATCH 0488/1230] feature: cloudcmd: rimraf v6.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5fd6f969..5a5bab1b 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,7 @@ "readjson": "^2.0.1", "redlint": "^3.13.1", "request": "^2.76.0", - "rimraf": "^5.0.1", + "rimraf": "^6.0.1", "scroll-into-view-if-needed": "^3.0.4", "serve-once": "^3.0.1", "serviceworker-webpack-plugin": "^1.0.1", From d70362fbf13654135b56d0e821044856bd56216a Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 19 Jul 2024 18:15:40 +0300 Subject: [PATCH 0489/1230] chore: npmvrc: add --- .nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..1efe0ac6 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.15.1 From 3140b7f99866a8c6b3277991f8c61e232fb756e1 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Sat, 27 Jul 2024 15:54:10 +0300 Subject: [PATCH 0490/1230] chore: cloudcmd: v17.4.3 --- ChangeLog | 6 ++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82b6bf51..0d84fe2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024.07.27, v17.4.3 + +feature: +- 6e8348b8 cloudcmd: rimraf v6.0.1 +- 61ca7f36 cloudcmd: putout v36.0.2 + 2024.07.03, v17.4.2 feature: diff --git a/HELP.md b/HELP.md index d5477ce2..d2d40555 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.2 +# Cloud Commander v17.4.3 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.07.27*, **[v17.4.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.3)** - *2024.07.03*, **[v17.4.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.2)** - *2024.05.06*, **[v17.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.1)** - *2024.04.17*, **[v17.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.0)** diff --git a/README.md b/README.md index 34bc9fa5..a98e59aa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.4.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 5a5bab1b..5eb9ecd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.4.2", + "version": "17.4.3", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From a6aa9bbc4481d2a9f0d060d6215d9c4b34fbb71e Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 11:46:51 +0300 Subject: [PATCH 0491/1230] fix: revert rimraf v6.0.1 This reverts commit 6e8348b8437a4cf997652b84a5b9399097615725. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5eb9ecd8..5c1c6804 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,7 @@ "readjson": "^2.0.1", "redlint": "^3.13.1", "request": "^2.76.0", - "rimraf": "^6.0.1", + "rimraf": "^5.0.1", "scroll-into-view-if-needed": "^3.0.4", "serve-once": "^3.0.1", "serviceworker-webpack-plugin": "^1.0.1", From 282b3d5cca7dad3c20e50ab4d465ff8b6d3da19e Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 11:47:20 +0300 Subject: [PATCH 0492/1230] feature: cloudcmd: @putout/cli-validate-args v2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5c1c6804..3dd3e152 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "@cloudcmd/fileop": "^8.0.0", "@cloudcmd/move-files": "^8.0.0", "@cloudcmd/read-files-sync": "^2.0.0", - "@putout/cli-validate-args": "^1.0.1", + "@putout/cli-validate-args": "^2.0.0", "@putout/plugin-cloudcmd": "^3.1.1", "apart": "^2.0.0", "chalk": "^4.0.0", From 544e30dbf8d0f04842797ea177b61213526809b9 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 11:48:11 +0300 Subject: [PATCH 0493/1230] chore: cloudcmd: v17.4.4 --- ChangeLog | 8 ++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0d84fe2d..996c17f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2024.08.16, v17.4.4 + +fix: +- a6aa9bbc revert rimraf v6.0.1 + +feature: +- 282b3d5c cloudcmd: @putout/cli-validate-args v2.0.0 + 2024.07.27, v17.4.3 feature: diff --git a/HELP.md b/HELP.md index d2d40555..28bc97b5 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.3 +# Cloud Commander v17.4.4 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.08.16*, **[v17.4.4](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.4)** - *2024.07.27*, **[v17.4.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.3)** - *2024.07.03*, **[v17.4.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.2)** - *2024.05.06*, **[v17.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.1)** diff --git a/README.md b/README.md index a98e59aa..e7b0cee2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.3 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v17.4.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 3dd3e152..f53f42f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.4.3", + "version": "17.4.4", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 74d1eb7e2859032b9536f176993a6e83b5d601a7 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:05:52 +0300 Subject: [PATCH 0494/1230] feature: drop support of node < 20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f53f42f7..6ba787b5 100644 --- a/package.json +++ b/package.json @@ -215,7 +215,7 @@ "webpackbar": "^5.0.0-3" }, "engines": { - "node": ">=18" + "node": ">=20" }, "license": "MIT", "publishConfig": { From 5e93bcca1e31bd4e2b87aa610cdd0a25c1e34d0f Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:06:47 +0300 Subject: [PATCH 0495/1230] feature: cloudcmd: rimraf v6.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ba787b5..f6eedc46 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,7 @@ "readjson": "^2.0.1", "redlint": "^3.13.1", "request": "^2.76.0", - "rimraf": "^5.0.1", + "rimraf": "^6.0.1", "scroll-into-view-if-needed": "^3.0.4", "serve-once": "^3.0.1", "serviceworker-webpack-plugin": "^1.0.1", From 88df2f05185b7dc74ddb3b03a510ec422b90afbe Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:08:02 +0300 Subject: [PATCH 0496/1230] chore: actions: node v22 --- .github/workflows/docker.yml | 4 ++-- .github/workflows/nodejs.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f26b3755..6e22e4f0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -15,10 +15,10 @@ jobs: - uses: oven-sh/setup-bun@v1 with: bun-version: latest - - name: Use Node.js 18.x + - name: Use Node.js 22.x uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 22.x - name: Install Redrun run: bun i yarn redrun -g --no-save - name: NPM Install diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 9dc3035e..8bdc6cc0 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -9,8 +9,8 @@ jobs: strategy: matrix: node-version: - - 18.x - 20.x + - 22.x steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 From b63d6fccdebae3ecb2d55560b48a08ffcc38502e Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:12:56 +0300 Subject: [PATCH 0497/1230] chore: lint --- .putout.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.putout.json b/.putout.json index 1d2b1379..fa70da30 100644 --- a/.putout.json +++ b/.putout.json @@ -7,13 +7,7 @@ "fontello.json" ], "rules": { - "github/convert-npm-to-bun": "off", - "github/set-node-versions": ["on", { - "versions": [ - "18.x", - "20.x" - ] - }] + "github/convert-npm-to-bun": "off" }, "match": { "base64": { From 9109511e95bb9e9bbc8504c48b2abed616fd6a94 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:15:19 +0300 Subject: [PATCH 0498/1230] chore: lint --- .putout.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.putout.json b/.putout.json index fa70da30..9d6789b6 100644 --- a/.putout.json +++ b/.putout.json @@ -1,5 +1,7 @@ { - "plugins": ["cloudcmd"], + "plugins": [ + "cloudcmd" + ], "ignore": [ "html", "fixture*", @@ -7,7 +9,8 @@ "fontello.json" ], "rules": { - "github/convert-npm-to-bun": "off" + "github/convert-npm-to-bun": "off", + "github/set-node-versions": "off" }, "match": { "base64": { @@ -47,4 +50,4 @@ "merge-duplicate-functions": "off" } } -} +} \ No newline at end of file From ac3f20c5d1129da99b237e135a638806edffcc60 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 12:15:44 +0300 Subject: [PATCH 0499/1230] chore: cloudcmd: v18.0.0 --- ChangeLog | 6 ++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 996c17f4..08ce9e43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024.08.16, v18.0.0 + +feature: +- 5e93bcca cloudcmd: rimraf v6.0.1 +- 74d1eb7e drop support of node < 20 + 2024.08.16, v17.4.4 fix: diff --git a/HELP.md b/HELP.md index 28bc97b5..3c9cea75 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.4 +# Cloud Commander v18.0.0 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.08.16*, **[v18.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.0)** - *2024.08.16*, **[v17.4.4](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.4)** - *2024.07.27*, **[v17.4.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.3)** - *2024.07.03*, **[v17.4.2](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.2)** diff --git a/README.md b/README.md index e7b0cee2..e2f26870 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v17.4.4 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.0.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index f6eedc46..419de4d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "17.4.4", + "version": "18.0.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 75a75365cf5859af30f33b6c8075ab78b037b37f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 16 Aug 2024 09:17:21 +0000 Subject: [PATCH 0500/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .putout.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.putout.json b/.putout.json index 9d6789b6..dcaac97f 100644 --- a/.putout.json +++ b/.putout.json @@ -1,7 +1,5 @@ { - "plugins": [ - "cloudcmd" - ], + "plugins": ["cloudcmd"], "ignore": [ "html", "fixture*", @@ -50,4 +48,4 @@ "merge-duplicate-functions": "off" } } -} \ No newline at end of file +} From 62ed8411ae0c1d454b75b7a73ef1840711ee934b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 14:53:03 +0300 Subject: [PATCH 0501/1230] fix: bin: validateArgs is not a function (#147) --- bin/cloudcmd.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 4ea301ac..6551c50b 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -164,7 +164,7 @@ else main(); async function main() { - const validateArgs = await simport('@putout/cli-validate-args'); + const {validateArgs} = await simport('@putout/cli-validate-args'); const error = await validateArgs(args, [ ...yargsOptions.boolean, From 9ec94dee158587666db17b9d00f50dc1f1625cd6 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 14:54:05 +0300 Subject: [PATCH 0502/1230] feature: cloudcmd: chalk v5.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 419de4d4..dd5b848d 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "@putout/cli-validate-args": "^2.0.0", "@putout/plugin-cloudcmd": "^3.1.1", "apart": "^2.0.0", - "chalk": "^4.0.0", + "chalk": "^5.3.0", "compression": "^1.7.4", "console-io": "^14.0.0", "copymitter": "^9.0.0", From a522c49c1f9f5cbc2bfb7bdb16b98f232b9c38e0 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 14:54:54 +0300 Subject: [PATCH 0503/1230] chore: cloudcmd: v18.0.1 --- ChangeLog | 8 ++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 08ce9e43..5e7d4433 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2024.08.16, v18.0.1 + +fix: +- 62ed8411 bin: validateArgs is not a function (#147) + +feature: +- 9ec94dee cloudcmd: chalk v5.3.0 + 2024.08.16, v18.0.0 feature: diff --git a/HELP.md b/HELP.md index 3c9cea75..50d01d0f 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.0.0 +# Cloud Commander v18.0.1 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.08.16*, **[v18.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.1)** - *2024.08.16*, **[v18.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.0)** - *2024.08.16*, **[v17.4.4](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.4)** - *2024.07.27*, **[v17.4.3](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.3)** diff --git a/README.md b/README.md index e2f26870..f2a7d93b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.0.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.0.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index dd5b848d..bd7e40d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.0.0", + "version": "18.0.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 3d03efbe63509f5aa34977b2c004f6f0aa65cc1f Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 16 Aug 2024 17:17:44 +0300 Subject: [PATCH 0504/1230] feature: css: show links in one small screens --- css/query.css | 14 ++++++++------ font/fontello.eot | Bin 14436 -> 14284 bytes font/fontello.json | 12 ++++++++++++ font/fontello.svg | 8 +++++--- font/fontello.ttf | Bin 14268 -> 14116 bytes font/fontello.woff | Bin 8796 -> 8716 bytes font/fontello.woff2 | Bin 7360 -> 7272 bytes 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/css/query.css b/css/query.css index 6b7c98a4..6e07a0c7 100644 --- a/css/query.css +++ b/css/query.css @@ -129,15 +129,14 @@ color: white; } - .file::before, - .file-link::before { + .file::before { color: rgb(26 224 124 / 56%); content: '\e80d'; } - .current-file .file::before, .file-link::before { - color: white; + color: rgb(26 224 124 / 56%); + content: '\e81d'; } /* меняем иконки на шрифтовые */ @@ -160,11 +159,14 @@ display: inline-block; } - .directory::before, - .directory-link::before { + .directory::before { content: '\e807'; } + .directory-link::before { + content: '\e81e'; + } + .file, .file-link { background-image: none; diff --git a/font/fontello.eot b/font/fontello.eot index c6b5875af90f3191bb1f67a76c6b4daa763f52e6..99e28f3eeb1447890525b7be9bb7cf15c795b07c 100644 GIT binary patch delta 1012 zcmYjQQD{?F829Gl$1o`%9;>|uyA(AT~AG%6??J`Bg$+#rrIHqZw}6aNz(+kyZ7=ljn8 zpa1{PIrq29=90SU09Y4QN4b(3yLB;pzGjW@1HefDI5t;yD}NNMZwX%o;Ktl?HAXy* zREa*p6P03lcGtuA2%jYwD7vRB#CH%rPTpTEojEbF_=O)pxegE&3-j*rLC2-N`ZsAk zvp|IZlJY&kc7?FDP_C{VU7l&(BO*n_T4`y{U3Hen2!BQRVA)-%pd0*&@SlWZr`+=V zjn8``lp6qGH!4e~tLt~(_yHh!hnilmyfa@}-PpT9wa$5$ahfZokruR2f zy`Q<*@;=4L(O3VAFQV3n%GfqOsvd~csATIQZ}2G?fc=oqzM4W5VPxp+VhW3+swjC7 zDAqw?DpS-oP&rfiD%E5PvZCyjzX_bfjO=^jrJlrSCNbg@y*qH5A-2c+lcQlf@Sny>k8 z!p4k+HxstzxBS{|GosHnKUF)FtPoh5)y*LGh78PKYv-7II@!E@9b~u0 zQded|`yN1uHzfV*?;-jPp83|J)=71eE}MQ4DHgmVRuW_0S?i4Vk98;({4ylpp4=%0 zAApa%Jd_w5hL31=!JA4vK-)W<+(5hDN{%Dtj;CH>7_Xm8>Dc8jojmpS(ELg@@b6^E MEmfg@`NiwOr&;sNd;kCd delta 1152 zcmcIiPi)&{6o1clY^QPTBu(s=wOKN^$<~CjHh+v*DVa2I)^s$q(pUg#WLcV~YN*v! zrJK5>w}BXchLPZc;D9PltW~5Q5EoR~i6K;RLBIte)LjrrR2ov(@{)}M5;w%t_r9Nh zzxTfH`PuKQ`JXMv#YX`?yWuc6ZR_gw8<|%d;nP0?U>*R@mTE<7;`3i^;vWOBd}(Ph zL^|0qjy8GPs?;tF{&|JCpQuzRUb0B{036*T6f1L=r@ue3u>`=a0|al)l#3U86XTNr z`ZC4SGbD%~aNEQw4t+DV#pQDgFCW|?;ad_`=H^Sq`Q*|r#qz{6wc@gc8}dH!w}^*c zD%Q%k-|y-sP8Tq@t@%rfXV5^-lcnx{JuE|Sn@bIwTN##h`mB;D=SXe(bhS5p`F9E^qpS&9p((B@b>S_-M3kn zB2f^q)n&_q&AaR@Hs>5Cdm2uFgITsfrCAWb1q$de00xY~6uy>m^&v<&ehPh<%dI=} z=Q1z4Nns>d00t$-($K*RyhB*^b}@pF7kqVa$|!+Tsss>$W09+Ls0`~u-of$}@PWV6 z=dV75o#0VAJ=I1xDx#=7OQ4A7K~%(vL%DSy6)OIt5Z3=|rGF`ux!`Wx?}k}zxAT8g zDHJlN#&fZlB#9zNKQTX%n;M@wZ9etn=;JY?5i`=MWMX(|Fdpd-2fI~Ckrdf2x(_J6u6Vk?yaG{rO1P$%wxx8MgP=1Zp!<=sXZz!8qC&AlV88OrJYwsc0plxTJ!ot zi7Wh#_ItX4hwX3l%l4VRlRZkQedsV;1Da$q2GUT4*Xij?`;)$19I`*^-^8Kj^N}&6 fb8FGj<}Xnfx~1vrT>0VRLTRSDRBnpLzL5U{YQ5D) diff --git a/font/fontello.json b/font/fontello.json index 354b93cc..22f82f33 100644 --- a/font/fontello.json +++ b/font/fontello.json @@ -180,6 +180,18 @@ "code": 59420, "src": "fontawesome" }, + { + "uid": "e15f0d620a7897e2035c18c80142f6d9", + "css": "link-ext", + "code": 59421, + "src": "fontawesome" + }, + { + "uid": "e35de5ea31cd56970498e33efbcb8e36", + "css": "link-ext-alt", + "code": 59422, + "src": "fontawesome" + }, { "uid": "60617c8adc1e7eb3c444a5491dd13f57", "css": "attention-circled-1", diff --git a/font/fontello.svg b/font/fontello.svg index 4564f981..d12c9f1e 100644 --- a/font/fontello.svg +++ b/font/fontello.svg @@ -1,7 +1,7 @@ -Copyright (C) 2021 by original authors @ fontello.com +Copyright (C) 2024 by original authors @ fontello.com @@ -64,7 +64,9 @@ - + + + - \ No newline at end of file + diff --git a/font/fontello.ttf b/font/fontello.ttf index 4fc26184e1cd73e9158c547a0f354069f042bb85..2499b12693af1766c6fabf8e515a8d4ed73118da 100644 GIT binary patch delta 985 zcmYjQU1$?a6h3EWcN2GG($sZZX__W&{;1ZLbes5ltp-IU(kg=1htzGYsWoYXhFV3M zK3M!gxn6SNK3(obMMPB8K%WF(d=dpk@j(>CABf_kf(j;{iHZ)KJ@b8Y&Ybhj%-))~ zFn-ow2y9*jfc*fldpK+5-lYP!310```tW4lM?8&4hCa@{xpa1D>E|Paj}mmGt%Et@ z>j>{5Z%=0q@9i5qZwHX>0C<(r5o=F-+@if&@6mc}lnDEO(j$O2iEv;vo1fY_Iaqy5 zM1+W$%*3!Y9iLoA_!8lDS!*hXmh(B`_k?}pR(9n6zfB&>bpWvYxru}M*=O4y1B9MY z)3dn)Bf06hm2*_<#9yBVxWr4v?YL&Z%ePg>U>Cmv|Iju__G>Vj%4D2u2^n>UXMe<; zB348%A+OeW2~xEfN$_QF@ilJ2mQoj+kMoYvf*38O4SWpMvR4Gu@O5der$BY8pLv;Y zgD|XtWbdX3qT)t|@uf^+ev~CC2?{E+ATgOq@(jqF$$Xj$F$q~(G{|=V=P)Rm?OV|l z?1=@tZA$ZET&OE;{?<^B+lHB*Iw*3G~n1Q7>ZpQ@XtyKrAA7!4yM6{Dv7H~iQ^h$go8y8 zB@wZ?rBeS=?IEWqhx{nFfGlx{a*0TCOAjcQs_msGB2`rmMQSAi89V8rQg2m9Z{D}x zH}l@??9S~A59hB1Yrzx00AL0HPUXwF%EY7JE#mh8SU$hB7$BYOU5+++x>78kANcDs zaSu_cn7ddZ-38FMODGoSE=~V*WPJ&MTLbVvohjr#?~IO50_e*WPt1@Y-sHB3QyjWy z%8Scq7QWbjLBewqR_5mOx%t@A4#hIWljYoU1=r<0;@5}=F67FEXE)l~iPHtlv&#I% z#Zz}TuLAV0(o0{iEEFo$jUyWXM&SEDvn;af)+hMk$DQot{w#dTPQrD%2Fc%;jesSO zkW+{F?c3Owq&Bi5ge^^-gU^~dTtnaPw0^^nD22Z@%AiUCi5#%eWW)UR3_FYU$J}T~ z%?_|X%Vw!G3j#Pm0Ui3mfH9cDuab^#1PRBFqKfJCnmuzSdCo}+Bf$bNC@~cu+IWGt z39IflMo@V{t%6-f3G7nQiwGQxT(L!CSO@YpmM?+|o>tXUdIwvR;W@_(OEDv*;>Pf~X8D_+( zrv3f>!+lJISuxF2DrGkJA6>DwSJmbf>R&mw^YZKK+t)M<4A_ z^36jB;VRH1lQEEh5`05XPb|KB2M4X)?hPEQ*L%j0&h3Rp>La}lbV}2uxx#z7h5Sru LsZc-H_gH=nirmf1 diff --git a/font/fontello.woff b/font/fontello.woff index 16fa9d71203ef2b7d396e36e65551d2e5d8ecccf..0b73db1b01f1306ead83088bd13ba51ef2112d89 100644 GIT binary patch delta 6566 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 diff --git a/font/fontello.woff2 b/font/fontello.woff2 index 8b7b62f023217c7ff1966dbd151c423110fa5453..23125c95c06acb6ec8cc8187494fdcebe5b01fb7 100644 GIT binary patch literal 7272 zcmV-u9GByFPew8T0RR91032ul4*&oF05>E602~ki0RR9100000000000000000000 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 Cu>2SR literal 7360 zcmV;x96#fCPew8T0RR91035&o4*&oF05`k<032oj0RR9100000000000000000000 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 Date: Fri, 16 Aug 2024 17:18:24 +0300 Subject: [PATCH 0505/1230] chore: cloudcmd: v18.0.2 --- ChangeLog | 5 +++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e7d4433..a0cf7422 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024.08.16, v18.0.2 + +feature: +- 3d03efbe css: show links in one small screens + 2024.08.16, v18.0.1 fix: diff --git a/HELP.md b/HELP.md index 50d01d0f..ee18c39a 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.0.1 +# Cloud Commander v18.0.2 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1095,6 +1095,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2024.08.16*, **[v18.0.2](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.2)** - *2024.08.16*, **[v18.0.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.1)** - *2024.08.16*, **[v18.0.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.0.0)** - *2024.08.16*, **[v17.4.4](//github.com/coderaiser/cloudcmd/releases/tag/v17.4.4)** diff --git a/README.md b/README.md index f2a7d93b..f7281055 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.0.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.0.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index bd7e40d3..91d7d7c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.0.1", + "version": "18.0.2", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From ddf4542b75a42ba9dce2eab6142c1b6323842cc3 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Sat, 17 Aug 2024 13:10:43 +0300 Subject: [PATCH 0506/1230] feature: cloudcmd: add ability to hide dot files (#307) --- HELP.md | 245 ++++++++++++++++++++------------------- bin/cloudcmd.mjs | 3 + client/client.js | 14 ++- client/key/index.js | 13 +++ common/cloudfunc.js | 9 ++ common/cloudfunc.spec.js | 33 ++++++ json/config.json | 1 + json/help.json | 2 + man/cloudcmd.1 | 2 + server/route.mjs | 1 + tmpl/config.hbs | 6 + 11 files changed, 203 insertions(+), 126 deletions(-) diff --git a/HELP.md b/HELP.md index ee18c39a..fa3eae4b 100644 --- a/HELP.md +++ b/HELP.md @@ -59,78 +59,79 @@ cloudcmd Cloud Commander supports the following command-line parameters: -|Parameter |Operation -|:------------------------------|:------------------------------ -| `-h, --help` | display help and exit -| `-v, --version` | display version and exit -| `-s, --save` | save configuration -| `-o, --online` | load scripts from remote servers -| `-a, --auth` | enable authorization -| `-u, --username` | set username -| `-p, --password` | set password -| `-c, --config` | configuration file path -| `--show-config` | show config values -| `--show-file-name` | show file name in view and edit -| `--editor` | set editor: "dword", "edward" or "deepword" -| `--packer` | set packer: "tar" or "zip" -| `--root` | set root directory -| `--prefix` | set url prefix -| `--prefix-socket` | set prefix for url connection -| `--port` | set port number -| `--confirm-copy` | confirm copy -| `--confirm-move` | confirm move -| `--open` | open web browser when server starts -| `--name` | set tab name in web browser -| `--one-file-panel` | show one file panel -| `--keys-panel` | show keys panel -| `--contact` | enable contact -| `--config-dialog` | enable config dialog -| `--config-auth` | enable auth change in config dialog -| `--console` | enable console -| `--sync-console-path` | sync console path -| `--terminal` | enable terminal -| `--terminal-path` | set terminal path -| `--terminal-command` | set command to run in terminal (shell by default) -| `--terminal-auto-restart` | restart command on exit -| `--vim` | enable vim hot keys -| `--columns` | set visible columns -| `--theme` | set theme 'light' or 'dark'" -| `--export` | enable export of config through a server -| `--export-token` | authorization token used by export server -| `--import` | enable import of config -| `--import-token` | authorization token used to connect to export server -| `--import-url` | url of an import server -| `--import-listen` | enable listen on config updates from import server -| `--dropbox` | enable dropbox integration -| `--dropbox-token` | set dropbox token -| `--log` | enable logging -| `--no-show-config` | do not show config values -| `--no-server` | do not start server -| `--no-auth` | disable authorization -| `--no-online` | load scripts from local server -| `--no-open` | do not open web browser when server started -| `--no-name` | set default tab name in web browser -| `--no-keys-panel` | hide keys panel -| `--no-one-file-panel` | show two file panels -| `--no-confirm-copy` | do not confirm copy -| `--no-confirm-move` | do not confirm move -| `--no-config-dialog` | disable config dialog -| `--no-config-auth` | disable auth change in config dialog -| `--no-console` | disable console -| `--no-sync-console-path` | do not sync console path -| `--no-contact` | disable contact -| `--no-terminal` | disable terminal -| `--no-terminal-command` | set default shell to run in terminal -| `--no-terminal-auto-restart` | do not restart command on exit -| `--no-vim` | disable vim hot keys +| Parameter |Operation +|:-----------------------------|:------------------------------ +| `-h, --help` | display help and exit +| `-v, --version` | display version and exit +| `-s, --save` | save configuration +| `-o, --online` | load scripts from remote servers +| `-a, --auth` | enable authorization +| `-u, --username` | set username +| `-p, --password` | set password +| `-c, --config` | configuration file path +| `--show-config` | show config values +| `--show-dot-files` | show dot files +| `--show-file-name` | show file name in view and edit +| `--editor` | set editor: "dword", "edward" or "deepword" +| `--packer` | set packer: "tar" or "zip" +| `--root` | set root directory +| `--prefix` | set url prefix +| `--prefix-socket` | set prefix for url connection +| `--port` | set port number +| `--confirm-copy` | confirm copy +| `--confirm-move` | confirm move +| `--open` | open web browser when server starts +| `--name` | set tab name in web browser +| `--one-file-panel` | show one file panel +| `--keys-panel` | show keys panel +| `--contact` | enable contact +| `--config-dialog` | enable config dialog +| `--config-auth` | enable auth change in config dialog +| `--console` | enable console +| `--sync-console-path` | sync console path +| `--terminal` | enable terminal +| `--terminal-path` | set terminal path +| `--terminal-command` | set command to run in terminal (shell by default) +| `--terminal-auto-restart` | restart command on exit +| `--vim` | enable vim hot keys +| `--columns` | set visible columns +| `--theme` | set theme 'light' or 'dark'" +| `--export` | enable export of config through a server +| `--export-token` | authorization token used by export server +| `--import` | enable import of config +| `--import-token` | authorization token used to connect to export server +| `--import-url` | url of an import server +| `--import-listen` | enable listen on config updates from import server +| `--dropbox` | enable dropbox integration +| `--dropbox-token` | set dropbox token +| `--log` | enable logging +| `--no-show-config` | do not show config values +| `--no-server` | do not start server +| `--no-auth` | disable authorization +| `--no-online` | load scripts from local server +| `--no-open` | do not open web browser when server started +| `--no-name` | set default tab name in web browser +| `--no-keys-panel` | hide keys panel +| `--no-one-file-panel` | show two file panels +| `--no-confirm-copy` | do not confirm copy +| `--no-confirm-move` | do not confirm move +| `--no-config-dialog` | disable config dialog +| `--no-config-auth` | disable auth change in config dialog +| `--no-console` | disable console +| `--no-sync-console-path` | do not sync console path +| `--no-contact` | disable contact +| `--no-terminal` | disable terminal +| `--no-terminal-command` | set default shell to run in terminal +| `--no-terminal-auto-restart` | do not restart command on exit +| `--no-vim` | disable vim hot keys | `--no-themes` | set default visible themes -| `--no-export` | disable export config through a server -| `--no-import` | disable import of config -| `--no-import-listen` | disable listen on config updates from import server -| `--no-show-file-name` | do not show file name in view and edit -| `--no-dropbox` | disable dropbox integration -| `--no-dropbox-token` | unset dropbox token -| `--no-log` | disable logging +| `--no-export` | disable export config through a server +| `--no-import` | disable import of config +| `--no-import-listen` | disable listen on config updates from import server +| `--no-show-file-name` | do not show file name in view and edit +| `--no-dropbox` | disable dropbox integration +| `--no-dropbox-token` | unset dropbox token +| `--no-log` | disable logging For options not specified by command-line parameters, Cloud Commander then reads configuration data from `~/.cloudcmd.json`. It uses port `8000` by default. @@ -152,56 +153,57 @@ Then, start the server again with `cloudcmd` and reload the page. ## Hot keys -|Key |Operation -|:----------------------|:-------------------------------------------- -| `F1` | help -| `F2` | show `user menu` -| `F3` | view, change directory -| `Shift + F3` | view raw file, change directory -| `F4` | edit -| `F5` | copy -| `Alt` + `F5` | pack -| `F6` | rename/move -| `Shift` + `F6` | rename current file -| `F7` | new directory -| `Shift + F7` | new file -| `F8`, `Delete` | remove -| `Shift + Delete` | remove without prompt -| `F9` | menu -| `Alt` + `F9` | extract -| `F10` | config -| `*` | select/unselect all -| `+` | expand selection -| `-` | shrink selection -| `:` | open Command Line -| `Ctrl + X` | cut to buffer -| `Ctrl + C` | copy to buffer -| `Ctrl + V` | paste from buffer -| `Ctrl + Z` | clear buffer -| `Ctrl + P` | copy path -| `Ctrl + R` | refresh -| `Ctrl + D` | clear local storage -| `Ctrl + A` | select all files in a panel -| `Ctrl + M` | [rename selected files](https://github.com/coderaiser/cloudcmd/releases/tag/v12.1.0) in editor -| `Ctrl + U` | swap panels -| `Ctrl + F3` | sort by name -| `Ctrl + F5` | sort by date -| `Ctrl + F6` | sort by size -| `Up`, `Down` | file system navigation -| `Enter` | change directory/view file -| `Alt + Left/Right` | show content of directory under cursor in target panel -| `Alt + G` | go to directory -| `Ctrl + \` | go to the root directory -| `Tab` | move via panels -| `Page Up` | up on one page -| `Page Down` | down on one page -| `Home` | to begin of list -| `End` | to end of list -| `Space` | select current file (and get size of directory) -| `Insert` | select current file (and move to next) -| `F9` | context menu -| `~` | console -| `Esc` | toggle vim hotkeys (`file manager`, `editor`) +| Key |Operation +|:---------------------|:-------------------------------------------- +| `F1` | help +| `F2` | show `user menu` +| `F3` | view, change directory +| `Shift + F3` | view raw file, change directory +| `F4` | edit +| `F5` | copy +| `Alt` + `F5` | pack +| `F6` | rename/move +| `Shift` + `F6` | rename current file +| `F7` | new directory +| `Shift + F7` | new file +| `F8`, `Delete` | remove +| `Shift + Delete` | remove without prompt +| `F9` | menu +| `Alt` + `F9` | extract +| `F10` | config +| `*` | select/unselect all +| `+` | expand selection +| `-` | shrink selection +| `:` | open Command Line +| `Ctrl + X` | cut to buffer +| `Ctrl + C` | copy to buffer +| `Ctrl + V` | paste from buffer +| `Ctrl + Z` | clear buffer +| `Ctrl + P` | copy path +| `Ctrl + R` | refresh +| `Ctrl + D` | clear local storage +| `Ctrl + A` | select all files in a panel +| `Ctrl + M` | [rename selected files](https://github.com/coderaiser/cloudcmd/releases/tag/v12.1.0) in editor +| `Ctrl + U` | swap panels +| `Ctrl + F3` | sort by name +| `Ctrl + F5` | sort by date +| `Ctrl + F6` | sort by size +| `Ctrl + Command + .` | show/hide dot files +| `Up`, `Down` | file system navigation +| `Enter` | change directory/view file +| `Alt + Left/Right` | show content of directory under cursor in target panel +| `Alt + G` | go to directory +| `Ctrl + \` | go to the root directory +| `Tab` | move via panels +| `Page Up` | up on one page +| `Page Down` | down on one page +| `Home` | to begin of list +| `End` | to end of list +| `Space` | select current file (and get size of directory) +| `Insert` | select current file (and move to next) +| `F9` | context menu +| `~` | console +| `Esc` | toggle vim hotkeys (`file manager`, `editor`) ### Vim @@ -398,6 +400,7 @@ Here's a description of all options: "confirmCopy": true, // confirm copy "confirmMove": true, // confirm move "showConfig": false, // show config at startup + "showDotFiles": true, // show dot files "showFileName": false, // do not show file name in view and edit "contact": true, // enable contact "configDialog": true, // enable config dialog diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 6551c50b..0a7ec042 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -86,6 +86,7 @@ const yargsOptions = { 'confirm-copy', 'confirm-move', 'show-config', + 'show-dot-files', 'show-file-name', 'vim', 'keys-panel', @@ -124,6 +125,7 @@ const yargsOptions = { 'export': choose(env.bool('export'), config('export')), 'prefix-socket': config('prefixSocket'), + 'show-dot-files': choose(env.bool('show_dot_files'), config('showDotFiles')), 'show-file-name': choose(env.bool('show_file_name'), config('showFileName')), 'sync-console-path': choose(env.bool('sync_console_path'), config('syncConsolePath')), 'config-dialog': choose(env.bool('config_dialog'), config('configDialog')), @@ -189,6 +191,7 @@ async function main() { config('username', args.username); config('console', args.console); config('syncConsolePath', args.syncConsolePath); + config('showDotFiles', args.showDotFiles); config('showFileName', args.showFileName); config('contact', args.contact); config('terminal', args.terminal); diff --git a/client/client.js b/client/client.js index 4c4555ff..139dd002 100644 --- a/client/client.js +++ b/client/client.js @@ -103,6 +103,7 @@ function CloudCmdProto(DOM) { history, noCurrent, currentName, + showDotFiles: CloudCmd.config('showDotFiles'), }, panel); }; @@ -300,7 +301,6 @@ function CloudCmdProto(DOM) { * @param options * { refresh, history } - необходимость обновить данные о каталоге * @param panel - * @param callback * */ async function ajaxLoad(path, options = {}, panel) { @@ -348,13 +348,16 @@ function CloudCmdProto(DOM) { /** * Функция строит файловую таблицу - * @param json - данные о файлах + * @param data - данные о файлах * @param panelParam - * @param history - * @param callback + * @param options - history, noCurrent, showDotFiles */ async function createFileTable(data, panelParam, options) { - const {history, noCurrent} = options; + const { + history, + noCurrent, + showDotFiles, + } = options; const names = [ 'file', @@ -385,6 +388,7 @@ function CloudCmdProto(DOM) { data, id: panel.id, prefix, + showDotFiles, template: { file, path, diff --git a/client/key/index.js b/client/key/index.js index d7d455af..b0678601 100644 --- a/client/key/index.js +++ b/client/key/index.js @@ -509,6 +509,19 @@ async function switchKey(event) { event.preventDefault(); } + break; + + case KEY.DOT: + if (meta && shift) { + const showDotFiles = !CloudCmd.config('showDotFiles'); + CloudCmd._config('showDotFiles', showDotFiles); + CloudCmd.refresh(); + await DOM.RESTful.Config.write({ + showDotFiles, + }); + } + break; } } + diff --git a/common/cloudfunc.js b/common/cloudfunc.js index 39e422e7..4e4e09d7 100644 --- a/common/cloudfunc.js +++ b/common/cloudfunc.js @@ -16,6 +16,13 @@ const Path = store(); Path('/'); +const filterOutDotFiles = ({showDotFiles}) => ({name}) => { + if (showDotFiles) + return true; + + return !name.startsWith('.'); +}; + module.exports.FS = FS; module.exports.apiURL = '/api/v1'; module.exports.MAX_FILE_SIZE = 500 * 1024; @@ -118,6 +125,7 @@ module.exports.buildFromJSON = (params) => { template, sort = 'name', order = 'asc', + showDotFiles, } = params; const templateFile = template.file; @@ -195,6 +203,7 @@ module.exports.buildFromJSON = (params) => { } fileTable += files + .filter(filterOutDotFiles({showDotFiles})) .map(updateField) .map((file) => { const name = encode(file.name); diff --git a/common/cloudfunc.spec.js b/common/cloudfunc.spec.js index b5aceb7b..e4e06dd7 100644 --- a/common/cloudfunc.spec.js +++ b/common/cloudfunc.spec.js @@ -142,3 +142,36 @@ test('cloudfunc: getSize: file', (t) => { t.equal(result, expected); t.end(); }); + +test('cloudfunc: buildFromJSON: showDotFiles: false', (t) => { + const data = { + path: '/media/', + files: [{ + date: '30.08.2016', + mode: 'rwx rwx rwx', + name: '.floppy', + owner: 'root', + size: '7b', + type: 'directory-link', + }], + }; + + const html = buildFromJSON({ + prefix: '', + template, + data, + showDotFiles: false, + }); + + const $ = cheerio.load(html); + const el = $('[data-name="js-file-LmZsb3BweQ=="]'); + + const result = el + .find('[data-name="js-name"]') + .text(); + + const expected = ''; + + t.equal(result, expected); + t.end(); +}); diff --git a/json/config.json b/json/config.json index fd66580f..e65f41ee 100644 --- a/json/config.json +++ b/json/config.json @@ -30,6 +30,7 @@ "terminalPath": "", "terminalCommand": "", "terminalAutoRestart": true, + "showDotFiles": true, "showConfig": false, "showFileName": false, "vim": false, diff --git a/json/help.json b/json/help.json index 056713ff..6289a2d2 100644 --- a/json/help.json +++ b/json/help.json @@ -8,6 +8,7 @@ "-p, --password ": "set password", "-c, --config ": "configuration file path", "--show-config ": "show config values", + "--show-dot-files ": "show dot files", "--show-file-name ": "show file name in view and edit", "--editor ": "set editor: \"dword\", \"edward\" or \"deepword\"", "--packer ": "set packer: \"tar\" or \"zip\"", @@ -65,6 +66,7 @@ "--no-export ": "disable export config through a server", "--no-import ": "disable import of config", "--no-import-listen ": "disable listen on config updates from import server", + "--no-show-dot-files ": "do not show dot files", "--no-show-file-name ": "do not show file name in view and edit", "--no-dropbox ": "disable dropbox integration", "--no-dropbox-token ": "unset dropbox token", diff --git a/man/cloudcmd.1 b/man/cloudcmd.1 index 9ce86c60..607ff241 100644 --- a/man/cloudcmd.1 +++ b/man/cloudcmd.1 @@ -31,6 +31,7 @@ programs in browser from any computer, mobile or tablet device. -p, --password set password -c, --config configuration file path --show-config show config values + --show-dot-files show dot files --show-file-name show file name in view and edit modes --editor set editor: "dword", "edward" or "deepword" --packer set packer: "tar" or "zip" @@ -66,6 +67,7 @@ programs in browser from any computer, mobile or tablet device. --dropbox-token set dropbox token --log enable logging --no-show-config do not show config values + --no-show-dot-files do not show dot files --no-server do not start server --no-auth disable authorization --no-online load scripts from local server diff --git a/server/route.mjs b/server/route.mjs index d6917ec5..675a0b7a 100644 --- a/server/route.mjs +++ b/server/route.mjs @@ -180,6 +180,7 @@ function buildIndex(config, html, data) { data, prefix: getPrefix(config), template: Template, + showDotFiles: config('showDotFiles'), }); return indexProcessing(config, { diff --git a/tmpl/config.hbs b/tmpl/config.hbs index dfcc4c09..a05db1e6 100644 --- a/tmpl/config.hbs +++ b/tmpl/config.hbs @@ -135,6 +135,12 @@ placeholder="Port" class="form-control">
  • +
  • + +
  • - From 2fc503f71f363af6b6754b9f2709c71c3e0506fe Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 20 Jan 2025 18:05:22 +0200 Subject: [PATCH 0533/1230] feature: cloudcmd: @putout/babel v3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3e689170..1584c2cc 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "@cloudcmd/modal": "^3.0.0", "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^4.0.1", - "@putout/babel": "^2.0.0", + "@putout/babel": "^3.0.0", "@types/node-fetch": "^2.6.11", "auto-globals": "^4.0.0", "babel-loader": "^8.0.0", From d8da7922d90563fbba0e59f0bdd73391737deb4b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 20 Jan 2025 18:18:52 +0200 Subject: [PATCH 0534/1230] chore: client: lint --- client/dom/current-file.spec.js | 10 ++--- client/dom/directory.js | 12 ++---- client/dom/images.js | 4 +- client/dom/load-remote.js | 70 ++++++++++++++++----------------- client/modules/edit.js | 5 +-- client/modules/konsole.js | 18 ++++----- client/modules/menu.js | 4 +- client/modules/terminal-run.js | 18 ++++----- client/modules/terminal.js | 18 ++++----- client/modules/view/get-type.js | 4 +- client/modules/view/index.js | 5 ++- client/modules/view/types.js | 4 +- 12 files changed, 71 insertions(+), 101 deletions(-) diff --git a/client/dom/current-file.spec.js b/client/dom/current-file.spec.js index 3d822206..de1ba2af 100644 --- a/client/dom/current-file.spec.js +++ b/client/dom/current-file.spec.js @@ -261,12 +261,10 @@ test('current-file: isCurrentIsDir: file', (t) => { t.end(); }); -function getCloudCmd({emit} = {}) { - return { - prefix: '', - emit: emit || stub(), - }; -} +const getCloudCmd = ({emit} = {}) => ({ + prefix: '', + emit: emit || stub(), +}); test('current-file: parseNameAttribute', (t) => { const result = currentFile._parseNameAttribute('js-file-aGVsbG8mbmJzcDt3b3JsZA=='); diff --git a/client/dom/directory.js b/client/dom/directory.js index 88802d40..c7cfa386 100644 --- a/client/dom/directory.js +++ b/client/dom/directory.js @@ -63,14 +63,8 @@ module.exports = (items) => { uploader.on('end', CloudCmd.refresh); }; -function percent(i, n, per = 100) { - return Math.round(i * per / n); -} +const percent = (i, n, per = 100) => Math.round(i * per / n); -function uploadFile(url, data) { - return DOM.load.put(url, data); -} +const uploadFile = (url, data) => DOM.load.put(url, data); -function uploadDir(url) { - return DOM.load.put(`${url}?dir`); -} +const uploadDir = (url) => DOM.load.put(`${url}?dir`); diff --git a/client/dom/images.js b/client/dom/images.js index 382da9e8..bb5579c1 100644 --- a/client/dom/images.js +++ b/client/dom/images.js @@ -10,9 +10,7 @@ const LOADING = 'loading'; const HIDDEN = 'hidden'; const ERROR = 'error'; -function getLoadingType() { - return isSVG() ? '-svg' : '-gif'; -} +const getLoadingType = () => isSVG() ? '-svg' : '-gif'; module.exports.get = getElement; /** diff --git a/client/dom/load-remote.js b/client/dom/load-remote.js index 0def5f00..72fb9db9 100644 --- a/client/dom/load-remote.js +++ b/client/dom/load-remote.js @@ -17,42 +17,40 @@ module.exports = (name, options, callback = options) => { if (o.name && window[o.name]) return callback(); - Files - .get('modules') - .then(async (modules) => { - const online = config('online') && navigator.onLine; - const module = findObjByNameInArr(modules.remote, name); - - const isArray = itype.array(module.local); - const {version} = module; - - let remoteTmpls; - let local; - - if (isArray) { - remoteTmpls = module.remote; - local = module.local; - } else { - remoteTmpls = [module.remote]; - local = [module.local]; - } - - const localURL = local.map((url) => prefix + url); - - const remoteURL = remoteTmpls.map((tmpl) => { - return rendy(tmpl, { - version, - }); + Files.get('modules').then(async (modules) => { + const online = config('online') && navigator.onLine; + const module = findObjByNameInArr(modules.remote, name); + + const isArray = itype.array(module.local); + const {version} = module; + + let remoteTmpls; + let local; + + if (isArray) { + remoteTmpls = module.remote; + local = module.local; + } else { + remoteTmpls = [module.remote]; + local = [module.local]; + } + + const localURL = local.map((url) => prefix + url); + + const remoteURL = remoteTmpls.map((tmpl) => { + return rendy(tmpl, { + version, }); - - if (online) { - const [e] = await tryToCatch(load.parallel, remoteURL); - - if (!e) - return callback(); - } - - const [e] = await tryToCatch(load.parallel, localURL); - callback(e); }); + + if (online) { + const [e] = await tryToCatch(load.parallel, remoteURL); + + if (!e) + return callback(); + } + + const [e] = await tryToCatch(load.parallel, localURL); + callback(e); + }); }; diff --git a/client/modules/edit.js b/client/modules/edit.js index a62535b7..441aaf62 100644 --- a/client/modules/edit.js +++ b/client/modules/edit.js @@ -11,6 +11,7 @@ const load = require('load.js'); const {MAX_FILE_SIZE: maxSize} = require('../../common/cloudfunc'); const {time, timeEnd} = require('../../common/util'); +const getEditor = () => editor; const isFn = (a) => typeof a === 'function'; const loadJS = load.js; @@ -91,10 +92,6 @@ module.exports.show = (options) => { module.exports.getEditor = getEditor; -function getEditor() { - return editor; -} - module.exports.getElement = () => Element; module.exports.hide = () => { diff --git a/client/modules/konsole.js b/client/modules/konsole.js index 41936486..6993380d 100644 --- a/client/modules/konsole.js +++ b/client/modules/konsole.js @@ -46,22 +46,18 @@ module.exports.clear = () => { konsole.clear(); }; -function getPrefix() { - return CloudCmd.prefix + '/console'; -} +const getPrefix = () => CloudCmd.prefix + '/console'; function getPrefixSocket() { return CloudCmd.prefixSocket + '/console'; } -function getEnv() { - return { - ACTIVE_DIR: DOM.getCurrentDirPath.bind(DOM), - PASSIVE_DIR: DOM.getNotCurrentDirPath.bind(DOM), - CURRENT_NAME: DOM.getCurrentName.bind(DOM), - CURRENT_PATH: () => Info.path, - }; -} +const getEnv = () => ({ + ACTIVE_DIR: DOM.getCurrentDirPath.bind(DOM), + PASSIVE_DIR: DOM.getNotCurrentDirPath.bind(DOM), + CURRENT_NAME: DOM.getCurrentName.bind(DOM), + CURRENT_PATH: () => Info.path, +}); async function onPath(path) { if (Info.dirPath === path) diff --git a/client/modules/menu.js b/client/modules/menu.js index 150bb186..8f739164 100644 --- a/client/modules/menu.js +++ b/client/modules/menu.js @@ -226,9 +226,7 @@ function beforeShow(callback, params) { return isShow; } -function beforeClick(name) { - return MenuShowedName !== name; -} +const beforeClick = (name) => MenuShowedName !== name; async function _uploadTo(nameModule) { const [error, data] = await Info.getData(); diff --git a/client/modules/terminal-run.js b/client/modules/terminal-run.js index 01bd30a9..3e4b857d 100644 --- a/client/modules/terminal-run.js +++ b/client/modules/terminal-run.js @@ -75,22 +75,18 @@ function hide() { CloudCmd.View.hide(); } -function getPrefix() { - return CloudCmd.prefix + '/gritty'; -} +const getPrefix = () => CloudCmd.prefix + '/gritty'; function getPrefixSocket() { return CloudCmd.prefixSocket + '/gritty'; } -function getEnv() { - return { - ACTIVE_DIR: DOM.getCurrentDirPath, - PASSIVE_DIR: DOM.getNotCurrentDirPath, - CURRENT_NAME: DOM.getCurrentName, - CURRENT_PATH: DOM.getCurrentPath, - }; -} +const getEnv = () => ({ + ACTIVE_DIR: DOM.getCurrentDirPath, + PASSIVE_DIR: DOM.getNotCurrentDirPath, + CURRENT_NAME: DOM.getCurrentName, + CURRENT_PATH: DOM.getCurrentPath, +}); function create(createOptions) { const { diff --git a/client/modules/terminal.js b/client/modules/terminal.js index f94024d4..d36b700a 100644 --- a/client/modules/terminal.js +++ b/client/modules/terminal.js @@ -57,22 +57,18 @@ function hide() { CloudCmd.View.hide(); } -function getPrefix() { - return CloudCmd.prefix + '/gritty'; -} +const getPrefix = () => CloudCmd.prefix + '/gritty'; function getPrefixSocket() { return CloudCmd.prefixSocket + '/gritty'; } -function getEnv() { - return { - ACTIVE_DIR: DOM.getCurrentDirPath, - PASSIVE_DIR: DOM.getNotCurrentDirPath, - CURRENT_NAME: DOM.getCurrentName, - CURRENT_PATH: DOM.getCurrentPath, - }; -} +const getEnv = () => ({ + ACTIVE_DIR: DOM.getCurrentDirPath, + PASSIVE_DIR: DOM.getNotCurrentDirPath, + CURRENT_NAME: DOM.getCurrentName, + CURRENT_PATH: DOM.getCurrentPath, +}); function create() { const options = { diff --git a/client/modules/view/get-type.js b/client/modules/view/get-type.js index 80252aa1..3ac092e0 100644 --- a/client/modules/view/get-type.js +++ b/client/modules/view/get-type.js @@ -45,9 +45,7 @@ function isMedia(name) { return isAudio(name) || isVideo(name); } -function isAudio(name) { - return /\.(mp3|ogg|m4a)$/i.test(name); -} +const isAudio = (name) => /\.(mp3|ogg|m4a)$/i.test(name); function isVideo(name) { return /\.(mp4|avi|webm)$/i.test(name); diff --git a/client/modules/view/index.js b/client/modules/view/index.js index 0e79ab4e..17a3b1fa 100644 --- a/client/modules/view/index.js +++ b/client/modules/view/index.js @@ -55,7 +55,10 @@ CloudCmd[Name] = module.exports; const Info = DOM.CurrentInfo; const {Key} = CloudCmd; -const basename = (a) => a.split('/').pop(); + +const basename = (a) => a + .split('/') + .pop(); let El; let TemplateAudio; diff --git a/client/modules/view/types.js b/client/modules/view/types.js index 0ea9aef9..e36fec4d 100644 --- a/client/modules/view/types.js +++ b/client/modules/view/types.js @@ -2,6 +2,7 @@ const {extname} = require('node:path'); const currify = require('currify'); +const isAudio = (name) => /\.(mp3|ogg|m4a)$/i.test(name); const testRegExp = currify((name, reg) => reg.test(name)); const getRegExp = (ext) => RegExp(`\\.${ext}$`, 'i'); @@ -53,9 +54,6 @@ function isMedia(name) { } module.exports.isAudio = isAudio; -function isAudio(name) { - return /\.(mp3|ogg|m4a)$/i.test(name); -} function isVideo(name) { return /\.(mp4|avi|webm)$/i.test(name); From 907afc6e4aa5187b93ea389b0df7342a7eac372b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 20 Jan 2025 18:19:13 +0200 Subject: [PATCH 0535/1230] chore: test: lint --- test/before.mjs | 10 ++++------ test/rest/pack.mjs | 12 +++++------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/test/before.mjs b/test/before.mjs index 6e6e3f99..ccb2399f 100644 --- a/test/before.mjs +++ b/test/before.mjs @@ -64,9 +64,7 @@ export const connect = promisify((options, fn = options) => { }); }); -function defaultConfig() { - return { - auth: false, - root: __dirname, - }; -} +const defaultConfig = () => ({ + auth: false, + root: __dirname, +}); diff --git a/test/rest/pack.mjs b/test/rest/pack.mjs index afbe0a0f..8dd40245 100644 --- a/test/rest/pack.mjs +++ b/test/rest/pack.mjs @@ -224,10 +224,8 @@ test('cloudcmd: rest: pack: zip: put: error', async (t) => { t.end(); }); -function getPackOptions(to, names = ['pack']) { - return { - to, - names, - from: '/fixture', - }; -} +const getPackOptions = (to, names = ['pack']) => ({ + to, + names, + from: '/fixture', +}); From ddd1722f39a2338ab826199a24d8475ce67de7ca Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 20 Jan 2025 18:22:07 +0200 Subject: [PATCH 0536/1230] chore: lint --- bin/cloudcmd.mjs | 4 ++-- common/cloudfunc.js | 14 ++++++-------- css/supports.css | 2 +- server/config.js | 8 +++++--- server/rest/index.js | 9 +++------ server/terminal.js | 4 +--- static/user-menu.spec.js | 14 ++++++-------- 7 files changed, 24 insertions(+), 31 deletions(-) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index 0a7ec042..e6b4c1a9 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -17,11 +17,11 @@ process.on('unhandledRejection', exit); const require = createRequire(import.meta.url); const Info = require('../package.json'); - +const isUndefined = (a) => typeof a === 'undefined'; const simport = createSimport(import.meta.url); const choose = (a, b) => { - if (a === undefined) + if (isUndefined(a)) return b; return a; diff --git a/common/cloudfunc.js b/common/cloudfunc.js index c9a24c42..c906b548 100644 --- a/common/cloudfunc.js +++ b/common/cloudfunc.js @@ -248,14 +248,12 @@ module.exports.buildFromJSON = (params) => { return fileTable; }; -function updateField(file) { - return { - ...file, - date: file.date || '--.--.----', - owner: file.owner || 'root', - size: getSize(file), - }; -} +const updateField = (file) => ({ + ...file, + date: file.date || '--.--.----', + owner: file.owner || 'root', + size: getSize(file), +}); function getAttribute(type) { if (type === 'directory') diff --git a/css/supports.css b/css/supports.css index bf470c2d..ea2084d2 100644 --- a/css/supports.css +++ b/css/supports.css @@ -1,6 +1,6 @@ @supports (overflow: overlay) { .files { - overflow-y: overlay; + overflow-y: auto; } .fm-header { diff --git a/server/config.js b/server/config.js index a79e7165..3b180f09 100644 --- a/server/config.js +++ b/server/config.js @@ -22,7 +22,7 @@ const criton = require('criton'); const exit = require(`${DIR_SERVER}exit`); const CloudFunc = require(`${DIR_COMMON}cloudfunc`); - +const isUndefined = (a) => typeof a === 'undefined'; const DIR = `${DIR_SERVER}../`; const HOME = homedir(); @@ -31,7 +31,9 @@ const formatMsg = currify((a, b) => CloudFunc.formatMsg(a, b)); const {apiURL} = CloudFunc; -const key = (a) => Object.keys(a).pop(); +const key = (a) => Object + .keys(a) + .pop(); const ConfigPath = path.join(DIR, 'json/config.json'); const ConfigHome = path.join(HOME, '.cloudcmd.json'); @@ -90,7 +92,7 @@ function createConfig({configPath} = {}) { if (key === '*') return config; - if (value === undefined) + if (isUndefined(value)) return config[key]; config[key] = value; diff --git a/server/rest/index.js b/server/rest/index.js index f4cae656..c133e2dc 100644 --- a/server/rest/index.js +++ b/server/rest/index.js @@ -21,7 +21,8 @@ const root = require(`../root`); const CloudFunc = require(`../../common/cloudfunc`); const markdown = require(`../markdown/index.js`); const info = require('./info'); - +const isUndefined = (a) => typeof a === 'undefined'; +const isRootAll = (root, names) => names.some(isRootWin32(root)); const isString = (a) => typeof a === 'string'; const isFn = (a) => typeof a === 'function'; const swap = wraptile((fn, a, b) => fn(b, a)); @@ -66,7 +67,7 @@ function rest({fs, config, moveFiles}, request, response) { if (options.name) params.name = options.name; - if (options.gzip !== undefined) + if (!isUndefined(options.gzip)) params.gzip = options.gzip; if (options.query) @@ -370,10 +371,6 @@ const isRootWin32 = currify((root, path) => { module.exports._isRootWin32 = isRootWin32; module.exports._isRootAll = isRootAll; -function isRootAll(root, names) { - return names.some(isRootWin32(root)); -} - module.exports._getWin32RootMsg = getWin32RootMsg; function getWin32RootMsg() { diff --git a/server/terminal.js b/server/terminal.js index d10cdc8b..67613f0a 100644 --- a/server/terminal.js +++ b/server/terminal.js @@ -8,9 +8,7 @@ const noop = (req, res, next) => { noop.listen = noop; -function _getModule(a) { - return require(a); -} +const _getModule = (a) => require(a); module.exports = (config, arg, overrides = {}) => { const { diff --git a/static/user-menu.spec.js b/static/user-menu.spec.js index b10b5b15..9c42302a 100644 --- a/static/user-menu.spec.js +++ b/static/user-menu.spec.js @@ -337,11 +337,9 @@ function getDOM() { }; } -function getCloudCmd() { - return { - refresh: stub(), - EditFile: { - show: stub(), - }, - }; -} +const getCloudCmd = () => ({ + refresh: stub(), + EditFile: { + show: stub(), + }, +}); From 301252906f44758626b93ab25e2b2fc5c0b2ddd4 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 20 Jan 2025 18:48:58 +0200 Subject: [PATCH 0537/1230] chore: cloudcmd: v18.5.0 --- ChangeLog | 8 ++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ca00c56..2c0ccdd7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2025.01.20, v18.5.0 + +fix: +- ad8e55d8 client: themes -> columns (#434) + +feature: +- 2fc503f7 cloudcmd: @putout/babel v3.0.0 + 2024.12.13, v18.4.1 feature: diff --git a/HELP.md b/HELP.md index 98282eb0..21aa8379 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.4.1 +# Cloud Commander v18.5.0 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1098,6 +1098,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2025.01.20*, **[v18.5.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.0)** - *2024.12.13*, **[v18.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.4.1)** - *2024.11.22*, **[v18.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.4.0)** - *2024.11.14*, **[v18.3.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.3.0)** diff --git a/README.md b/README.md index 8c0e0e97..0df3b1a3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.4.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.5.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 1584c2cc..e02fb1df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.4.1", + "version": "18.5.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 161d4f952beb7630c123df382233cd300b0b34b6 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Tue, 21 Jan 2025 00:45:53 +0200 Subject: [PATCH 0538/1230] chore: lint --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index ab62820d..13d9e227 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -34,4 +34,5 @@ module.exports = { browser: true, }, }], + ignorePatterns: ['*.md{js}'], }; From b0be1194744c6bc8048ab438f5a4164e46547b76 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Tue, 21 Jan 2025 00:52:48 +0200 Subject: [PATCH 0539/1230] chore: actions: yarn -> bun --- .github/workflows/docker.yml | 4 ++-- .github/workflows/nodejs.yml | 4 ++-- .putout.json | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6e22e4f0..e4877cb7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -20,9 +20,9 @@ jobs: with: node-version: 22.x - name: Install Redrun - run: bun i yarn redrun -g --no-save + run: bun i redrun -g --no-save - name: NPM Install - run: yarn --no-lockfile + run: bun i --no-save - name: Lint run: redrun lint - name: Build diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 8bdc6cc0..88fed4f0 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -21,9 +21,9 @@ jobs: with: node-version: ${{ matrix.node-version }} - name: Install Redrun - run: bun i yarn redrun -g --no-save + run: bun i redrun -g --no-save - name: Install - run: yarn --no-lockfile + run: bun i --no-save - name: Lint run: redrun fix:lint - uses: actions/cache@v4 diff --git a/.putout.json b/.putout.json index 99e64ec8..08b4f06e 100644 --- a/.putout.json +++ b/.putout.json @@ -7,7 +7,6 @@ "fontello.json" ], "rules": { - "github/convert-npm-to-bun": "off", "github/set-node-versions": "off" }, "match": { From 3ad6720f5f2148c6cc3372e2889ec323484e8621 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 24 Jan 2025 00:48:44 +0200 Subject: [PATCH 0540/1230] chore: lint --- server/distribute/import.mjs | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/server/distribute/import.mjs b/server/distribute/import.mjs index f776abc0..0a48d065 100644 --- a/server/distribute/import.mjs +++ b/server/distribute/import.mjs @@ -105,25 +105,15 @@ export const distributeImport = (config, options, fn) => { const onConnect = emitAuth(importUrl, config, socket); const onAccept = logWrapped(isLog, importStr, `${connectedStr} to ${colorUrl}`); - const onDisconnect = squad( - done( - fn, - statusStore, - ), - logWrapped( - isLog, - importStr, - `${disconnectedStr} from ${colorUrl}`, - ), - rmListeners( - socket, - { - onError, - onConnect, - onConfig, - }, - ), - ); + const onDisconnect = squad(...[ + done(fn, statusStore), + logWrapped(isLog, importStr, `${disconnectedStr} from ${colorUrl}`), + rmListeners(socket, { + onError, + onConnect, + onConfig, + }), + ]); const onChange = squad(logWrapped(isLog, importStr), config); From 8e98b778bd2e145cc63960f07664c99aee37b6f1 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 3 Feb 2025 14:49:43 +0200 Subject: [PATCH 0541/1230] feature: cloudcmd: eslint-plugin-putout v24.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e02fb1df..52246ebe 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "emitify": "^4.0.1", "eslint": "^8.0.1", "eslint-plugin-n": "^17.0.0-4", - "eslint-plugin-putout": "^23.1.0", + "eslint-plugin-putout": "^24.0.0", "extract-text-webpack-plugin": "^4.0.0-alpha.0", "gritty": "^8.0.0", "gunzip-maybe": "^1.3.1", From 353a1fb6c114ae6b571603a16cc6f5965cfdad96 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 3 Feb 2025 14:49:47 +0200 Subject: [PATCH 0542/1230] feature: cloudcmd: putout v38.0.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52246ebe..d4a5ccbc 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "package-json": "^10.0.0", "ponse": "^7.0.0", "pullout": "^5.0.0", - "putout": "^37.0.1", + "putout": "^38.0.5", "redzip": "^3.0.0", "rendy": "^4.1.3", "restafary": "^12.0.0", From 467f0a79c379a8f2fc14ed2a29e0fd629052f3b3 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 3 Feb 2025 14:50:27 +0200 Subject: [PATCH 0543/1230] feature: cloudcmd: webpack-merge v6.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4a5ccbc..7fa52346 100644 --- a/package.json +++ b/package.json @@ -211,7 +211,7 @@ "url-loader": "^4.0.0", "webpack": "^4.0.0", "webpack-cli": "^3.0.1", - "webpack-merge": "^5.0.8", + "webpack-merge": "^6.0.1", "webpackbar": "^5.0.0-3" }, "engines": { From 2dea0a3b2de8d46a7ef05a1aa3ca90a634eb49bb Mon Sep 17 00:00:00 2001 From: coderiaser Date: Mon, 3 Feb 2025 14:51:27 +0200 Subject: [PATCH 0544/1230] chore: cloudcmd: v18.5.1 --- ChangeLog | 7 +++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c0ccdd7..414c5329 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2025.02.03, v18.5.1 + +feature: +- 467f0a79 cloudcmd: webpack-merge v6.0.1 +- 353a1fb6 cloudcmd: putout v38.0.5 +- 8e98b778 cloudcmd: eslint-plugin-putout v24.0.0 + 2025.01.20, v18.5.0 fix: diff --git a/HELP.md b/HELP.md index 21aa8379..f002d2d9 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.0 +# Cloud Commander v18.5.1 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1098,6 +1098,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2025.02.03*, **[v18.5.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.1)** - *2025.01.20*, **[v18.5.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.0)** - *2024.12.13*, **[v18.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.4.1)** - *2024.11.22*, **[v18.4.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.4.0)** diff --git a/README.md b/README.md index 0df3b1a3..a1a4a2f4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.5.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 7fa52346..509170a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.5.0", + "version": "18.5.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 4eaeccba1cb1ac2bd2aa425dd2dd9fdbad6d2b34 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:53:17 +0200 Subject: [PATCH 0545/1230] chore: github: issue template --- .github/ISSUE_TEMPLATE.md | 13 ------------- .github/ISSUE_TEMPLATE/config.yml | 4 ++++ 2 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 45635a3c..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,13 +0,0 @@ - - -- **Version** (`cloudcmd -v`): -- **Node Version** `node -v`: -- **OS** (`uname -a` on Linux): -- **Browser name/version**: -- **Used Command Line Parameters**: -- **Changed Config**: -- [ ] **I'm ready to donate on [Patreon](https://patreon.com/coderaiser) 🎁** -- [ ] **I'm willing to work on this issue 💪** diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..aedb0578 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: Stack Overflow + url: https://stackoverflow.com/search?q=cloudcmd + about: Please ask and answer questions here. From c68a3a7f077da4c15931fecec7a031b6f0baa526 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:54:10 +0200 Subject: [PATCH 0546/1230] chore: github: issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue_template.md diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md new file mode 100644 index 00000000..c7ebcbed --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -0,0 +1,8 @@ +- **Version** (`cloudcmd -v`): +- **Node Version** `node -v`: +- **OS** (`uname -a` on Linux): +- **Browser name/version**: +- **Used Command Line Parameters**: +- **Changed Config**: +- [ ] **I'm ready to donate on [Patreon](https://patreon.com/coderaiser) 🎁** +- [ ] **I'm willing to work on this issue 💪** From 3adfec81c2a6eb5d8553b4bddb5c8a4c7b8f5b0c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:54:49 +0200 Subject: [PATCH 0547/1230] chore: github: config: forbid blank issues --- .github/ISSUE_TEMPLATE/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index aedb0578..5f41e73a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,3 +1,4 @@ +blank_issues_enabled: false contact_links: - name: Stack Overflow url: https://stackoverflow.com/search?q=cloudcmd From 7492b4bfc702a2afbd13bfef9b3e90d48dfda90e Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:56:47 +0200 Subject: [PATCH 0548/1230] chore: issue_template: configure --- .github/ISSUE_TEMPLATE/issue_template.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index c7ebcbed..3ce5705b 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,3 +1,11 @@ +--- +name: Tracking issue +about: Use this template for tracking new features. +title: "[DATE]: [FEATURE NAME]" +labels: needs triage +assignees: coderaiser +--- + - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: - **OS** (`uname -a` on Linux): From 7ae60605bb36f21ccf6cb2df2f1b0d3735549e9c Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 13:57:41 +0000 Subject: [PATCH 0549/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 3ce5705b..f5402193 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,10 +1,11 @@ ---- +*** + name: Tracking issue about: Use this template for tracking new features. title: "[DATE]: [FEATURE NAME]" labels: needs triage assignees: coderaiser ---- +--------------------- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From a38b3a79ceac3d55cf3f534515c0bbf3018d1584 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:58:38 +0200 Subject: [PATCH 0550/1230] chrome: issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index f5402193..f51666e9 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,11 +1,10 @@ -*** - +--- name: Tracking issue -about: Use this template for tracking new features. -title: "[DATE]: [FEATURE NAME]" +about: Create an issue with bug report or feature request. +title: "" labels: needs triage assignees: coderaiser ---------------------- +--- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From 56d621b1ffd85a6835b6dc74d8719f1b3a12db24 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 13:59:35 +0000 Subject: [PATCH 0551/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index f51666e9..32af23ac 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,10 +1,11 @@ ---- +*** + name: Tracking issue about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser ---- +--------------------- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From e71550d557509b091a3612693c45ce6880176ad5 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 16:04:53 +0200 Subject: [PATCH 0552/1230] chrome: issue_template: improve --- .github/ISSUE_TEMPLATE/issue_template.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 32af23ac..a97748e2 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -13,5 +13,9 @@ assignees: coderaiser - **Browser name/version**: - **Used Command Line Parameters**: - **Changed Config**: -- [ ] **I'm ready to donate on [Patreon](https://patreon.com/coderaiser) 🎁** -- [ ] **I'm willing to work on this issue 💪** +```json +{} +``` +- [ ] 🎁 **I'm ready to donate on https://opencollective.com/cloudcmd** +- [ ] 🎁 **I'm ready to donate on https://ko-fi.com/coderaiser** +- [ ] 💪 **I'm willing to work on this issue** From a598ef3ed05bd1b11893fb75c8ee2146340651d8 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 14:05:53 +0000 Subject: [PATCH 0553/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index a97748e2..e0d6bfde 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -13,9 +13,11 @@ assignees: coderaiser - **Browser name/version**: - **Used Command Line Parameters**: - **Changed Config**: + ```json {} ``` + - [ ] 🎁 **I'm ready to donate on https://opencollective.com/cloudcmd** - [ ] 🎁 **I'm ready to donate on https://ko-fi.com/coderaiser** - [ ] 💪 **I'm willing to work on this issue** From 3d52ce80f28e94d50b189c7f67bce06927692c79 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 16:06:08 +0200 Subject: [PATCH 0554/1230] Update FUNDING.yml --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 93b856e8..9fdb6d3c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,3 @@ github: coderaiser -patreon: coderaiser open_collective: cloudcmd ko_fi: coderaiser From e2591061af10838b69e2ec99bc85754007f94de3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:38:33 +0200 Subject: [PATCH 0555/1230] chore: issue_template: updated --- .github/ISSUE_TEMPLATE/issue_template.md | 56 ++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index e0d6bfde..e267a2ae 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -5,6 +5,62 @@ about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this report! + - type: input + id: version + attributes: + label: **Version** (`cloudcmd -v`): + description: Version of used Cloud Commander + placeholder: version + validations: + required: true + - type: input + id: node-version + attributes: + label: **Node Version** (`node -v`): + description: Version of used Node.js + placeholder: version + validations: + required: false + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? + placeholder: Tell us what you see! + value: "A bug happened!" + validations: + required: true + - + validations: + required: true + - type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + - type: textarea + id: changed-config + attributes: + label: Changed Config + description: Please copy and paste any relevant changed `~/.cloudcmd.json`. This will be automatically formatted into code, so no need for backticks. + render: json + - type: checkboxes + id: work-on-issue + attributes: + label: Work on this issue + options: + - label: 💪 **I'm willing to work on this issue** + required: false --------------------- - **Version** (`cloudcmd -v`): From 53acae1a631c4ddbc90547d3a2fdbaf6ea72375f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:39:36 +0000 Subject: [PATCH 0556/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 105 ++++++++++++----------- 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index e267a2ae..5a35c27c 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -6,62 +6,63 @@ title: "" labels: needs triage assignees: coderaiser body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this report! + +- type: markdown + attributes: + value: | + Thanks for taking the time to fill out this report! +- type: input + id: version + attributes: + label: **Version** (`cloudcmd -v`): + description: Version of used Cloud Commander + placeholder: version + validations: + required: true - type: input - id: version - attributes: - label: **Version** (`cloudcmd -v`): - description: Version of used Cloud Commander - placeholder: version - validations: - required: true - - type: input id: node-version attributes: - label: **Node Version** (`node -v`): - description: Version of used Node.js - placeholder: version + label: **Node Version** (`node -v`): + description: Version of used Node.js + placeholder: version validations: - required: false - - type: textarea - id: what-happened - attributes: - label: What happened? - description: Also tell us, what did you expect to happen? - placeholder: Tell us what you see! - value: "A bug happened!" - validations: - required: true - - - validations: - required: true - - type: dropdown - id: browsers - attributes: - label: What browsers are you seeing the problem on? - multiple: true - options: - - Firefox - - Chrome - - Safari - - Microsoft Edge - - type: textarea - id: changed-config - attributes: - label: Changed Config - description: Please copy and paste any relevant changed `~/.cloudcmd.json`. This will be automatically formatted into code, so no need for backticks. - render: json - - type: checkboxes - id: work-on-issue - attributes: - label: Work on this issue - options: - - label: 💪 **I'm willing to work on this issue** - required: false ---------------------- + required: false +- type: textarea + id: what-happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? + placeholder: Tell us what you see! + value: "A bug happened!" + validations: + required: true +- validations: + required: true +- type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge +- type: textarea + id: changed-config + attributes: + label: Changed Config + description: Please copy and paste any relevant changed `~/.cloudcmd.json`. This will be automatically formatted into code, so no need for backticks. + render: json +- type: checkboxes + id: work-on-issue + attributes: + label: Work on this issue + options: + - label: 💪 **I'm willing to work on this issue** + required: false + +*** - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From 38666cbb8b51982489c65db5da56b84450a731c7 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:40:55 +0200 Subject: [PATCH 0557/1230] Update issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 5a35c27c..2acfd7de 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,5 +1,3 @@ -*** - name: Tracking issue about: Create an issue with bug report or feature request. title: "" From 2e02ba46e807608e8727c0b277ed585354b076a2 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:41:51 +0000 Subject: [PATCH 0558/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 2acfd7de..6ead6d89 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -58,7 +58,7 @@ body: label: Work on this issue options: - label: 💪 **I'm willing to work on this issue** - required: false + required: false *** From b2f113bf0a7ab68f9c1224942f90fbe02b1ccb17 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:43:12 +0200 Subject: [PATCH 0559/1230] Update issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 6ead6d89..47959bec 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,3 +1,5 @@ +--------------------- + name: Tracking issue about: Create an issue with bug report or feature request. title: "" @@ -59,9 +61,7 @@ body: options: - label: 💪 **I'm willing to work on this issue** required: false - -*** - +--------------------- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: - **OS** (`uname -a` on Linux): From 51a4cee6889bd1356558f86750003c0ac94d3e6a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:43:54 +0200 Subject: [PATCH 0560/1230] Update issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 58 ------------------------ 1 file changed, 58 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 47959bec..10b88bd9 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,66 +1,8 @@ ---------------------- - name: Tracking issue about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser -body: - -- type: markdown - attributes: - value: | - Thanks for taking the time to fill out this report! -- type: input - id: version - attributes: - label: **Version** (`cloudcmd -v`): - description: Version of used Cloud Commander - placeholder: version - validations: - required: true - - type: input - id: node-version - attributes: - label: **Node Version** (`node -v`): - description: Version of used Node.js - placeholder: version - validations: - required: false -- type: textarea - id: what-happened - attributes: - label: What happened? - description: Also tell us, what did you expect to happen? - placeholder: Tell us what you see! - value: "A bug happened!" - validations: - required: true -- validations: - required: true -- type: dropdown - id: browsers - attributes: - label: What browsers are you seeing the problem on? - multiple: true - options: - - Firefox - - Chrome - - Safari - - Microsoft Edge -- type: textarea - id: changed-config - attributes: - label: Changed Config - description: Please copy and paste any relevant changed `~/.cloudcmd.json`. This will be automatically formatted into code, so no need for backticks. - render: json -- type: checkboxes - id: work-on-issue - attributes: - label: Work on this issue - options: - - label: 💪 **I'm willing to work on this issue** - required: false --------------------- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From 716765104c1d6062cf09a1bd502c395b9a4ad992 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:44:25 +0200 Subject: [PATCH 0561/1230] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 5f41e73a..aedb0578 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Stack Overflow url: https://stackoverflow.com/search?q=cloudcmd From dbd8c6ab7c8f0fa163cc29e33095a06158b9d044 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:45:01 +0200 Subject: [PATCH 0562/1230] Update issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 10b88bd9..e7a2f6b6 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -3,7 +3,9 @@ about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser + --------------------- + - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: - **OS** (`uname -a` on Linux): From 34fb175d63c7e9092f31c4ac30bca0c1e0c3e02e Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 15:45:56 +0000 Subject: [PATCH 0563/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index e7a2f6b6..02a1cf86 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -4,7 +4,7 @@ title: "" labels: needs triage assignees: coderaiser ---------------------- +*** - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From 84719365b14d7436caccd0b1144c02c827edd9b0 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 18:12:28 +0200 Subject: [PATCH 0564/1230] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 33 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..7cf2e8cb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: needs clarification +assignees: coderaiser + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] +- Node.js version + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From ac9a27b333eff98ec20e9b5a03ea3da029f48fbe Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 16:13:38 +0000 Subject: [PATCH 0565/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.md | 13 ++++++++----- .github/ISSUE_TEMPLATE/feature_request.md | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7cf2e8cb..04b3eb52 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,17 +1,19 @@ ---- +*** + name: Bug report about: Create a report to help us improve title: '' labels: needs clarification assignees: coderaiser ---- +*** **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,9 +26,10 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] - Node.js version **Additional context** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7d..32531b98 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,11 +1,12 @@ ---- +*** + name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' ---- +*** **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] From 8ff0ee6a1a444d565ad1c60ce27ba5888300c41d Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 18:14:03 +0200 Subject: [PATCH 0566/1230] Update issue_template.md --- .github/ISSUE_TEMPLATE/issue_template.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index 02a1cf86..e2072f57 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,10 +1,11 @@ +--- name: Tracking issue about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser -*** +--- - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From 99118e65a69c49b6296b1d7bc09c124305edd86c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Tue, 4 Feb 2025 19:02:58 +0200 Subject: [PATCH 0567/1230] chore: lint --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- .github/ISSUE_TEMPLATE/feature_request.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 04b3eb52..dc08cbad 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,4 +1,4 @@ -*** +--- name: Bug report about: Create a report to help us improve @@ -6,7 +6,7 @@ title: '' labels: needs clarification assignees: coderaiser -*** +--- **Describe the bug** A clear and concise description of what the bug is. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 32531b98..549a8874 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,4 +1,4 @@ -*** +--- name: Feature request about: Suggest an idea for this project @@ -6,7 +6,7 @@ title: '' labels: '' assignees: '' -*** +--- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] From 2d21001e5518aafa72b80fe1741fbbc2c04a7180 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 19:03:58 +0200 Subject: [PATCH 0568/1230] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index aedb0578..5f41e73a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,3 +1,4 @@ +blank_issues_enabled: false contact_links: - name: Stack Overflow url: https://stackoverflow.com/search?q=cloudcmd From f1193955fb9045ca57cfb9e1158da0047c654693 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 4 Feb 2025 17:04:57 +0000 Subject: [PATCH 0569/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/issue_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md index e2072f57..17bf5831 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -1,11 +1,12 @@ ---- +*** + name: Tracking issue about: Create an issue with bug report or feature request. title: "" labels: needs triage assignees: coderaiser ---- +*** - **Version** (`cloudcmd -v`): - **Node Version** `node -v`: From b0a7fc1648f94867175d4649b01f29e8677b90d6 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:24:00 +0200 Subject: [PATCH 0570/1230] feature: cloudcmd: putout v39.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 509170a8..e4ae67c5 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "package-json": "^10.0.0", "ponse": "^7.0.0", "pullout": "^5.0.0", - "putout": "^38.0.5", + "putout": "^39.3.0", "redzip": "^3.0.0", "rendy": "^4.1.3", "restafary": "^12.0.0", From f774d5b290087e1c24bf18badcfb544251028969 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:24:36 +0200 Subject: [PATCH 0571/1230] feature: cloudcmd: eslint-plugin-putout v26.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4ae67c5..58356917 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "emitify": "^4.0.1", "eslint": "^8.0.1", "eslint-plugin-n": "^17.0.0-4", - "eslint-plugin-putout": "^24.0.0", + "eslint-plugin-putout": "^26.1.0", "extract-text-webpack-plugin": "^4.0.0-alpha.0", "gritty": "^8.0.0", "gunzip-maybe": "^1.3.1", From 43fd5ed6600e23bccd35473ca74416ed0a2025e2 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:24:39 +0200 Subject: [PATCH 0572/1230] feature: cloudcmd: madrun v11.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 58356917..495cd5dd 100644 --- a/package.json +++ b/package.json @@ -184,7 +184,7 @@ "just-pascal-case": "^3.2.0", "limier": "^3.0.0", "load.js": "^3.0.0", - "madrun": "^10.0.0", + "madrun": "^11.0.0", "memfs": "^4.2.0", "minor": "^1.2.2", "mock-require": "^3.0.1", From 368c9bb814b8ead2c529a3aaceb00b29e1ee799a Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:25:13 +0200 Subject: [PATCH 0573/1230] feature: cloudcmd: eslint v9.23.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 495cd5dd..ba36b747 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ "css-modules-require-hook": "^4.2.3", "domtokenlist-shim": "^1.2.0", "emitify": "^4.0.1", - "eslint": "^8.0.1", + "eslint": "^9.23.0", "eslint-plugin-n": "^17.0.0-4", "eslint-plugin-putout": "^26.1.0", "extract-text-webpack-plugin": "^4.0.0-alpha.0", From e7cc9b92ae0fa45c65e0b80c0312726155060aa3 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:25:16 +0200 Subject: [PATCH 0574/1230] feature: cloudcmd: redlint v4.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba36b747..d50e7e8f 100644 --- a/package.json +++ b/package.json @@ -196,7 +196,7 @@ "philip": "^3.0.0", "place": "^1.1.4", "readjson": "^2.0.1", - "redlint": "^3.13.1", + "redlint": "^4.1.1", "request": "^2.76.0", "rimraf": "^6.0.1", "scroll-into-view-if-needed": "^3.0.4", From 08ab63d704fe829404c6275d73f41c95e09e979c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:25:19 +0200 Subject: [PATCH 0575/1230] feature: cloudcmd: supertape v11.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d50e7e8f..9d5ff285 100644 --- a/package.json +++ b/package.json @@ -205,7 +205,7 @@ "smalltalk": "^4.0.0", "style-loader": "^2.0.0", "supermenu": "^4.0.1", - "supertape": "^10.0.0", + "supertape": "^11.0.4", "tar-stream": "^3.0.0", "unionfs": "^4.0.0", "url-loader": "^4.0.0", From e87418adde461fb8c07ae04560662242a226a9d4 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:25:36 +0200 Subject: [PATCH 0576/1230] chore: lint --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 9d5ff285..e82b2f00 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,6 @@ "@cloudcmd/move-files": "^8.0.0", "@cloudcmd/read-files-sync": "^2.0.0", "@putout/cli-validate-args": "^2.0.0", - "@putout/plugin-cloudcmd": "^3.1.1", "apart": "^2.0.0", "chalk": "^5.3.0", "compression": "^1.7.4", From 51f51b54de7df656eac5f58c3261d16b3884b3be Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 28 Mar 2025 16:36:51 +0200 Subject: [PATCH 0577/1230] feature: cloudcmd: @putout/plugin-cloudcmd v4.0.0 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e82b2f00..b5dc2368 100644 --- a/package.json +++ b/package.json @@ -158,6 +158,7 @@ "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^4.0.1", "@putout/babel": "^3.0.0", + "@putout/plugin-cloudcmd": "^4.0.0", "@types/node-fetch": "^2.6.11", "auto-globals": "^4.0.0", "babel-loader": "^8.0.0", From f7379c0562adcbb835f2b8bcd87c8032321766e9 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Sat, 29 Mar 2025 00:20:04 +0200 Subject: [PATCH 0578/1230] chore: lint --- client/client.js | 3 ++- client/dom/load-remote.js | 2 +- client/dom/load.js | 2 +- client/listeners/index.js | 2 +- client/modules/menu.js | 1 + client/modules/operation/index.js | 11 +++++++---- client/modules/user-menu/navigate.js | 7 +------ client/modules/user-menu/navigate.spec.js | 7 +------ 8 files changed, 15 insertions(+), 20 deletions(-) diff --git a/client/client.js b/client/client.js index f17e0b23..4d53c634 100644 --- a/client/client.js +++ b/client/client.js @@ -94,6 +94,7 @@ function CloudCmdProto(DOM) { imgPosition = 'top'; Images.show.load(imgPosition, panel); + /* загружаем содержимое каталога */ await ajaxLoad(addSlashToEnd(path), { refresh, @@ -237,7 +238,7 @@ function CloudCmdProto(DOM) { const dirPath = DOM.getCurrentDirPath(); - Listeners = CloudCmd.Listeners; + ({Listeners} = CloudCmd); Listeners.init(); const panels = getPanels(); diff --git a/client/dom/load-remote.js b/client/dom/load-remote.js index 72fb9db9..84c7e329 100644 --- a/client/dom/load-remote.js +++ b/client/dom/load-remote.js @@ -29,7 +29,7 @@ module.exports = (name, options, callback = options) => { if (isArray) { remoteTmpls = module.remote; - local = module.local; + ({local} = module); } else { remoteTmpls = [module.remote]; local = [module.local]; diff --git a/client/dom/load.js b/client/dom/load.js index 9148c1b8..03c25d73 100644 --- a/client/dom/load.js +++ b/client/dom/load.js @@ -63,7 +63,7 @@ module.exports.ajax = (params) => { if (!isArrayBuf && isObject || isArray) data = jonny.stringify(p.data); else - data = p.data; + ({data} = p); xhr.onreadystatechange = (event) => { const xhr = event.target; diff --git a/client/listeners/index.js b/client/listeners/index.js index 78342411..3bd0ce9c 100644 --- a/client/listeners/index.js +++ b/client/listeners/index.js @@ -216,7 +216,7 @@ async function onPathElementClick(panel, event) { function copyPath(el) { clipboard .writeText(el - .parentElement.title) + .parentElement.title) .then(CloudCmd.log) .catch(CloudCmd.log); } diff --git a/client/modules/menu.js b/client/modules/menu.js index 8f739164..6ab88453 100644 --- a/client/modules/menu.js +++ b/client/modules/menu.js @@ -276,6 +276,7 @@ function download(type) { const path = DOM.getCurrentPath(file); CloudCmd.log(`downloading file ${path}...`); + /* * if we send ajax request - * no need in hash so we escape # diff --git a/client/modules/operation/index.js b/client/modules/operation/index.js index 68d17a33..bf19bda8 100644 --- a/client/modules/operation/index.js +++ b/client/modules/operation/index.js @@ -343,10 +343,13 @@ async function _processFiles(options, data) { let names = []; if (data) { - from = data.from; - to = data.to; - names = data.names; - panel = Info.panel; + ({ + from, + to, + names, + } = data); + + ({panel} = Info); } else { from = Info.dirPath; to = DOM.getNotCurrentDirPath(); diff --git a/client/modules/user-menu/navigate.js b/client/modules/user-menu/navigate.js index 445d47d1..d3c89830 100644 --- a/client/modules/user-menu/navigate.js +++ b/client/modules/user-menu/navigate.js @@ -2,12 +2,7 @@ const fullstore = require('fullstore'); -const { - J, - K, - UP, - DOWN, -} = require('../../key/key.js'); +const {J, K, UP, DOWN} = require('../../key/key.js'); const store = fullstore(1); const isDigit = (a) => /^\d+$/.test(a); diff --git a/client/modules/user-menu/navigate.spec.js b/client/modules/user-menu/navigate.spec.js index abf95aab..5dbbfb81 100644 --- a/client/modules/user-menu/navigate.spec.js +++ b/client/modules/user-menu/navigate.spec.js @@ -3,12 +3,7 @@ const test = require('supertape'); const navigate = require('./navigate'); -const { - UP, - DOWN, - J, - K, -} = require('../../key/key.js'); +const {UP, DOWN, J, K} = require('../../key/key.js'); test('cloudcmd: user-menu: navigate: DOWN', (t) => { const el = { From 9f52ed795da399687a9731849030804ff5b7c8f7 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Sat, 29 Mar 2025 19:30:38 +0200 Subject: [PATCH 0579/1230] chore: package: postcss --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index b5dc2368..a102b349 100644 --- a/package.json +++ b/package.json @@ -195,6 +195,7 @@ "optimize-css-assets-webpack-plugin": "^5.0.0", "philip": "^3.0.0", "place": "^1.1.4", + "postcss": "^8.5.3", "readjson": "^2.0.1", "redlint": "^4.1.1", "request": "^2.76.0", From 84c6935ae43376b50f593ef49d44ec7d507ec6ac Mon Sep 17 00:00:00 2001 From: coderaiser Date: Sat, 29 Mar 2025 17:32:46 +0000 Subject: [PATCH 0580/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/release.mjs | 3 +- common/cloudfunc.js | 71 ++++++++++++++++++++-------------------- server/repl.js | 36 ++++++++++---------- server/show-config.js | 6 ++-- server/user-menu.mjs | 8 ++--- test/common/cloudfunc.js | 17 +++++----- test/rest/pack.mjs | 4 +-- 7 files changed, 73 insertions(+), 72 deletions(-) diff --git a/bin/release.mjs b/bin/release.mjs index 1c12c20e..ee55509a 100755 --- a/bin/release.mjs +++ b/bin/release.mjs @@ -19,7 +19,8 @@ await main(); async function main() { const history = '## Version history\n\n'; const link = '//github.com/coderaiser/cloudcmd/releases/tag/'; - const template = '- *{{ date }}*, ' + + const template = + '- *{{ date }}*, ' + '**[v{{ version }}]' + '(' + link + 'v{{ version }})**\n'; diff --git a/common/cloudfunc.js b/common/cloudfunc.js index c906b548..66ec044f 100644 --- a/common/cloudfunc.js +++ b/common/cloudfunc.js @@ -173,7 +173,6 @@ module.exports.buildFromJSON = (params) => { Path(path); fileTable += `${header}
      `; - /* Если мы не в корне */ if (path !== '/') { const dotDot = getDotDot(path); @@ -204,43 +203,43 @@ module.exports.buildFromJSON = (params) => { fileTable += files .filter(filterOutDotFiles({ - showDotFiles, - })) + showDotFiles, + })) .map(updateField) .map((file) => { - const name = encode(file.name); - const link = prefix + FS + path + name; - - const { - type, - mode, - date, - owner, - size, - } = file; - - const linkResult = rendy(templateLink, { - link, - title: name, - name, - attribute: getAttribute(file.type), - }); - - const dataName = getDataName(file.name); - const attribute = `draggable="true" ${dataName}`; - - return rendy(templateFile, { - tag: 'li', - attribute, - className: '', - type, - name: linkResult, - size, - date, - owner, - mode, - }); - }) + const name = encode(file.name); + const link = prefix + FS + path + name; + + const { + type, + mode, + date, + owner, + size, + } = file; + + const linkResult = rendy(templateLink, { + link, + title: name, + name, + attribute: getAttribute(file.type), + }); + + const dataName = getDataName(file.name); + const attribute = `draggable="true" ${dataName}`; + + return rendy(templateFile, { + tag: 'li', + attribute, + className: '', + type, + name: linkResult, + size, + date, + owner, + mode, + }); + }) .join(''); fileTable += '
    '; diff --git a/server/repl.js b/server/repl.js index 0c4d5279..c1647f04 100644 --- a/server/repl.js +++ b/server/repl.js @@ -6,22 +6,22 @@ const repl = require('node:repl'); module.exports = net .createServer((socket) => { - const {pid} = process; - const addr = socket.remoteAddress; - const port = socket.remotePort; - - const r = repl.start({ - prompt: `[${pid} ${addr}:${port}>`, - input: socket, - output: socket, - terminal: true, - useGlobal: false, - }); - - r.on('exit', () => { - socket.end(); - }); - - r.context.socket = socket; - }) + const {pid} = process; + const addr = socket.remoteAddress; + const port = socket.remotePort; + + const r = repl.start({ + prompt: `[${pid} ${addr}:${port}>`, + input: socket, + output: socket, + terminal: true, + useGlobal: false, + }); + + r.on('exit', () => { + socket.end(); + }); + + r.context.socket = socket; +}) .listen(1337); diff --git a/server/show-config.js b/server/show-config.js index 065fd7dd..78180b79 100644 --- a/server/show-config.js +++ b/server/show-config.js @@ -11,9 +11,9 @@ module.exports = (config) => { const data = Object .keys(config) .map((name) => [ - name, - config[name], - ]); + name, + config[name], + ]); if (!data.length) return ''; diff --git a/server/user-menu.mjs b/server/user-menu.mjs index ead1b3e3..cad6f9b1 100644 --- a/server/user-menu.mjs +++ b/server/user-menu.mjs @@ -80,10 +80,10 @@ async function onGET({req, res, menuName, readFile}) { function getError(error, source) { return montag` const e = Error(\`
    ${codeframe({
    -            error,
    -            source,
    -            highlightCode: false,
    -        })}
    \`); + error, + source, + highlightCode: false, + })}
  • \`); e.code = 'frame'; diff --git a/test/common/cloudfunc.js b/test/common/cloudfunc.js index 185ff7b5..c8acadea 100644 --- a/test/common/cloudfunc.js +++ b/test/common/cloudfunc.js @@ -44,7 +44,8 @@ const data = { }], }; -let Expect = '
    ' + +let Expect = + '
    ' + '' + '' + @@ -74,13 +75,13 @@ test('cloudfunc: render', (t) => { const isNotOk = Expect .split('') .some((item, number) => { - const ret = result[number] !== item; - - if (ret) - i = number; - - return ret; - }); + const ret = result[number] !== item; + + if (ret) + i = number; + + return ret; + }); timeEnd('CloudFunc.buildFromJSON'); diff --git a/test/rest/pack.mjs b/test/rest/pack.mjs index 8dd40245..9aefcb97 100644 --- a/test/rest/pack.mjs +++ b/test/rest/pack.mjs @@ -170,7 +170,7 @@ test('cloudcmd: rest: pack: zip: put: file', async (t) => { config, }; - const name = String(Math.random()) + '.zip'; + const name = `${Math.random()}.zip`; await request.put(`/api/v1/pack`, { options, @@ -192,7 +192,7 @@ test('cloudcmd: rest: pack: zip: put: response', async (t) => { config, }; - const name = String(Math.random()) + '.zip'; + const name = `${Math.random()}.zip`; const {body} = await request.put(`/api/v1/pack`, { options, From 8450bfa611e2bc9c3cbf4c440abb3c3957c00db5 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 10 Apr 2025 17:22:21 +0300 Subject: [PATCH 0581/1230] feature: cloudcmd: putout v40.0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a102b349..d7f7b639 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "package-json": "^10.0.0", "ponse": "^7.0.0", "pullout": "^5.0.0", - "putout": "^39.3.0", + "putout": "^40.0.3", "redzip": "^3.0.0", "rendy": "^4.1.3", "restafary": "^12.0.0", From 4b78d70b5c7270719aa69efc8c5cef3d0c85f167 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 10 Apr 2025 17:24:15 +0300 Subject: [PATCH 0582/1230] chore: cloudcmd: v18.5.2 --- ChangeLog | 12 ++++++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 414c5329..826f9ea3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2025.04.10, v18.5.2 + +feature: +- 8450bfa6 cloudcmd: putout v40.0.3 +- 51f51b54 cloudcmd: @putout/plugin-cloudcmd v4.0.0 +- 08ab63d7 cloudcmd: supertape v11.0.4 +- e7cc9b92 cloudcmd: redlint v4.1.1 +- 368c9bb8 cloudcmd: eslint v9.23.0 +- 43fd5ed6 cloudcmd: madrun v11.0.0 +- f774d5b2 cloudcmd: eslint-plugin-putout v26.1.0 +- b0a7fc16 cloudcmd: putout v39.3.0 + 2025.02.03, v18.5.1 feature: diff --git a/HELP.md b/HELP.md index f002d2d9..1e445be7 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.1 +# Cloud Commander v18.5.2 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1098,6 +1098,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2025.04.10*, **[v18.5.2](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.2)** - *2025.02.03*, **[v18.5.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.1)** - *2025.01.20*, **[v18.5.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.0)** - *2024.12.13*, **[v18.4.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.4.1)** diff --git a/README.md b/README.md index a1a4a2f4..a7e5c744 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.5.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index d7f7b639..799c2ca2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.5.1", + "version": "18.5.2", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From b26c8bba3744a72e756df76e4264a434b16dacd6 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 24 Apr 2025 17:19:31 +0300 Subject: [PATCH 0583/1230] feature: cloudcmd: thread-it v3.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 799c2ca2..d147cfc8 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "socket.io-client": "^4.0.1", "squad": "^3.0.0", "table": "^6.0.1", - "thread-it": "^2.0.0", + "thread-it": "^3.0.0", "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", From 2a97ac66fb7e570355c2efc0841aadcb5b8b3417 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 17:14:47 +0300 Subject: [PATCH 0584/1230] feature: cloudcmd: yargs-parser v22.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d147cfc8..8d2b91a1 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "win32": "^7.0.0", "wraptile": "^3.0.0", "writejson": "^3.0.0", - "yargs-parser": "^21.0.0" + "yargs-parser": "^22.0.0" }, "devDependencies": { "@babel/code-frame": "^7.22.5", From 8ccec23d6c9a55e04a18f43d34c0623e74deadeb Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 17:16:39 +0300 Subject: [PATCH 0585/1230] feature: cloudcmd: help: require -> import --- bin/cloudcmd.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index e6b4c1a9..b82e887c 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -316,7 +316,11 @@ async function readConfig(name) { } async function help() { - const bin = require('../json/help.json'); + const {default: bin} = await import('../json/help.json', { + with: { + type: 'json' + } + }); const forEachKey = await simport('for-each-key'); const currify = await simport('currify'); From 99ad0c217d7fa03c3622d11a3800b0bb72a9460c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 17:16:50 +0300 Subject: [PATCH 0586/1230] feature: cloudcmd: rm @putout/babel --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 8d2b91a1..6e56f6d6 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,6 @@ "@cloudcmd/modal": "^3.0.0", "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^4.0.1", - "@putout/babel": "^3.0.0", "@putout/plugin-cloudcmd": "^4.0.0", "@types/node-fetch": "^2.6.11", "auto-globals": "^4.0.0", From 4ab4be124bc4e0d332ede37e0ca1ab46032b358c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 18:34:59 +0300 Subject: [PATCH 0587/1230] feature: thread-it: get rid (#438) --- package.json | 1 - server/markdown/index.js | 4 +--- server/server.mjs | 2 -- server/user-menu.mjs | 5 +---- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 6e56f6d6..e43f4de8 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,6 @@ "socket.io-client": "^4.0.1", "squad": "^3.0.0", "table": "^6.0.1", - "thread-it": "^3.0.0", "try-catch": "^3.0.0", "try-to-catch": "^3.0.0", "tryrequire": "^3.0.0", diff --git a/server/markdown/index.js b/server/markdown/index.js index cb6096ac..bf8fa455 100644 --- a/server/markdown/index.js +++ b/server/markdown/index.js @@ -5,14 +5,12 @@ const {callbackify} = require('node:util'); const pullout = require('pullout'); const ponse = require('ponse'); -const threadIt = require('thread-it'); const {read} = require('redzip'); const root = require('../root'); const isString = (a) => typeof a === 'string'; -const parse = threadIt(join(__dirname, 'worker')); +const parse = require('./worker'); -threadIt.init(); // warm up parse(''); diff --git a/server/server.mjs b/server/server.mjs index 9bdd1f3f..096f9f40 100644 --- a/server/server.mjs +++ b/server/server.mjs @@ -10,7 +10,6 @@ import {Server} from 'socket.io'; import tryRequire from 'tryrequire'; import wraptile from 'wraptile'; import compression from 'compression'; -import threadIt from 'thread-it'; import exit from './exit.js'; import cloudcmd from './cloudcmd.mjs'; @@ -20,7 +19,6 @@ const two = currify((f, a, b) => f(a, b)); const shutdown = wraptile(async (promises) => { console.log('closing cloudcmd...'); await Promise.all(promises); - threadIt.terminate(); process.exit(0); }); diff --git a/server/user-menu.mjs b/server/user-menu.mjs index cad6f9b1..c7d85855 100644 --- a/server/user-menu.mjs +++ b/server/user-menu.mjs @@ -5,13 +5,10 @@ import {join} from 'node:path'; import montag from 'montag'; import tryToCatch from 'try-to-catch'; import currify from 'currify'; -import threadIt from 'thread-it'; -import {codeframe} from 'putout'; +import {putout, codeframe} from 'putout'; const require = createRequire(import.meta.url); -const putout = threadIt(require.resolve('putout')); -threadIt.init(); // warm up worker cache transpile(''); From f4b0f92f05b20ecc6e393087373b84ffbaade1c1 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 18:40:04 +0300 Subject: [PATCH 0588/1230] feature: cloudcmd: express v5.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e43f4de8..27de7048 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "edward": "^15.0.0", "es6-promisify": "^7.0.0", "execon": "^1.2.0", - "express": "^4.13.0", + "express": "^5.1.0", "files-io": "^4.0.0", "find-up": "^7.0.0", "for-each-key": "^2.0.0", From 9a4cf388d36af1052532c3ebe48d7f17b99b071b Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 18:42:15 +0300 Subject: [PATCH 0589/1230] feature: cloudcmd: eslint-plugin-putout v27.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 27de7048..c4174c95 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ "emitify": "^4.0.1", "eslint": "^9.23.0", "eslint-plugin-n": "^17.0.0-4", - "eslint-plugin-putout": "^26.1.0", + "eslint-plugin-putout": "^27.2.1", "extract-text-webpack-plugin": "^4.0.0-alpha.0", "gritty": "^8.0.0", "gunzip-maybe": "^1.3.1", From 1679b788c230786b5bcc8707bcbd962230357c1c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 19:57:34 +0300 Subject: [PATCH 0590/1230] feature: cloudcmd: webpackbar v7.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4174c95..0f3505a8 100644 --- a/package.json +++ b/package.json @@ -211,7 +211,7 @@ "webpack": "^4.0.0", "webpack-cli": "^3.0.1", "webpack-merge": "^6.0.1", - "webpackbar": "^5.0.0-3" + "webpackbar": "^7.0.0" }, "engines": { "node": ">=20" From 5f0391fc44b0507bf533ce6b61abc3765ba3fb27 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 20:10:47 +0300 Subject: [PATCH 0591/1230] chore: lint --- .putout.json | 3 --- bin/cloudcmd.mjs | 5 +++-- client/key/vim/index.js | 3 ++- client/modules/operation/index.js | 24 ++++++++++++------------ common/base64.spec.js | 20 +++++++++++--------- server/markdown/index.js | 4 ++-- server/user-menu.mjs | 3 --- 7 files changed, 30 insertions(+), 32 deletions(-) diff --git a/.putout.json b/.putout.json index 08b4f06e..1afdcf8b 100644 --- a/.putout.json +++ b/.putout.json @@ -6,9 +6,6 @@ "app.json", "fontello.json" ], - "rules": { - "github/set-node-versions": "off" - }, "match": { "base64": { "types/convert-typeof-to-is-type": "off" diff --git a/bin/cloudcmd.mjs b/bin/cloudcmd.mjs index b82e887c..c8759719 100755 --- a/bin/cloudcmd.mjs +++ b/bin/cloudcmd.mjs @@ -318,9 +318,10 @@ async function readConfig(name) { async function help() { const {default: bin} = await import('../json/help.json', { with: { - type: 'json' - } + type: 'json', + }, }); + const forEachKey = await simport('for-each-key'); const currify = await simport('currify'); diff --git a/client/key/vim/index.js b/client/key/vim/index.js index e8b01558..6a209ea7 100644 --- a/client/key/vim/index.js +++ b/client/key/vim/index.js @@ -29,8 +29,9 @@ const getOperations = (event, deps) => { setCurrentFile, setCurrentByName, getCurrentName, + toggleSelectedFile, - Buffer = {}, + Buffer = {}, } = deps; return { diff --git a/client/modules/operation/index.js b/client/modules/operation/index.js index bf19bda8..8105e85f 100644 --- a/client/modules/operation/index.js +++ b/client/modules/operation/index.js @@ -59,19 +59,19 @@ module.exports.init = promisify((callback) => { exec.series([ DOM.loadSocket, async (callback) => { - if (config('dropbox')) - return callback(); - - const {prefix, prefixSocket} = CloudCmd; - - await loadAll(); - await initOperations(prefix, prefixSocket, callback); - }, + if (config('dropbox')) + return callback(); + + const {prefix, prefixSocket} = CloudCmd; + + await loadAll(); + await initOperations(prefix, prefixSocket, callback); + }, (callback) => { - Loaded = true; - Images.hide(); - callback(); - }, + Loaded = true; + Images.hide(); + callback(); + }, ], callback); }); diff --git a/common/base64.spec.js b/common/base64.spec.js index bc3ea2f5..cc096ee2 100644 --- a/common/base64.spec.js +++ b/common/base64.spec.js @@ -6,16 +6,16 @@ const {btoa, atob} = require('./base64'); test('btoa: browser', (t) => { const btoaOriginal = global.btoa; + const btoaStub = stub(); const str = 'hello'; - global.btoa = stub(); + global.btoa = btoaStub; btoa(str); - - t.calledWith(global.btoa, [str], 'should call global.btoa'); - t.end(); - global.btoa = btoaOriginal; + + t.calledWith(btoaStub, [str], 'should call global.btoa'); + t.end(); }); test('btoa: node', (t) => { @@ -30,16 +30,18 @@ test('btoa: node', (t) => { test('atob: browser', (t) => { const atobOriginal = global.atob; + const atobStub = stub(); + const str = 'hello'; - global.atob = stub(); + global.atob = atobStub; atob(str); - t.calledWith(global.atob, [str], 'should call global.btoa'); - t.end(); - global.atob = atobOriginal; + + t.calledWith(atobStub, [str], 'should call global.btoa'); + t.end(); }); test('atob: node', (t) => { diff --git a/server/markdown/index.js b/server/markdown/index.js index bf8fa455..639e219d 100644 --- a/server/markdown/index.js +++ b/server/markdown/index.js @@ -1,6 +1,5 @@ 'use strict'; -const {join} = require('node:path'); const {callbackify} = require('node:util'); const pullout = require('pullout'); @@ -8,8 +7,9 @@ const ponse = require('ponse'); const {read} = require('redzip'); const root = require('../root'); -const isString = (a) => typeof a === 'string'; + const parse = require('./worker'); +const isString = (a) => typeof a === 'string'; // warm up parse(''); diff --git a/server/user-menu.mjs b/server/user-menu.mjs index c7d85855..5ae51536 100644 --- a/server/user-menu.mjs +++ b/server/user-menu.mjs @@ -1,4 +1,3 @@ -import {createRequire} from 'node:module'; import {homedir} from 'node:os'; import {readFile as _readFile} from 'node:fs/promises'; import {join} from 'node:path'; @@ -7,8 +6,6 @@ import tryToCatch from 'try-to-catch'; import currify from 'currify'; import {putout, codeframe} from 'putout'; -const require = createRequire(import.meta.url); - // warm up worker cache transpile(''); From 2eb3dc669259c0bd3aa0470dadf14dc9cb66cbe9 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 21:17:14 +0300 Subject: [PATCH 0592/1230] feature: cloudcmd: @iocmd/wait v2.1.0 --- package.json | 1 + server/user-menu.spec.mjs | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 0f3505a8..c36f415e 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ "@cloudcmd/modal": "^3.0.0", "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^4.0.1", + "@iocmd/wait": "^2.1.0", "@putout/plugin-cloudcmd": "^4.0.0", "@types/node-fetch": "^2.6.11", "auto-globals": "^4.0.0", diff --git a/server/user-menu.spec.mjs b/server/user-menu.spec.mjs index 0125bd9e..635c7746 100644 --- a/server/user-menu.spec.mjs +++ b/server/user-menu.spec.mjs @@ -3,7 +3,6 @@ import {fileURLToPath} from 'node:url'; import {readFileSync} from 'node:fs'; import {test, stub} from 'supertape'; import serveOnce from 'serve-once'; -import threadIt from 'thread-it'; import userMenu from './user-menu.mjs'; const __filename = fileURLToPath(import.meta.url); @@ -67,8 +66,6 @@ test('cloudcmd: user menu: io.cp', async (t) => { options, }); - threadIt.terminate(); - t.equal(body, fixtureCopyFix); t.end(); }); From a87e5ceaf65fb095b63ba6507bc85009a8ed9fa8 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Wed, 2 Jul 2025 21:18:44 +0300 Subject: [PATCH 0593/1230] chore: cloudcmd: v18.6.0 --- ChangeLog | 13 +++++++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 826f9ea3..d916b549 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2025.07.02, v18.6.0 + +feature: +- 2eb3dc66 cloudcmd: @iocmd/wait v2.1.0 +- 1679b788 cloudcmd: webpackbar v7.0.0 +- 9a4cf388 cloudcmd: eslint-plugin-putout v27.2.1 +- f4b0f92f cloudcmd: express v5.1.0 +- 4ab4be12 thread-it: get rid (#438) +- 99ad0c21 cloudcmd: rm @putout/babel +- 8ccec23d cloudcmd: help: require -> import +- 2a97ac66 cloudcmd: yargs-parser v22.0.0 +- b26c8bba cloudcmd: thread-it v3.0.0 + 2025.04.10, v18.5.2 feature: diff --git a/HELP.md b/HELP.md index 1e445be7..fe68d6c2 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.2 +# Cloud Commander v18.6.0 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1098,6 +1098,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2025.07.02*, **[v18.6.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.6.0)** - *2025.04.10*, **[v18.5.2](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.2)** - *2025.02.03*, **[v18.5.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.1)** - *2025.01.20*, **[v18.5.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.0)** diff --git a/README.md b/README.md index a7e5c744..8ef53740 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.5.2 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.6.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index c36f415e..b0930aef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.5.2", + "version": "18.6.0", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From 2057065dbfb6306effb19bb919d9f50df233620d Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 3 Jul 2025 23:20:53 +0300 Subject: [PATCH 0594/1230] feature: cloudcmd: @putout/eslint-flat v3.0.1 --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b0930aef..e9b4ce09 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ "@cloudcmd/olark": "^3.0.2", "@cloudcmd/stub": "^4.0.1", "@iocmd/wait": "^2.1.0", + "@putout/eslint-flat": "^3.0.1", "@putout/plugin-cloudcmd": "^4.0.0", "@types/node-fetch": "^2.6.11", "auto-globals": "^4.0.0", @@ -215,7 +216,7 @@ "webpackbar": "^7.0.0" }, "engines": { - "node": ">=20" + "node": ">=20.19" }, "license": "MIT", "publishConfig": { From 4b476a6dff7bc42fea4de68e5c296be60e6eb8d3 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 3 Jul 2025 23:20:57 +0300 Subject: [PATCH 0595/1230] feature: cloudcmd: globals v16.3.0 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e9b4ce09..ba5c5d4d 100644 --- a/package.json +++ b/package.json @@ -175,6 +175,7 @@ "eslint-plugin-n": "^17.0.0-4", "eslint-plugin-putout": "^27.2.1", "extract-text-webpack-plugin": "^4.0.0-alpha.0", + "globals": "^16.3.0", "gritty": "^8.0.0", "gunzip-maybe": "^1.3.1", "html-looks-like": "^1.0.2", From b77e9c91d4746bfc27beaae2cb498ab671173e0d Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 3 Jul 2025 23:21:05 +0300 Subject: [PATCH 0596/1230] feature: cloudcmd: pipe-io v4.0.1 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index ba5c5d4d..1ef5b304 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "onezip": "^6.0.1", "open": "^10.0.3", "package-json": "^10.0.0", + "pipe-io": "^4.0.1", "ponse": "^7.0.0", "pullout": "^5.0.0", "putout": "^40.0.3", From e99d084728e9c7eebfa52752676495d912c5707f Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 3 Jul 2025 23:21:44 +0300 Subject: [PATCH 0597/1230] feature: cloudcmd: montag v1.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ef5b304..3bbed088 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "just-snake-case": "^3.2.0", "markdown-it": "^14.0.0", "mellow": "^3.0.0", + "montag": "^1.2.1", "nano-memoize": "^3.0.16", "nomine": "^4.0.0", "object.omit": "^3.0.0", @@ -190,7 +191,6 @@ "memfs": "^4.2.0", "minor": "^1.2.2", "mock-require": "^3.0.1", - "montag": "^1.2.1", "morgan": "^1.6.1", "multi-rename": "^2.0.0", "nodemon": "^3.0.1", From af77eeed8d33e5aaf8c466cab75da0efe98b002d Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 12:51:42 +0300 Subject: [PATCH 0598/1230] chore: lint --- .npmignore | 4 +- bin/release.mjs | 4 +- client/key/vim/index.js | 2 +- client/listeners/index.js | 5 +- client/modules/operation/index.js | 24 ++++---- client/modules/user-menu/navigate.js | 7 ++- client/modules/user-menu/navigate.spec.js | 7 ++- common/cloudfunc.js | 71 ++++++++++++----------- eslint.config.mjs | 42 ++++++++++++++ package.json | 1 + server/repl.js | 36 ++++++------ server/show-config.js | 6 +- server/user-menu.mjs | 8 +-- test/common/cloudfunc.js | 17 +++--- 14 files changed, 143 insertions(+), 91 deletions(-) create mode 100644 eslint.config.mjs diff --git a/.npmignore b/.npmignore index 0ecde705..eb036c9d 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,5 @@ .* -*.spec.js +*.spec.* *.fixture.js* manifest.yml docker @@ -19,7 +19,7 @@ app.json bower.json manifest.yml -bin/release.js +bin/release.mjs client img/logo/cloudcmd-hq.png diff --git a/bin/release.mjs b/bin/release.mjs index ee55509a..694eb7da 100755 --- a/bin/release.mjs +++ b/bin/release.mjs @@ -19,8 +19,8 @@ await main(); async function main() { const history = '## Version history\n\n'; const link = '//github.com/coderaiser/cloudcmd/releases/tag/'; - const template = - '- *{{ date }}*, ' + + const template = '- ' + + '*{{ date }}*, ' + '**[v{{ version }}]' + '(' + link + 'v{{ version }})**\n'; diff --git a/client/key/vim/index.js b/client/key/vim/index.js index 6a209ea7..7c94f773 100644 --- a/client/key/vim/index.js +++ b/client/key/vim/index.js @@ -31,7 +31,7 @@ const getOperations = (event, deps) => { getCurrentName, toggleSelectedFile, - Buffer = {}, + Buffer = {}, } = deps; return { diff --git a/client/listeners/index.js b/client/listeners/index.js index 3bd0ce9c..8e948d67 100644 --- a/client/listeners/index.js +++ b/client/listeners/index.js @@ -215,8 +215,7 @@ async function onPathElementClick(panel, event) { function copyPath(el) { clipboard - .writeText(el - .parentElement.title) + .writeText(el.parentElement.title) .then(CloudCmd.log) .catch(CloudCmd.log); } @@ -422,7 +421,7 @@ function dragndrop() { }; /** - * In Mac OS Chrome dropEffect = 'none' + * In macOS Chrome dropEffect = 'none' * so drop do not firing up when try * to upload file from download bar */ diff --git a/client/modules/operation/index.js b/client/modules/operation/index.js index 8105e85f..bf19bda8 100644 --- a/client/modules/operation/index.js +++ b/client/modules/operation/index.js @@ -59,19 +59,19 @@ module.exports.init = promisify((callback) => { exec.series([ DOM.loadSocket, async (callback) => { - if (config('dropbox')) - return callback(); - - const {prefix, prefixSocket} = CloudCmd; - - await loadAll(); - await initOperations(prefix, prefixSocket, callback); - }, + if (config('dropbox')) + return callback(); + + const {prefix, prefixSocket} = CloudCmd; + + await loadAll(); + await initOperations(prefix, prefixSocket, callback); + }, (callback) => { - Loaded = true; - Images.hide(); - callback(); - }, + Loaded = true; + Images.hide(); + callback(); + }, ], callback); }); diff --git a/client/modules/user-menu/navigate.js b/client/modules/user-menu/navigate.js index d3c89830..445d47d1 100644 --- a/client/modules/user-menu/navigate.js +++ b/client/modules/user-menu/navigate.js @@ -2,7 +2,12 @@ const fullstore = require('fullstore'); -const {J, K, UP, DOWN} = require('../../key/key.js'); +const { + J, + K, + UP, + DOWN, +} = require('../../key/key.js'); const store = fullstore(1); const isDigit = (a) => /^\d+$/.test(a); diff --git a/client/modules/user-menu/navigate.spec.js b/client/modules/user-menu/navigate.spec.js index 5dbbfb81..abf95aab 100644 --- a/client/modules/user-menu/navigate.spec.js +++ b/client/modules/user-menu/navigate.spec.js @@ -3,7 +3,12 @@ const test = require('supertape'); const navigate = require('./navigate'); -const {UP, DOWN, J, K} = require('../../key/key.js'); +const { + UP, + DOWN, + J, + K, +} = require('../../key/key.js'); test('cloudcmd: user-menu: navigate: DOWN', (t) => { const el = { diff --git a/common/cloudfunc.js b/common/cloudfunc.js index 66ec044f..c906b548 100644 --- a/common/cloudfunc.js +++ b/common/cloudfunc.js @@ -173,6 +173,7 @@ module.exports.buildFromJSON = (params) => { Path(path); fileTable += `${header}
      `; + /* Если мы не в корне */ if (path !== '/') { const dotDot = getDotDot(path); @@ -203,43 +204,43 @@ module.exports.buildFromJSON = (params) => { fileTable += files .filter(filterOutDotFiles({ - showDotFiles, - })) + showDotFiles, + })) .map(updateField) .map((file) => { - const name = encode(file.name); - const link = prefix + FS + path + name; - - const { - type, - mode, - date, - owner, - size, - } = file; - - const linkResult = rendy(templateLink, { - link, - title: name, - name, - attribute: getAttribute(file.type), - }); - - const dataName = getDataName(file.name); - const attribute = `draggable="true" ${dataName}`; - - return rendy(templateFile, { - tag: 'li', - attribute, - className: '', - type, - name: linkResult, - size, - date, - owner, - mode, - }); - }) + const name = encode(file.name); + const link = prefix + FS + path + name; + + const { + type, + mode, + date, + owner, + size, + } = file; + + const linkResult = rendy(templateLink, { + link, + title: name, + name, + attribute: getAttribute(file.type), + }); + + const dataName = getDataName(file.name); + const attribute = `draggable="true" ${dataName}`; + + return rendy(templateFile, { + tag: 'li', + attribute, + className: '', + type, + name: linkResult, + size, + date, + owner, + mode, + }); + }) .join(''); fileTable += '
    '; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..b7808852 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,42 @@ +import {safeAlign} from 'eslint-plugin-putout'; +import {defineConfig} from 'eslint/config'; +import n from 'eslint-plugin-n'; +import globals from 'globals'; +import {matchToFlat} from '@putout/eslint-flat'; + +export const match = { + 'bin/release.mjs': { + 'no-console': 'off', + 'n/hashbang': 'off', + }, + 'client/dom/index.js': { + 'no-multi-spaces': 'off', + }, + 'client/**/*.js': { + 'n/no-extraneous-require': 'off', + 'n/no-unsupported-features/node-builtins': 'off', + }, + 'bin/cloudcmd.js': { + 'no-console': 'off', + }, +}; +export default defineConfig([ + safeAlign, { + ignores: ['**/fixture'], + rules: { + 'key-spacing': 'off', + 'n/prefer-node-protocol': 'error', + }, + plugins: { + n, + }, + }, { + files: ['{client,common,static}/**/*.js'], + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, + ...matchToFlat(match), +]); diff --git a/package.json b/package.json index 3bbed088..7ee17729 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "just-snake-case": "^3.2.0", "markdown-it": "^14.0.0", "mellow": "^3.0.0", + "mime-types": "^3.0.1", "montag": "^1.2.1", "nano-memoize": "^3.0.16", "nomine": "^4.0.0", diff --git a/server/repl.js b/server/repl.js index c1647f04..0c4d5279 100644 --- a/server/repl.js +++ b/server/repl.js @@ -6,22 +6,22 @@ const repl = require('node:repl'); module.exports = net .createServer((socket) => { - const {pid} = process; - const addr = socket.remoteAddress; - const port = socket.remotePort; - - const r = repl.start({ - prompt: `[${pid} ${addr}:${port}>`, - input: socket, - output: socket, - terminal: true, - useGlobal: false, - }); - - r.on('exit', () => { - socket.end(); - }); - - r.context.socket = socket; -}) + const {pid} = process; + const addr = socket.remoteAddress; + const port = socket.remotePort; + + const r = repl.start({ + prompt: `[${pid} ${addr}:${port}>`, + input: socket, + output: socket, + terminal: true, + useGlobal: false, + }); + + r.on('exit', () => { + socket.end(); + }); + + r.context.socket = socket; + }) .listen(1337); diff --git a/server/show-config.js b/server/show-config.js index 78180b79..065fd7dd 100644 --- a/server/show-config.js +++ b/server/show-config.js @@ -11,9 +11,9 @@ module.exports = (config) => { const data = Object .keys(config) .map((name) => [ - name, - config[name], - ]); + name, + config[name], + ]); if (!data.length) return ''; diff --git a/server/user-menu.mjs b/server/user-menu.mjs index 5ae51536..1100e1f3 100644 --- a/server/user-menu.mjs +++ b/server/user-menu.mjs @@ -74,10 +74,10 @@ async function onGET({req, res, menuName, readFile}) { function getError(error, source) { return montag` const e = Error(\`
    ${codeframe({
    -        error,
    -        source,
    -        highlightCode: false,
    -    })}
    \`); + error, + source, + highlightCode: false, + })}
    \`); e.code = 'frame'; diff --git a/test/common/cloudfunc.js b/test/common/cloudfunc.js index c8acadea..185ff7b5 100644 --- a/test/common/cloudfunc.js +++ b/test/common/cloudfunc.js @@ -44,8 +44,7 @@ const data = { }], }; -let Expect = - '
    ' + +let Expect = '
    ' + '' + '' + @@ -75,13 +74,13 @@ test('cloudfunc: render', (t) => { const isNotOk = Expect .split('') .some((item, number) => { - const ret = result[number] !== item; - - if (ret) - i = number; - - return ret; - }); + const ret = result[number] !== item; + + if (ret) + i = number; + + return ret; + }); timeEnd('CloudFunc.buildFromJSON'); From 0d61a972fbbdef6c95b4c3b8e5f7374d57ec4b13 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 13:32:47 +0300 Subject: [PATCH 0599/1230] chore: lint --- .npmignore | 2 +- eslint.config.mjs | 2 +- package.json | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.npmignore b/.npmignore index eb036c9d..08137773 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,6 @@ .* *.spec.* +*.config.* *.fixture.js* manifest.yml docker @@ -13,7 +14,6 @@ html yarn-error.log yarn.lock now.json -cssnano.config.js app.json bower.json diff --git a/eslint.config.mjs b/eslint.config.mjs index b7808852..d445c4a9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,7 +12,7 @@ export const match = { 'client/dom/index.js': { 'no-multi-spaces': 'off', }, - 'client/**/*.js': { + '{client,static}/**/*.js': { 'n/no-extraneous-require': 'off', 'n/no-unsupported-features/node-builtins': 'off', }, diff --git a/package.json b/package.json index 7ee17729..fc54a917 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ }, "subdomain": "cloudcmd", "dependencies": { - "@babel/core": "^7.22.9", + "@babel/core": "^8.0.0-beta.1", "@babel/plugin-transform-optional-chaining": "^7.21.0", "@cloudcmd/dropbox": "^5.0.1", "@cloudcmd/fileop": "^8.0.0", @@ -172,6 +172,7 @@ "codegen.macro": "^4.0.0", "css-loader": "^3.0.0", "css-modules-require-hook": "^4.2.3", + "cssnano-preset-default": "^7.0.7", "domtokenlist-shim": "^1.2.0", "emitify": "^4.0.1", "eslint": "^9.23.0", From baaf47e62f3d49079fe86fea11bbb1a5df0f7117 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 4 Jul 2025 10:34:29 +0000 Subject: [PATCH 0600/1230] =?UTF-8?q?chore:=20cloudcmd:=20actions:=20lint?= =?UTF-8?q?=20=E2=98=98=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/dom/current-file.js | 3 +-- client/modules/edit-file.js | 9 +++------ client/modules/edit-names-vim.js | 3 +-- client/modules/edit-names.js | 3 +-- client/modules/view/index.js | 3 +-- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/client/dom/current-file.js b/client/dom/current-file.js index 3dd831c4..1150de2a 100644 --- a/client/dom/current-file.js +++ b/client/dom/current-file.js @@ -305,8 +305,7 @@ module.exports.isCurrentIsDir = (currentFile) => { module.exports.getCurrentType = (currentFile) => { const current = currentFile || DOM.getCurrentFile(); const el = DOM.getByDataName('js-type', current); - const type = el - .className + const type = el.className .split(' ') .pop(); diff --git a/client/modules/edit-file.js b/client/modules/edit-file.js index 5551a155..f631351a 100644 --- a/client/modules/edit-file.js +++ b/client/modules/edit-file.js @@ -61,8 +61,7 @@ module.exports.show = async (options) => { Images.show.load(); - CloudCmd - .Edit + CloudCmd.Edit .getEditor() .setOption('keyMap', 'default'); @@ -78,8 +77,7 @@ module.exports.show = async (options) => { setMsgChanged(name); - CloudCmd - .Edit + CloudCmd.Edit .getEditor() .setValueFirst(path, data) .setModeForPath(name) @@ -131,8 +129,7 @@ function setMenu(event) { }, afterClick: () => { - CloudCmd - .Edit + CloudCmd.Edit .getEditor() .focus(); }, diff --git a/client/modules/edit-names-vim.js b/client/modules/edit-names-vim.js index 540259e5..266dc9dc 100644 --- a/client/modules/edit-names-vim.js +++ b/client/modules/edit-names-vim.js @@ -21,8 +21,7 @@ module.exports.init = async () => { module.exports.show = () => { Events.addKey(listener); - CloudCmd - .EditNames + CloudCmd.EditNames .show(ConfigView) .getEditor() .setKeyMap('vim'); diff --git a/client/modules/edit-names.js b/client/modules/edit-names.js index c0b9ae84..c2eaac12 100644 --- a/client/modules/edit-names.js +++ b/client/modules/edit-names.js @@ -44,8 +44,7 @@ module.exports.show = (options) => { DOM.Events.addKey(keyListener); - CloudCmd - .Edit + CloudCmd.Edit .getEditor() .setValueFirst('edit-names', names) .setMode() diff --git a/client/modules/view/index.js b/client/modules/view/index.js index 17a3b1fa..e78d507b 100644 --- a/client/modules/view/index.js +++ b/client/modules/view/index.js @@ -263,8 +263,7 @@ function viewImage(path, prefixURL) { title: encode(basename(path)), }); - const names = Info - .files + const names = Info.files .map(DOM.getCurrentPath) .filter(isSupportedImage); From 9eafa189a801765d5e10cbd84aa4ab67b2ac7413 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 13:33:37 +0300 Subject: [PATCH 0601/1230] feature: cloudcmd: http-auth v4.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc54a917..ef209655 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "for-each-key": "^2.0.0", "format-io": "^2.0.0", "fullstore": "^3.0.0", - "http-auth": "4.1.2 || > 4.1.3", + "http-auth": "^4.2.1", "inly": "^5.0.0", "jaguar": "^6.0.0", "jju": "^1.3.0", From a54caa1d7cdb2b6d51ea979170614ef66a2f0c6c Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 13:41:12 +0300 Subject: [PATCH 0602/1230] chore: lint --- .putout.json | 3 ++- eslint.config.mjs | 3 +++ package.json | 3 +-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.putout.json b/.putout.json index 1afdcf8b..239eb08d 100644 --- a/.putout.json +++ b/.putout.json @@ -4,7 +4,8 @@ "html", "fixture*", "app.json", - "fontello.json" + "fontello.json", + "*.md" ], "match": { "base64": { diff --git a/eslint.config.mjs b/eslint.config.mjs index d445c4a9..ad22cf4a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -19,6 +19,9 @@ export const match = { 'bin/cloudcmd.js': { 'no-console': 'off', }, + 'cssnano.config.js': { + 'n/no-extraneous-require': 'off', + }, }; export default defineConfig([ safeAlign, { diff --git a/package.json b/package.json index ef209655..631104b7 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ }, "subdomain": "cloudcmd", "dependencies": { - "@babel/core": "^8.0.0-beta.1", "@babel/plugin-transform-optional-chaining": "^7.21.0", "@cloudcmd/dropbox": "^5.0.1", "@cloudcmd/fileop": "^8.0.0", @@ -152,6 +151,7 @@ "yargs-parser": "^22.0.0" }, "devDependencies": { + "@babel/core": "^7.22.5", "@babel/code-frame": "^7.22.5", "@babel/preset-env": "^7.0.0", "@cloudcmd/clipboard": "^2.0.0", @@ -172,7 +172,6 @@ "codegen.macro": "^4.0.0", "css-loader": "^3.0.0", "css-modules-require-hook": "^4.2.3", - "cssnano-preset-default": "^7.0.7", "domtokenlist-shim": "^1.2.0", "emitify": "^4.0.1", "eslint": "^9.23.0", From ef423308487cf4ced7fd06d7b4d04378a0868055 Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 13:41:56 +0300 Subject: [PATCH 0603/1230] chore: cloudcmd: v18.6.1 --- ChangeLog | 9 +++++++++ HELP.md | 3 ++- README.md | 2 +- package.json | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d916b549..f92a26ce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2025.07.04, v18.6.1 + +feature: +- 9eafa189 cloudcmd: http-auth v4.2.1 +- e99d0847 cloudcmd: montag v1.2.1 +- b77e9c91 cloudcmd: pipe-io v4.0.1 +- 4b476a6d cloudcmd: globals v16.3.0 +- 2057065d cloudcmd: @putout/eslint-flat v3.0.1 + 2025.07.02, v18.6.0 feature: diff --git a/HELP.md b/HELP.md index fe68d6c2..7116cc2b 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.6.0 +# Cloud Commander v18.6.1 ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] @@ -1098,6 +1098,7 @@ There are a lot of ways to be involved in `Cloud Commander` development: ## Version history +- *2025.07.04*, **[v18.6.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.6.1)** - *2025.07.02*, **[v18.6.0](//github.com/coderaiser/cloudcmd/releases/tag/v18.6.0)** - *2025.04.10*, **[v18.5.2](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.2)** - *2025.02.03*, **[v18.5.1](//github.com/coderaiser/cloudcmd/releases/tag/v18.5.1)** diff --git a/README.md b/README.md index 8ef53740..7c46ac5c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cloud Commander v18.6.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] +# Cloud Commander v18.6.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] ### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL] diff --git a/package.json b/package.json index 631104b7..737665b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudcmd", - "version": "18.6.0", + "version": "18.6.1", "type": "commonjs", "author": "coderaiser (https://github.com/coderaiser)", "description": "File manager for the web with console and editor", From ddc94adbf135de8988513a4dd327ad53971f6ffb Mon Sep 17 00:00:00 2001 From: coderiaser Date: Fri, 4 Jul 2025 14:23:05 +0300 Subject: [PATCH 0604/1230] feature: cloudcmd: eslint-plugin-putout v28.0.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 737665b7..1d69fc33 100644 --- a/package.json +++ b/package.json @@ -151,8 +151,8 @@ "yargs-parser": "^22.0.0" }, "devDependencies": { - "@babel/core": "^7.22.5", "@babel/code-frame": "^7.22.5", + "@babel/core": "^7.22.5", "@babel/preset-env": "^7.0.0", "@cloudcmd/clipboard": "^2.0.0", "@cloudcmd/create-element": "^2.0.0", @@ -176,7 +176,7 @@ "emitify": "^4.0.1", "eslint": "^9.23.0", "eslint-plugin-n": "^17.0.0-4", - "eslint-plugin-putout": "^27.2.1", + "eslint-plugin-putout": "^28.0.0", "extract-text-webpack-plugin": "^4.0.0-alpha.0", "globals": "^16.3.0", "gritty": "^8.0.0", From c93803190bd3afe38991a424b5399d81847da74f Mon Sep 17 00:00:00 2001 From: coderiaser Date: Thu, 3 Jul 2025 23:05:16 +0300 Subject: [PATCH 0605/1230] feature: webpack 5 --- .madrun.mjs | 2 + .webpack/cp.mjs | 17 ++++++++ .webpack/css.js | 74 +++++++++------------------------- .webpack/js.js | 59 +++++++++++++++++++++++---- client/client.js | 7 ---- client/cloudcmd.js | 2 +- client/css.js | 8 ---- client/modules/config/index.js | 4 +- css/main.css | 2 +- html/index.html | 2 +- package.json | 4 +- server/columns.mjs | 2 +- server/theme.mjs | 6 ++- 13 files changed, 99 insertions(+), 90 deletions(-) create mode 100644 .webpack/cp.mjs delete mode 100644 client/css.js diff --git a/.madrun.mjs b/.madrun.mjs index 0cc7a5ec..391eb946 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -16,6 +16,7 @@ const is20 = process.version.startsWith('v2'); // https://stackoverflow.com/a/69746937/4536327 const buildEnv = (is17 || is20) && { NODE_OPTIONS: '--openssl-legacy-provider', + NODE_ENV: 'production', }; export default { @@ -56,6 +57,7 @@ export default { 'watch:test:server': async () => `nodemon -w client -w test/client -x ${await run('test:server')}`, 'watch:coverage': async () => [testEnv, `nodemon -w server -w test -w common -x ${await cutEnv('coverage')}`], 'build': async () => run('6to5:*'), + 'postbuild': () => 'node .webpack/cp.mjs', 'build:dev': async () => run('build:client:dev'), 'build:client': () => run('6to5:client'), 'build:client:dev': () => run('6to5:client:dev'), diff --git a/.webpack/cp.mjs b/.webpack/cp.mjs new file mode 100644 index 00000000..1dacb044 --- /dev/null +++ b/.webpack/cp.mjs @@ -0,0 +1,17 @@ +import {cpSync} from 'node:fs'; + +cpSync('./css/columns', './dist-dev/columns', { + recursive: true, +}); + +cpSync('./css/themes', './dist-dev/themes', { + recursive: true, +}); + +cpSync('./css/columns', './dist/columns', { + recursive: true, +}); + +cpSync('./css/themes', './dist/themes', { + recursive: true, +}); diff --git a/.webpack/css.js b/.webpack/css.js index e1d6552d..7b4486e1 100644 --- a/.webpack/css.js +++ b/.webpack/css.js @@ -1,77 +1,39 @@ 'use strict'; -const {env} = require('node:process'); -const fs = require('node:fs'); -const { - basename, - extname, - join, -} = require('node:path'); +const {env} = require('node:process') -const ExtractTextPlugin = require('extract-text-webpack-plugin'); const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const isDev = env.NODE_ENV === 'development'; -const extractCSS = (a) => new ExtractTextPlugin(`${a}.css`); -const extractMain = extractCSS('[name]'); - -const cssNames = [ - 'nojs', - 'view', - 'config', - 'terminal', - 'user-menu', - ...getCSSList('columns'), - ...getCSSList('themes'), -]; - -const cssPlugins = cssNames.map(extractCSS); const clean = (a) => a.filter(Boolean); const plugins = clean([ - ...cssPlugins, - extractMain, + new MiniCssExtractPlugin({ + filename: '[name].css', + }), !isDev && new OptimizeCssAssetsPlugin(), ]); const rules = [{ - test: /\.css$/, - exclude: /css\/(nojs|view|config|terminal|user-menu|columns.*|themes.*)\.css/, - use: extractMain.extract(['css-loader']), -}, ...cssPlugins.map(extract), { - test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/, - use: { - loader: 'url-loader', + test: /\.css$/i, + use: [MiniCssExtractPlugin.loader, { + loader: "css-loader", options: { - limit: 100_000, + url: true, }, - }, -}]; + }], + }, { + test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/, + type: 'asset/inline', +}] + module.exports = { plugins, - module: { - rules, - }, + module: { + rules, + }, }; -function getCSSList(dir) { - const base = (a) => basename(a, extname(a)); - const addDir = (name) => `${dir}/${name}`; - const rootDir = join(__dirname, '..'); - - return fs - .readdirSync(`${rootDir}/css/${dir}`) - .map(base) - .map(addDir); -} - -function extract(extractPlugin) { - const {filename} = extractPlugin; - - return { - test: RegExp(`css/${filename}`), - use: extractPlugin.extract(['css-loader']), - }; -} diff --git a/.webpack/js.js b/.webpack/js.js index d41f9941..1efe48b1 100644 --- a/.webpack/js.js +++ b/.webpack/js.js @@ -7,13 +7,17 @@ const { } = require('node:path'); const {env} = require('node:process'); -const {EnvironmentPlugin} = require('webpack'); +const { + EnvironmentPlugin, + NormalModuleReplacementPlugin, +} = require('webpack'); const WebpackBar = require('webpackbar'); -const ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin'); - const modules = './modules'; const dirModules = './client/modules'; +const dirCss = './css'; +const dirThemes = `${dirCss}/themes`; +const dirColumns = `${dirCss}/columns`; const dir = './client'; const {NODE_ENV} = env; const isDev = NODE_ENV === 'development'; @@ -46,19 +50,43 @@ const rules = clean([ ]); const plugins = [ + new NormalModuleReplacementPlugin(/^node:/, (resource) => { + resource.request = resource.request.replace(/^node:/, ''); + }), new EnvironmentPlugin({ NODE_ENV, }), - new ServiceWorkerWebpackPlugin({ - entry: join(__dirname, '..', 'client', 'sw', 'sw.js'), - excludes: ['*'], - }), new WebpackBar(), ]; const splitChunks = { - name: 'cloudcmd.common', chunks: 'all', + cacheGroups: { + abcCommon: { + name: 'cloudcmd.common', + chunks: (chunk) => { + const lazyChunks = [ + 'nojs', + 'view', + 'edit', + 'terminal', + 'config', + 'user-menu', + 'help', + 'themes/dark', + 'themes/light', + 'columns/name-size', + 'columns/name-size-date', + ]; + + return !lazyChunks.includes(chunk.name); + }, + minChunks: 1, + enforce: true, + priority: -1, + reuseExistingChunk: true, + }, + }, }; module.exports = { @@ -68,12 +96,27 @@ module.exports = { 'node:process': 'process', 'node:path': 'path', }, + fallback: { + 'path': require.resolve('path-browserify'), + 'process': require.resolve('process/browser'), + }, }, devtool, optimization: { splitChunks, }, entry: { + 'themes/dark': `${dirThemes}/dark.css`, + 'themes/light': `${dirThemes}/light.css`, + 'columns/name-size': `${dirColumns}/name-size.css`, + 'columns/name-size-date': `${dirColumns}/name-size-date.css`, + 'nojs': `${dirCss}/nojs.css`, + help: `${dirCss}/help.css`, + view: `${dirCss}/view.css`, + config: `${dirCss}/config.css`, + terminal: `${dirCss}/terminal.css`, + 'user-menu': `${dirCss}/user-menu.css`, + sw: `${dir}/sw/sw.js`, cloudcmd: `${dir}/cloudcmd.js`, [`${modules}/edit`]: `${dirModules}/edit.js`, [`${modules}/edit-file`]: `${dirModules}/edit-file.js`, diff --git a/client/client.js b/client/client.js index 4d53c634..ee164763 100644 --- a/client/client.js +++ b/client/client.js @@ -138,17 +138,10 @@ function CloudCmdProto(DOM) { await initModules(); await baseInit(); - await loadStyle(); CloudCmd.route(location.hash); }; - async function loadStyle() { - const {prefix} = CloudCmd; - const name = `${prefix}/dist/cloudcmd.common.css`; - - await load.css(name); - } this.route = (path) => { const query = path.split('/'); diff --git a/client/cloudcmd.js b/client/cloudcmd.js index 47019e55..9703c6b6 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -1,7 +1,7 @@ 'use strict'; const process = require('node:process'); -require('./css'); +require('../css/main.css'); const wraptile = require('wraptile'); const load = require('load.js'); diff --git a/client/css.js b/client/css.js deleted file mode 100644 index e404bf94..00000000 --- a/client/css.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -require('../css/main.css'); -require('../css/nojs.css'); -require('../css/columns/name-size-date.css'); -require('../css/columns/name-size.css'); -require('../css/themes/light.css'); -require('../css/themes/dark.css'); diff --git a/client/modules/config/index.js b/client/modules/config/index.js index 0ec5b100..f8f3e4f3 100644 --- a/client/modules/config/index.js +++ b/client/modules/config/index.js @@ -52,12 +52,12 @@ module.exports.init = async () => { showLoad(); - const {prefix} = CloudCmd; + const {DIR_DIST} = CloudCmd; [Template] = await Promise.all([ Files.get('config-tmpl'), loadSocket(), - loadCSS(`${prefix}/dist/config.css`), + loadCSS(`${DIR_DIST}/config.css`), CloudCmd.View(), ]); diff --git a/css/main.css b/css/main.css index b30c0ed3..6b901a8e 100644 --- a/css/main.css +++ b/css/main.css @@ -1,5 +1,5 @@ -@import url(./urls.css); @import url(./reset.css); +@import url(./urls.css); @import url(./style.css); @import url(./icons.css); @import url(./help.css); diff --git a/html/index.html b/html/index.html index 0c374b9c..4c4f3ebf 100644 --- a/html/index.html +++ b/html/index.html @@ -8,7 +8,7 @@ - +