From d4757902570f56f3ca9f3edfe88b2c67e196c7d3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 22 Dec 2020 16:09:36 +0200 Subject: [PATCH] feature(server) convert to ESM --- bin/cloudcmd.js | 5 +- package.json | 2 +- server/auth.js | 10 +-- server/cloudcmd.js | 89 ++++++++++++----------- server/cloudcmd.spec.js | 12 ++- server/columns.js | 13 ++-- server/config.js | 60 +++++++-------- server/config.spec.js | 20 ++--- server/distribute/export.js | 14 ++-- server/distribute/export.spec.js | 10 +-- server/distribute/import.js | 20 ++--- server/distribute/import.spec.js | 16 ++-- server/distribute/index.js | 4 - server/distribute/log.js | 36 ++++----- server/distribute/log.spec.js | 8 +- server/env.js | 21 +++--- server/env.spec.js | 6 +- server/exit.js | 4 +- server/exit.spec.js | 8 +- server/markdown/index.js | 21 +++--- server/markdown/index.spec.js | 16 ++-- server/markdown/{worker.js => worker.cjs} | 2 - server/modulas.js | 8 +- server/prefixer.js | 4 +- server/prefixer.spec.js | 6 +- server/repl.js | 8 +- server/rest/index.js | 54 ++++++-------- server/rest/index.spec.js | 14 +--- server/rest/info.js | 10 +-- server/rest/info.spec.js | 8 +- server/root.js | 6 +- server/root.spec.js | 8 +- server/route.js | 39 +++++----- server/route.spec.js | 16 ++-- server/server.js | 41 ++++++----- server/show-config.js | 9 +-- server/template.js | 11 +-- server/terminal.js | 7 +- server/terminal.spec.js | 16 ++-- server/user-menu.js | 26 ++++--- server/user-menu.spec.js | 18 ++--- server/validate.js | 20 +++-- server/validate.spec.js | 21 +++--- 43 files changed, 327 insertions(+), 420 deletions(-) delete mode 100644 server/distribute/index.js rename server/markdown/{worker.js => worker.cjs} (85%) diff --git a/bin/cloudcmd.js b/bin/cloudcmd.js index a4f3ae64..abdd1afc 100755 --- a/bin/cloudcmd.js +++ b/bin/cloudcmd.js @@ -18,7 +18,6 @@ import prefixer from '../server/prefixer.js'; import minimist from 'minimist'; const Info = await readjson(new URL('../package.json', import.meta.url)); -console.log(Info); const {argv} = process; @@ -29,8 +28,6 @@ const choose = (a, b) => { return a; }; -console.log('---->', env); - process.on('unhandledRejection', exit); const args = minimist(argv.slice(2), { @@ -245,7 +242,7 @@ async function start(options, config) { if (!args.server) return; - const server = await import('../server/server.js'); + const {default: server} = await import('../server/server.js'); server(options, config); } diff --git a/package.json b/package.json index b43e6068..6f04df9a 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,7 @@ "optimize-css-assets-webpack-plugin": "^5.0.0", "philip": "^2.0.0", "place": "^1.1.4", - "readjson": "^2.0.1", + "readjson": "^2.1.0", "request": "^2.76.0", "rimraf": "^3.0.0", "scroll-into-view-if-needed": "^2.2.5", diff --git a/server/auth.js b/server/auth.js index 69fc85ee..0da39fc6 100644 --- a/server/auth.js +++ b/server/auth.js @@ -1,12 +1,10 @@ -'use strict'; - -const httpAuth = require('http-auth'); -const criton = require('criton'); -const currify = require('currify'); +import httpAuth from 'http-auth'; +import criton from 'criton'; +import currify from 'currify'; const middle = currify(_middle); const check = currify(_check); -module.exports = (config) => { +export default (config) => { const auth = httpAuth.basic({ realm: 'Cloud Commander', }, check(config)); diff --git a/server/cloudcmd.js b/server/cloudcmd.js index 6faa6ed0..71194606 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.js @@ -1,39 +1,42 @@ -'use strict'; +import path from 'path'; +import fs from 'fs'; +import {fileURLToPath} from 'url'; + +import {apiURL} from './../common/cloudfunc.js'; +import authentication from './auth.js'; +import {createConfig, configPath} from './config.js'; + +export { + createConfig, + configPath, +}; + +import modulas from './modulas.js'; +import userMenu from './user-menu.js'; +import rest from './rest/index.js'; +import route from './route.js'; +import * as validate from './validate.js'; +import prefixer from './prefixer.js'; +import terminal from './terminal.js'; +import distributeExport from './distribute/export.js'; + +import currify from 'currify'; +import apart from 'apart'; +import ponse from 'ponse'; +import restafary from 'restafary'; +import restbox from 'restbox'; +import konsole from 'console-io'; +import edward from 'edward'; +import dword from 'dword'; +import deepword from 'deepword'; +import nomine from 'nomine'; +import fileop from '@cloudcmd/fileop'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); const DIR = __dirname + '/'; const DIR_ROOT = DIR + '../'; -const DIR_COMMON = DIR + '../common/'; - -const path = require('path'); -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'); -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'); -const restbox = require('restbox'); -const konsole = require('console-io'); -const edward = require('edward'); -const dword = require('dword'); -const deepword = require('deepword'); -const nomine = require('nomine'); -const fileop = require('@cloudcmd/fileop'); const isDev = process.env.NODE_ENV === 'development'; const getDist = (isDev) => isDev ? 'dist-dev' : 'dist'; @@ -45,7 +48,7 @@ const initAuth = currify(_initAuth); const notEmpty = (a) => a; const clean = (a) => a.filter(notEmpty); -module.exports = (params) => { +export default (params) => { const p = params || {}; const options = p.config || {}; const config = p.configManager || createConfig({ @@ -89,10 +92,9 @@ module.exports = (params) => { }); }; -module.exports.createConfigManager = createConfig; -module.exports.configPath = configPath; +export const createConfigManager = createConfig; -module.exports._getIndexPath = getIndexPath; +export const _getIndexPath = getIndexPath; function defaultValue(config, name, options) { const value = options[name]; @@ -104,7 +106,7 @@ function defaultValue(config, name, options) { return value; } -module.exports._getPrefix = getPrefix; +export const _getPrefix = getPrefix; function getPrefix(prefix) { if (typeof prefix === 'function') return prefix() || ''; @@ -112,8 +114,7 @@ function getPrefix(prefix) { return prefix || ''; } -module.exports._initAuth = _initAuth; -function _initAuth(config, accept, reject, username, password) { +export function _initAuth(config, accept, reject, username, password) { if (!config('auth')) return accept(); @@ -169,7 +170,7 @@ function listen({prefixSocket, socket, config}) { autoRestart: config('terminalAutoRestart'), }); - distribute.export(config, socket); + distributeExport(config, socket); } function cloudcmd({modules, config}) { @@ -233,13 +234,13 @@ function cloudcmd({modules, config}) { modules && modulas(modules), config('dropbox') && restbox({ - prefix: cloudfunc.apiURL, + prefix: apiURL, root, token: dropboxToken, }), restafary({ - prefix: cloudfunc.apiURL + '/fs', + prefix: apiURL + '/fs', root, }), @@ -265,7 +266,7 @@ function logout(req, res, next) { res.sendStatus(401); } -module.exports._replaceDist = replaceDist; +export const _replaceDist = replaceDist; function replaceDist(url) { if (!isDev) return url; diff --git a/server/cloudcmd.spec.js b/server/cloudcmd.spec.js index ae4208db..23197f2d 100644 --- a/server/cloudcmd.spec.js +++ b/server/cloudcmd.spec.js @@ -1,15 +1,13 @@ -'use strict'; +import path from 'path'; -const path = require('path'); - -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); -const {reRequire} = require('mock-require'); +import test from 'supertape'; +import stub from '@cloudcmd/stub'; +import {reRequire} from 'mock-require'; const DIR = './'; const cloudcmdPath = DIR + 'cloudcmd'; -const cloudcmd = require(cloudcmdPath); +import cloudcmd from './cloudcmd.js'; const { createConfigManager, _getPrefix, diff --git a/server/columns.js b/server/columns.js index ac257560..af400e43 100644 --- a/server/columns.js +++ b/server/columns.js @@ -1,10 +1,11 @@ -'use strict'; +import {join, dirname} from 'path'; +import fs from 'fs'; +import readFilesSync from '@cloudcmd/read-files-sync'; +import {fileURLToPath} from 'url'; -const path = require('path'); -const fs = require('fs'); -const readFilesSync = require('@cloudcmd/read-files-sync'); const isMap = (a) => /\.map$/.test(a); const not = (fn) => (a) => !fn(a); +const __dirname = dirname(fileURLToPath(import.meta.url)); const defaultColumns = { '': '', @@ -15,14 +16,14 @@ const isDev = process.env.NODE_ENV === 'development'; const getDist = (isDev) => isDev ? 'dist-dev' : 'dist'; const dist = getDist(isDev); -const columnsDir = path.join(__dirname, '..', dist, 'columns'); +const columnsDir = join(__dirname, '..', dist, 'columns'); const names = fs.readdirSync(columnsDir) .filter(not(isMap)); const columns = readFilesSync(columnsDir, names, 'utf8'); -module.exports = { +export default { ...columns, ...defaultColumns, }; diff --git a/server/config.js b/server/config.js index 84866cfa..1844ec95 100644 --- a/server/config.js +++ b/server/config.js @@ -1,28 +1,26 @@ -'use strict'; +import {join, dirname} from 'path'; +import fs from 'fs'; +import Emitter from 'events'; +import {homedir} from 'os'; +import {fileURLToPath} from 'url'; -const DIR_SERVER = __dirname + '/'; -const DIR_COMMON = '../common/'; -const DIR = DIR_SERVER + '../'; +import exit from './exit.js'; +import * as CloudFunc from '../common/cloudfunc.js'; -const path = require('path'); -const fs = require('fs'); -const Emitter = require('events'); -const {homedir} = require('os'); +import currify from 'currify'; +import wraptile from 'wraptile'; +import tryToCatch from 'try-to-catch'; +import pullout from 'pullout'; +import ponse from 'ponse'; +import jonny from 'jonny'; +import jju from 'jju'; +import writejson from 'writejson'; +import tryCatch from 'try-catch'; +import criton from 'criton'; +import readjson from 'readjson'; -const exit = require(DIR_SERVER + 'exit'); -const CloudFunc = require(DIR_COMMON + 'cloudfunc'); - -const currify = require('currify'); -const wraptile = require('wraptile'); -const tryToCatch = require('try-to-catch'); -const pullout = require('pullout'); -const ponse = require('ponse'); -const jonny = require('jonny'); -const jju = require('jju'); -const writejson = require('writejson'); -const tryCatch = require('try-catch'); -const criton = require('criton'); const HOME = homedir(); +const DIR = dirname(fileURLToPath(import.meta.url)); const resolve = Promise.resolve.bind(Promise); const formatMsg = currify((a, b) => CloudFunc.formatMsg(a, b)); @@ -31,26 +29,19 @@ const {apiURL} = CloudFunc; const key = (a) => Object.keys(a).pop(); -const ConfigPath = path.join(DIR, 'json/config.json'); -const ConfigHome = path.join(HOME, '.cloudcmd.json'); +const ConfigPath = join(DIR, '..', 'json/config.json'); const connection = currify(_connection); const connectionWraped = wraptile(_connection); const middle = currify(_middle); -const readjsonSync = (name) => { - return jju.parse(fs.readFileSync(name, 'utf8'), { - mode: 'json', - }); -}; - -const rootConfig = readjsonSync(ConfigPath); +const rootConfig = readjson.sync(ConfigPath); function read(filename) { if (!filename) return rootConfig; - const [error, configHome] = tryCatch(readjsonSync, filename); + const [error, configHome] = tryCatch(readjson.sync, filename); if (error && error.code !== 'ENOENT') exit(`cloudcmd --config ${filename}: ${error.message}`); @@ -61,8 +52,7 @@ function read(filename) { }; } -module.exports.createConfig = createConfig; -module.exports.configPath = ConfigHome; +export const configPath = join(HOME, '.cloudcmd.json'); const manageListen = currify((manage, socket, auth) => { if (!manage('configDialog')) @@ -80,7 +70,7 @@ function initWrite(filename, configManager) { return resolve; } -function createConfig({configPath} = {}) { +export function createConfig({configPath} = {}) { const config = {}; const changeEmitter = new Emitter(); @@ -231,7 +221,7 @@ function traverse([manage, json]) { } } -module.exports._cryptoPass = cryptoPass; +export const _cryptoPass = cryptoPass; function cryptoPass(manage, json) { const algo = manage('algo'); diff --git a/server/config.spec.js b/server/config.spec.js index a9c6ad69..0e1b443b 100644 --- a/server/config.spec.js +++ b/server/config.spec.js @@ -1,21 +1,13 @@ -'use strict'; +import test from 'supertape'; +import stub from '@cloudcmd/stub'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); - -const root = '../'; -const configPath = './config'; - -const { - createConfig, - _cryptoPass, -} = require(configPath); +import {createConfig, _cryptoPass} from './config.js'; const config = createConfig(); -const {apiURL} = require(root + 'common/cloudfunc'); +import {apiURL} from '../common/cloudfunc.js'; -const fixture = require('./config.fixture'); -const {connect} = require('../test/before'); +import fixture from './config.fixture.js'; +import {connect} from '../test/before.js'; test('config: manage', (t) => { t.equal(undefined, config(), 'should return "undefined"'); diff --git a/server/distribute/export.js b/server/distribute/export.js index 7b2e3641..2091bac3 100644 --- a/server/distribute/export.js +++ b/server/distribute/export.js @@ -1,11 +1,9 @@ -'use strict'; +import currify from 'currify'; +import wraptile from 'wraptile'; +import squad from 'squad'; +import omit from 'object.omit'; -const currify = require('currify'); -const wraptile = require('wraptile'); -const squad = require('squad'); -const omit = require('object.omit'); - -const log = require('./log'); +import log from './log.js'; const { exportStr, @@ -38,7 +36,7 @@ const omitList = [ const omitConfig = (config) => omit(config, omitList); -module.exports = (config, socket) => { +export default (config, socket) => { if (!config('export')) return; diff --git a/server/distribute/export.spec.js b/server/distribute/export.spec.js index 0d2bb8ba..2c98f7b9 100644 --- a/server/distribute/export.spec.js +++ b/server/distribute/export.spec.js @@ -1,11 +1,9 @@ -'use strict'; +import {once} from 'events'; -const {once} = require('events'); +import test from 'supertape'; +import io from 'socket.io-client'; -const test = require('supertape'); -const io = require('socket.io-client'); - -const {connect} = require('../../test/before'); +import {connect} from '../../test/before.js'; const config = require('../config').createConfig(); test('distribute: export', async (t) => { diff --git a/server/distribute/import.js b/server/distribute/import.js index e6aac17d..e9ac10d7 100644 --- a/server/distribute/import.js +++ b/server/distribute/import.js @@ -1,15 +1,15 @@ -'use strict'; +import currify from 'currify'; +import wraptile from 'wraptile'; +import squad from 'squad'; +import fullstore from 'fullstore'; +import _forEachKey from 'for-each-key'; -const currify = require('currify'); -const wraptile = require('wraptile'); -const squad = require('squad'); -const fullstore = require('fullstore'); +import io from 'socket.io-client'; -const io = require('socket.io-client'); -const forEachKey = currify(require('for-each-key')); +import log from './log.js'; +import env from '../env.js'; -const log = require('./log'); -const env = require('../env'); +const forEachKey = currify(_forEachKey); const { importStr, @@ -75,7 +75,7 @@ const updateConfig = currify((config, data) => { } }); -module.exports = (config, options, fn) => { +export default (config, options, fn) => { fn = fn || options; if (!config('import')) diff --git a/server/distribute/import.spec.js b/server/distribute/import.spec.js index f891f411..8e8cdca0 100644 --- a/server/distribute/import.spec.js +++ b/server/distribute/import.spec.js @@ -1,11 +1,9 @@ -'use strict'; +import test from 'supertape'; +import {promisify} from 'util'; +import tryToCatch from 'try-to-catch'; -const test = require('supertape'); -const {promisify} = require('util'); -const tryToCatch = require('try-to-catch'); - -const {connect} = require('../../test/before'); -const {createConfigManager} = require('../cloudcmd'); +import {connect} from '../../test/before.js'; +import {createConfigManager} from '../cloudcmd.js'; const distribute = { import: promisify(require('./import')), @@ -237,7 +235,7 @@ test('distribute: import: env', async (t) => { const result = configManagerImport('editor'); const expected = 'deepword'; - t.equal(expected, result); + t.equal(result, expected); t.end(); }); @@ -281,6 +279,6 @@ test('distribute: import: no env', async (t) => { const result = configManagerImport('editor'); const expected = 'edward'; - t.equal(expected, result); + t.equal(result, expected); t.end(); }); 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 index f08fc58c..b9fecacf 100644 --- a/server/distribute/log.js +++ b/server/distribute/log.js @@ -1,30 +1,24 @@ -'use strict'; +import wraptile from 'wraptile'; +import chalk from 'chalk'; -const wraptile = require('wraptile'); -const chalk = require('chalk'); - -const datetime = require('../../common/datetime'); +import datetime from '../../common/datetime.js'; const log = (isLog, name, msg) => isLog && console.log(`${datetime()} -> ${name}: ${msg}`); -const makeColor = (a, color) => chalk.rgb(color || stringToRGB(a))(a); -const getMessage = (e) => e.message || e; -const getDescription = (e) => `${e.type}: ${e.description}`; +export const makeColor = (a, color) => chalk.rgb(color || stringToRGB(a))(a); +export const getMessage = (e) => e.message || e; +export const getDescription = (e) => `${e.type}: ${e.description}`; -module.exports = log; -module.exports.logWraped = wraptile(log); -module.exports.stringToRGB = stringToRGB; -module.exports.makeColor = makeColor; -module.exports.getMessage = getMessage; -module.exports.getDescription = getDescription; +export default log; +export const logWraped = wraptile(log); -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'); +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'); -function stringToRGB(a) { +export function stringToRGB(a) { return [ a.charCodeAt(0), a.length, diff --git a/server/distribute/log.spec.js b/server/distribute/log.spec.js index 83c7a963..7e8a0232 100644 --- a/server/distribute/log.spec.js +++ b/server/distribute/log.spec.js @@ -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.js'; +import {createConfig} from '../config.js'; test('distribute: log: getMessage', (t) => { const e = 'hello'; diff --git a/server/env.js b/server/env.js index d53e3e48..42313b9c 100644 --- a/server/env.js +++ b/server/env.js @@ -1,12 +1,16 @@ -'use strict'; - -const snake = require('just-snake-case'); +import snake from 'just-snake-case'; const {env} = process; const up = (a) => a.toUpperCase(); -module.exports = parse; -module.exports.bool = (name) => { +export default function parse(name) { + const small = `cloudcmd_${snake(name)}`; + const big = up(small); + + return env[big] || env[small]; +} + +parse.bool = (name) => { const value = parse(name); if (value === 'true') @@ -16,10 +20,3 @@ module.exports.bool = (name) => { return false; }; -function parse(name) { - const small = `cloudcmd_${snake(name)}`; - const big = up(small); - - return env[big] || env[small]; -} - diff --git a/server/env.spec.js b/server/env.spec.js index e090f45a..d87b5592 100644 --- a/server/env.spec.js +++ b/server/env.spec.js @@ -1,7 +1,5 @@ -'use strict'; - -const test = require('supertape'); -const env = require('./env'); +import test from 'supertape'; +import env from './env.js'; test('cloudcmd: server: env: bool: upper case first', (t) => { const { diff --git a/server/exit.js b/server/exit.js index f01cd130..2bf92b84 100644 --- a/server/exit.js +++ b/server/exit.js @@ -1,8 +1,6 @@ -'use strict'; - const getMessage = (a) => a && a.message || a; -module.exports = (...args) => { +export default (...args) => { const messages = args.map(getMessage); console.error(...messages); diff --git a/server/exit.spec.js b/server/exit.spec.js index 432773ee..5cf41185 100644 --- a/server/exit.spec.js +++ b/server/exit.spec.js @@ -1,8 +1,6 @@ -'use strict'; - -const test = require('supertape'); -const exit = require('./exit'); -const stub = require('@cloudcmd/stub'); +import test from 'supertape'; +import exit from './exit.js'; +import stub from '@cloudcmd/stub'; test('cloudcmd: exit: process.exit', (t) => { const {exit:exitOriginal} = process; diff --git a/server/markdown/index.js b/server/markdown/index.js index 0906d57e..95f45b4b 100644 --- a/server/markdown/index.js +++ b/server/markdown/index.js @@ -1,16 +1,17 @@ -'use strict'; +import {readFile} from 'fs/promises'; +import {join, dirname} from 'path'; +import {callbackify} from 'util'; +import {fileURLToPath} from 'url'; -const {readFile} = require('fs').promises; -const {join} = require('path'); -const {callbackify} = require('util'); +import pullout from 'pullout'; +import ponse from 'ponse'; +import threadIt from 'thread-it'; -const pullout = require('pullout'); -const ponse = require('ponse'); -const threadIt = require('thread-it'); +const __dirname = dirname(fileURLToPath(import.meta.url)); -const parse = threadIt(join(__dirname, 'worker')); +const parse = threadIt(join(__dirname, 'worker.cjs')); -const root = require('../root'); +import root from '../root.js'; threadIt.init(); @@ -19,7 +20,7 @@ parse(''); const DIR_ROOT = __dirname + '/../../'; -module.exports = callbackify(async (name, rootDir, request) => { +export default callbackify(async (name, rootDir, request) => { check(name, request); const {method} = request; diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.js index 3e6859d1..e7f986ba 100644 --- a/server/markdown/index.spec.js +++ b/server/markdown/index.spec.js @@ -1,17 +1,15 @@ -'use strict'; +import fs from 'fs'; +import path from 'path'; +import test from 'supertape'; +import {promisify} from 'util'; -const fs = require('fs'); -const path = require('path'); -const test = require('supertape'); -const {promisify} = require('util'); +import tryToCatch from 'try-to-catch'; -const tryToCatch = require('try-to-catch'); - -const markdown = require('.'); +import markdown from '.'; const _markdown = promisify(markdown); const fixtureDir = path.join(__dirname, 'fixture'); -const cloudcmd = require('../..'); +import cloudcmd from '../...js'; const config = { auth: false, }; diff --git a/server/markdown/worker.js b/server/markdown/worker.cjs similarity index 85% rename from server/markdown/worker.js rename to server/markdown/worker.cjs index ae2a95fd..2b6be4f7 100644 --- a/server/markdown/worker.js +++ b/server/markdown/worker.cjs @@ -1,4 +1,2 @@ -'use strict'; - const markdownIt = require('markdown-it')(); module.exports = (a) => markdownIt.render(a); diff --git a/server/modulas.js b/server/modulas.js index 1b32dffa..0323dee8 100644 --- a/server/modulas.js +++ b/server/modulas.js @@ -1,9 +1,9 @@ -'use strict'; +import deepmerge from 'deepmerge'; +import readjson from 'readjson'; -const deepmerge = require('deepmerge'); -const originalModules = require('../json/modules'); +const originalModules = await readjson(new URL('../json/modules.json', import.meta.url)); -module.exports = (modules) => { +export default (modules) => { const result = deepmerge(originalModules, modules || {}); return (req, res, next) => { diff --git a/server/prefixer.js b/server/prefixer.js index 47675070..93af73c9 100644 --- a/server/prefixer.js +++ b/server/prefixer.js @@ -1,6 +1,4 @@ -'use strict'; - -module.exports = (value) => { +export default (value) => { if (typeof value !== 'string') return ''; diff --git a/server/prefixer.spec.js b/server/prefixer.spec.js index b858e546..f7268264 100644 --- a/server/prefixer.spec.js +++ b/server/prefixer.spec.js @@ -1,8 +1,6 @@ -'use strict'; +import test from 'supertape'; -const test = require('supertape'); - -const prefixer = require('./prefixer'); +import prefixer from './prefixer.js'; test('prefixer: prefix without a slash', (t) => { t.equal(prefixer('hello'), '/hello', 'should add slash'); diff --git a/server/repl.js b/server/repl.js index 43497a14..ca43b982 100644 --- a/server/repl.js +++ b/server/repl.js @@ -1,9 +1,7 @@ -'use strict'; +import net from 'net'; +import repl from 'repl'; -const net = require('net'); -const repl = require('repl'); - -module.exports = net.createServer((socket) => { +export default net.createServer((socket) => { const {pid} = process; const addr = socket.remoteAddress; const port = socket.remotePort; diff --git a/server/rest/index.js b/server/rest/index.js index 996f3120..df913237 100644 --- a/server/rest/index.js +++ b/server/rest/index.js @@ -1,31 +1,25 @@ -'use strict'; +import path from 'path'; +import fs from 'fs'; -const DIR = '../'; -const DIR_COMMON = DIR + '../common/'; +import root from '../root.js'; +import {apiURL, formatMsg} from '../../common/cloudfunc.js'; +import markdown from '../markdown/index.js'; +import info from './info.js'; -const path = require('path'); -const fs = require('fs'); +import jaguar from 'jaguar'; +import onezip from 'onezip'; +import inly from 'inly'; +import wraptile from 'wraptile'; +import currify from 'currify'; +import pullout from 'pullout'; +import json from 'jonny'; +import ponse from 'ponse'; -const root = require(DIR + 'root'); -const CloudFunc = require(DIR_COMMON + 'cloudfunc'); -const markdown = require(DIR + 'markdown'); -const info = require('./info'); - -const jaguar = require('jaguar'); -const onezip = require('onezip'); -const inly = require('inly'); -const wraptile = require('wraptile'); -const currify = require('currify'); -const pullout = require('pullout'); -const json = require('jonny'); -const ponse = require('ponse'); - -const copymitter = require('copymitter'); -const moveFiles = require('@cloudcmd/move-files'); +import copymitter from 'copymitter'; +import moveFiles from '@cloudcmd/move-files'; const swap = wraptile((fn, a, b) => fn(b, a)); const isWin32 = process.platform === 'win32'; -const {apiURL} = CloudFunc; const UserError = (msg) => { const error = Error(msg); @@ -34,7 +28,7 @@ const UserError = (msg) => { return error; }; -module.exports = currify((config, request, response, next) => { +export default currify((config, request, response, next) => { const name = ponse.getPathName(request); const regExp = RegExp('^' + apiURL); const is = regExp.test(name); @@ -182,7 +176,7 @@ const getRenameMsg = (from, to) => { return msg; }; -module.exports._onPUT = onPUT; +export const _onPUT = onPUT; function onPUT({name, config, body}, callback) { checkPut(name, body, callback); @@ -360,14 +354,14 @@ const isRootWin32 = currify((root, path) => { return isWin32 && isRoot && isConfig; }); -module.exports._isRootWin32 = isRootWin32; -module.exports._isRootAll = isRootAll; +export const _isRootWin32 = isRootWin32; +export const _isRootAll = isRootAll; function isRootAll(root, names) { return names.some(isRootWin32(root)); } -module.exports._getWin32RootMsg = getWin32RootMsg; +export const _getWin32RootMsg = getWin32RootMsg; function getWin32RootMsg() { const message = 'Could not copy from/to root on windows!'; @@ -385,11 +379,11 @@ function parseData(data) { return json.stringify(data); } -module.exports._formatMsg = formatMsg; +export const _formatMsg = formatRawMessage; -function formatMsg(msg, data, status) { +function formatRawMessage(msg, data, status) { const value = parseData(data); - return CloudFunc.formatMsg(msg, value, status); + return formatMsg(msg, value, status); } function checkPut(name, body, callback) { diff --git a/server/rest/index.spec.js b/server/rest/index.spec.js index bd0c9645..3fd93dad 100644 --- a/server/rest/index.spec.js +++ b/server/rest/index.spec.js @@ -1,15 +1,7 @@ -'use strict'; +import test from 'supertape'; +import tryToCatch from 'try-to-catch'; -const test = require('supertape'); -const tryToCatch = require('try-to-catch'); - -const { - _formatMsg, - _getWin32RootMsg, - _isRootWin32, - _isRootAll, - _onPUT, -} = require('.'); +import {_formatMsg, _getWin32RootMsg, _isRootWin32, _isRootAll, _onPUT} from '.'; test('rest: formatMsg', (t) => { const result = _formatMsg('hello', 'world'); diff --git a/server/rest/info.js b/server/rest/info.js index 13758b21..dc2009c5 100644 --- a/server/rest/info.js +++ b/server/rest/info.js @@ -1,15 +1,15 @@ -'use strict'; +import format from 'format-io'; +import readjson from 'readjson'; -const format = require('format-io'); - -const {version} = require('../../package'); +const infoPath = new URL('../../package.json', import.meta.url); +const {version} = await readjson(infoPath); const getMemory = () => { const {rss} = process.memoryUsage(); return format.size(rss); }; -module.exports = (prefix) => ({ +export default (prefix) => ({ version, prefix, memory: getMemory(), diff --git a/server/rest/info.spec.js b/server/rest/info.spec.js index a067cc68..5c7cb224 100644 --- a/server/rest/info.spec.js +++ b/server/rest/info.spec.js @@ -1,8 +1,6 @@ -'use strict'; - -const test = require('supertape'); -const info = require('./info'); -const stub = require('@cloudcmd/stub'); +import test from 'supertape'; +import info from './info.js'; +import stub from '@cloudcmd/stub'; test('cloudcmd: rest: info', (t) => { const {memoryUsage} = process; diff --git a/server/root.js b/server/root.js index fcbfcf7e..7b5019d2 100644 --- a/server/root.js +++ b/server/root.js @@ -1,8 +1,6 @@ -'use strict'; +import mellow from 'mellow'; -const mellow = require('mellow'); - -module.exports = (dir, root) => { +export default (dir, root) => { return mellow.pathToWin(dir, root || '/'); }; diff --git a/server/root.spec.js b/server/root.spec.js index 300cb234..3a7e60d0 100644 --- a/server/root.spec.js +++ b/server/root.spec.js @@ -1,8 +1,6 @@ -'use strict'; - -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); -const mockRequire = require('mock-require'); +import test from 'supertape'; +import stub from '@cloudcmd/stub'; +import mockRequire from 'mock-require'; const {reRequire} = mockRequire; const pathConfig = './config'; diff --git a/server/route.js b/server/route.js index 200149c0..b09f5074 100644 --- a/server/route.js +++ b/server/route.js @@ -1,24 +1,21 @@ -'use strict'; +import {realpath} from 'fs/promises'; +import {createRequire} from 'module'; -const DIR_SERVER = './'; -const DIR_COMMON = '../common/'; +import {read} from 'flop'; +import ponse from 'ponse'; +import rendy from 'rendy'; +import format from 'format-io'; +import currify from 'currify'; +import tryToCatch from 'try-to-catch'; +import once from 'once'; -const {realpath} = require('fs').promises; - -const {read} = require('flop'); -const ponse = require('ponse'); -const rendy = require('rendy'); -const format = require('format-io'); -const currify = require('currify'); -const tryToCatch = require('try-to-catch'); -const once = require('once'); - -const root = require(DIR_SERVER + 'root'); -const prefixer = require(DIR_SERVER + 'prefixer'); -const CloudFunc = require(DIR_COMMON + 'cloudfunc'); +import root from './root.js'; +import prefixer from './prefixer.js'; +import * as CloudFunc from '../common/cloudfunc.js'; const getPrefix = (config) => prefixer(config('prefix')); +const require = createRequire(import.meta.url); const onceRequire = once(require); const sendIndex = (params, data) => { @@ -32,8 +29,8 @@ const sendIndex = (params, data) => { const {FS} = CloudFunc; -const Columns = require(`${DIR_SERVER}/columns`); -const Template = require(`${DIR_SERVER}/template`); +import Columns from './/columns.js'; +import Template from './/template.js'; const tokenize = (fn, a) => (b) => fn(a, b); const getReadDir = (config) => { @@ -48,7 +45,7 @@ const getReadDir = (config) => { /** * routing of server queries */ -module.exports = currify((config, options, request, response, next) => { +export default currify((config, options, request, response, next) => { const name = ponse.getPathName(request); const isFS = RegExp('^/$|^' + FS).test(name); @@ -59,7 +56,7 @@ module.exports = currify((config, options, request, response, next) => { .catch(next); }); -module.exports._getReadDir = getReadDir; +export const _getReadDir = getReadDir; async function route({config, options, request, response}) { const name = ponse.getPathName(request); @@ -179,7 +176,7 @@ function buildIndex(config, html, data) { }); } -module.exports._hideKeysPanel = hideKeysPanel; +export const _hideKeysPanel = hideKeysPanel; function hideKeysPanel(html) { const keysPanel = '
f(a, b)); -const exit = require(DIR_SERVER + 'exit'); +import exit from './exit.js'; const exitPort = two(exit, 'cloudcmd --port: %s'); const bind = (f, self) => f.bind(self); const promisifySelf = squad(promisify, bind); +import opn from 'open'; +import express from 'express'; + +const require = createRequire(import.meta.url); +const io = require('socket.io'); + +import tryRequire from 'tryrequire'; +const logger = tryRequire('morgan'); + const shutdown = wraptile(async (promises) => { console.log('closing cloudcmd...'); await Promise.all(promises); @@ -26,14 +34,7 @@ const shutdown = wraptile(async (promises) => { process.exit(0); }); -const opn = require('open'); -const express = require('express'); -const io = require('socket.io'); - -const tryRequire = require('tryrequire'); -const logger = tryRequire('morgan'); - -module.exports = async (options, config) => { +export default async (options, config) => { const prefix = config('prefix'); const port = process.env.PORT || /* c9 */ config('port'); diff --git a/server/show-config.js b/server/show-config.js index c7ee2dec..34774870 100644 --- a/server/show-config.js +++ b/server/show-config.js @@ -1,11 +1,6 @@ -'use strict'; +import {table, getBorderCharacters} from 'table'; -const { - table, - getBorderCharacters, -} = require('table'); - -module.exports = (config) => { +export default (config) => { check(config); const data = Object.keys(config).map((name) => { diff --git a/server/template.js b/server/template.js index 150b63fd..bb81f136 100644 --- a/server/template.js +++ b/server/template.js @@ -1,8 +1,9 @@ -'use strict'; +import {join, dirname} from 'path'; +import {fileURLToPath} from 'url'; +import readFilesSync from '@cloudcmd/read-files-sync'; -const path = require('path'); -const readFilesSync = require('@cloudcmd/read-files-sync'); -const templatePath = path.join(__dirname, '..', 'tmpl/fs'); +const __dirname = dirname(fileURLToPath(import.meta.url)); +const templatePath = join(__dirname, '..', 'tmpl/fs'); -module.exports = readFilesSync(templatePath, 'utf8'); +export default readFilesSync(templatePath, 'utf8'); diff --git a/server/terminal.js b/server/terminal.js index 9d1e9c35..91cc21c5 100644 --- a/server/terminal.js +++ b/server/terminal.js @@ -1,6 +1,7 @@ -'use strict'; +import {createRequire} from 'module'; +import tryCatch from 'try-catch'; -const tryCatch = require('try-catch'); +const require = createRequire(import.meta.url); const noop = (req, res, next) => { next && next(); @@ -8,7 +9,7 @@ const noop = (req, res, next) => { noop.listen = noop; -module.exports = (config, arg) => { +export default (config, arg) => { if (!config('terminal')) return noop; diff --git a/server/terminal.spec.js b/server/terminal.spec.js index 0acacb67..310f7acb 100644 --- a/server/terminal.spec.js +++ b/server/terminal.spec.js @@ -1,13 +1,11 @@ -'use strict'; +import test from 'supertape'; +import stub from '@cloudcmd/stub'; -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); - -const mockRequire = require('mock-require'); +import mockRequire from 'mock-require'; const terminalPath = './terminal'; -const terminal = require('./terminal'); -const {createConfigManager} = require('./cloudcmd'); +import terminal from './terminal.js'; +import {createConfigManager} from './cloudcmd.js'; test('cloudcmd: terminal: disabled', (t) => { const config = createConfigManager(); @@ -29,13 +27,13 @@ test('cloudcmd: terminal: disabled: listen', (t) => { t.end(); }); -test('cloudcmd: terminal: enabled', (t) => { +test('cloudcmd: terminal: enabled', async (t) => { const term = stub(); const arg = 'hello'; mockRequire(terminalPath, term); - const terminal = require(terminalPath); + const terminal = await import(terminalPath); terminal(arg); t.calledWith(term, [arg], 'should call terminal'); diff --git a/server/user-menu.js b/server/user-menu.js index 9e3878e7..77cc211d 100644 --- a/server/user-menu.js +++ b/server/user-menu.js @@ -1,16 +1,17 @@ -'use strict'; +import {homedir} from 'os'; +import {readFile} from 'fs/promises'; +import {fileURLToPath} from 'url'; +import {join, dirname} from 'path'; +import {createRequire} from 'module'; -const {homedir} = require('os'); -const {readFile} = require('fs').promises; +import tryToCatch from 'try-to-catch'; +import currify from 'currify'; +import findUp from 'find-up'; +import threadIt from 'thread-it'; +import {codeframe} from 'putout'; -const {join} = require('path'); - -const tryToCatch = require('try-to-catch'); -const currify = require('currify'); -const findUp = require('find-up'); -const threadIt = require('thread-it'); -const {codeframe} = require('putout'); -const putout = threadIt(require.resolve('putout')); +const {resolve} = createRequire(import.meta.url); +const putout = threadIt(resolve('putout')); threadIt.init(); @@ -18,9 +19,10 @@ threadIt.init(); transpile(''); const URL = '/api/v1/user-menu'; +const __dirname = dirname(fileURLToPath(import.meta.url)); const DEFAULT_MENU_PATH = join(__dirname, '../static/user-menu.js'); -module.exports = currify(async ({menuName}, req, res, next) => { +export default currify(async ({menuName}, req, res, next) => { if (req.url.indexOf(URL)) return next(); diff --git a/server/user-menu.spec.js b/server/user-menu.spec.js index eba01007..f6f82e5f 100644 --- a/server/user-menu.spec.js +++ b/server/user-menu.spec.js @@ -1,15 +1,13 @@ -'use strict'; +import fs from 'fs'; +import {join} from 'path'; -const fs = require('fs'); -const {join} = require('path'); +import test from 'supertape'; +import serveOnce from 'serve-once'; +import threadIt from 'thread-it'; +import stub from '@cloudcmd/stub'; +import {reRequire} from 'mock-require'; -const test = 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'); +import userMenu from './user-menu.js'; const {request} = serveOnce(userMenu); const {readFileSync} = fs; diff --git a/server/validate.js b/server/validate.js index 498cd78e..eaf42741 100644 --- a/server/validate.js +++ b/server/validate.js @@ -1,11 +1,9 @@ -'use strict'; +import tryCatch from 'try-catch'; -const tryCatch = require('try-catch'); +import exit from './exit.js'; +import columnsData from './columns.js'; -const exit = require('./exit'); -const columns = require('./columns'); - -module.exports.root = (dir, config) => { +export const root = async (dir, config) => { if (typeof dir !== 'string') throw Error('dir should be a string'); @@ -15,31 +13,31 @@ module.exports.root = (dir, config) => { if (config('dropbox')) return; - const {statSync} = require('fs'); + const {statSync} = await import('fs'); const [error] = tryCatch(statSync, dir); if (error) return exit('cloudcmd --root: %s', error.message); }; -module.exports.editor = (name) => { +export const editor = (name) => { const reg = /^(dword|edward|deepword)$/; if (!reg.test(name)) exit('cloudcmd --editor: could be "dword", "edward" or "deepword" only'); }; -module.exports.packer = (name) => { +export const packer = (name) => { const reg = /^(tar|zip)$/; if (!reg.test(name)) exit('cloudcmd --packer: could be "tar" or "zip" only'); }; -module.exports.columns = (type) => { +export const columns = (type) => { const addQuotes = (a) => `"${a}"`; const all = Object - .keys(columns) + .keys(columnsData) .concat(''); const names = all diff --git a/server/validate.spec.js b/server/validate.spec.js index 595b47b5..43e64235 100644 --- a/server/validate.spec.js +++ b/server/validate.spec.js @@ -1,11 +1,9 @@ -'use strict'; +import fs from 'fs'; -const fs = require('fs'); - -const test = require('supertape'); -const stub = require('@cloudcmd/stub'); -const tryCatch = require('try-catch'); -const mockRequire = require('mock-require'); +import test from 'supertape'; +import stub from '@cloudcmd/stub'; +import tryCatch from 'try-catch'; +import mockRequire from 'mock-require'; const {reRequire} = mockRequire; const dir = '..'; @@ -13,10 +11,9 @@ const dir = '..'; const validatePath = `${dir}/server/validate`; const exitPath = `${dir}/server/exit`; const columnsPath = `${dir}/server/columns`; -const cloudcmdPath = `${dir}/server/cloudcmd`; -const validate = require(validatePath); -const cloudcmd = require(cloudcmdPath); +import validate from '../server/validate.js'; +import cloudcmd from '../server/cloudcmd.js'; test('validate: root: bad', (t) => { const config = { @@ -100,11 +97,11 @@ test('validate: editor: not valid', (t) => { t.end(); }); -test('validate: columns', (t) => { +test('validate: columns', async (t) => { const fn = stub(); mockRequire(exitPath, fn); - const {columns} = require(validatePath); + const {columns} = await import(validatePath); columns('name-size-date');