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