From fc59c57ba2210830642022747fe556812ea18068 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 20 Jun 2022 17:08:19 +0300 Subject: [PATCH] feature(cloudcmd) convert-to-esm --- .madrun.mjs | 2 +- HELP.md | 12 ++- README.md | 12 ++- package.json | 1 + server/{cloudcmd.js => cloudcmd.mjs} | 52 +++++++---- .../{cloudcmd.spec.js => cloudcmd.spec.mjs} | 47 +++++----- server/{config.spec.js => config.spec.mjs} | 23 +++-- .../{export.spec.js => export.spec.mjs} | 12 +-- .../{import.spec.js => import.spec.mjs} | 13 +-- .../{index.spec.js => index.spec.mjs} | 27 +++--- server/{route.spec.js => route.spec.mjs} | 86 ++++++++++--------- server/server.mjs | 2 +- server/{terminal.js => terminal.mjs} | 9 +- .../{terminal.spec.js => terminal.spec.mjs} | 24 +++--- test/{before.js => before.mjs} | 27 +++--- test/rest/{config.js => config.mjs} | 12 +-- test/rest/{copy.js => copy.mjs} | 25 ++++-- test/rest/fixture/move.txt | 0 test/rest/{fs.js => fs.mjs} | 9 +- test/rest/{move.js => move.mjs} | 51 ++++------- test/rest/{pack.js => pack.mjs} | 32 ++++--- test/rest/{rename.js => rename.mjs} | 46 +++++----- test/server/{console.js => console.mjs} | 17 ++-- test/server/{modulas.js => modulas.mjs} | 22 +++-- test/{static.js => static.mjs} | 11 +-- 25 files changed, 310 insertions(+), 264 deletions(-) rename server/{cloudcmd.js => cloudcmd.mjs} (88%) rename server/{cloudcmd.spec.js => cloudcmd.spec.mjs} (82%) rename server/{config.spec.js => config.spec.mjs} (85%) rename server/distribute/{export.spec.js => export.spec.mjs} (85%) rename server/distribute/{import.spec.js => import.spec.mjs} (95%) rename server/markdown/{index.spec.js => index.spec.mjs} (82%) rename server/{route.spec.js => route.spec.mjs} (82%) rename server/{terminal.js => terminal.mjs} (63%) rename server/{terminal.spec.js => terminal.spec.mjs} (75%) rename test/{before.js => before.mjs} (64%) rename test/rest/{config.js => config.mjs} (89%) rename test/rest/{copy.js => copy.mjs} (53%) create mode 100644 test/rest/fixture/move.txt rename test/rest/{fs.js => fs.mjs} (66%) rename test/rest/{move.js => move.mjs} (60%) rename test/rest/{pack.js => pack.mjs} (88%) rename test/rest/{rename.js => rename.mjs} (67%) rename test/server/{console.js => console.mjs} (72%) rename test/server/{modulas.js => modulas.mjs} (77%) rename test/{static.js => static.mjs} (94%) diff --git a/.madrun.mjs b/.madrun.mjs index 82ce4fba..62ddb1a4 100644 --- a/.madrun.mjs +++ b/.madrun.mjs @@ -34,7 +34,7 @@ export default { 'spell': () => 'yaspeller . || true', 'fix:lint': () => run('lint', '--fix'), 'lint:stream': () => run('lint', '-f stream'), - 'test': () => [testEnv, `tape --no-check-duplicates 'test/**/*.js' '{client,static,common,server}/**/*.spec.js' -f fail`], + 'test': () => [testEnv, `tape --no-check-duplicates 'test/**/*.js' '{client,static,common,server}/**/*.spec.{js,mjs}' -f fail`], 'test:client': () => `tape 'test/client/**/*.js'`, 'test:server': () => `tape 'test/**/*.js' 'server/**/*.spec.js' 'common/**/*.spec.js'`, 'wisdom': () => run(['lint:all', 'build', 'test']), diff --git a/HELP.md b/HELP.md index d3409e7f..441c46c6 100644 --- a/HELP.md +++ b/HELP.md @@ -662,7 +662,10 @@ And create `index.js`: ```js import http from 'http'; -import cloudcmd from 'cloudcmd'; +import cloudcmd, { + createConfigManager, + configPath, +} from 'cloudcmd'; import {Server} from 'socket.io'; import express from 'express'; @@ -692,16 +695,11 @@ const modules = { filePicker, }; -const { - createConfigManager, - configPath, -} = cloudcmd; - const configManager = createConfigManager({ configPath, }); -app.use(prefix, cloudcmd({ +app.use(prefix, await cloudcmd({ socket, // used by Config, Edit (optional) and Console (required) config, // config data (optional) modules, // optional diff --git a/README.md b/README.md index 2eccd8a4..fdf3412e 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,10 @@ And create `index.js`: ```js import http from 'http'; -import cloudcmd from 'cloudcmd'; +import cloudcmd, { + createConfigManager, + configPath, +} from 'cloudcmd'; import {Server} from 'socket.io'; import express from 'express'; @@ -100,16 +103,11 @@ const modules = { filePicker, }; -const { - createConfigManager, - configPath, -} = cloudcmd; - const configManager = createConfigManager({ configPath, }); -app.use(prefix, cloudcmd({ +app.use(prefix, await cloudcmd({ socket, // used by Config, Edit (optional) and Console (required) config, // config data (optional) modules, // optional diff --git a/package.json b/package.json index 30471132..0d4d5c30 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "madrun": "^9.0.0", "memfs": "^3.0.1", "minor": "^1.2.2", + "mock-import": "^3.0.2", "mock-require": "^3.0.1", "morgan": "^1.6.1", "multi-rename": "^2.0.0", diff --git a/server/cloudcmd.js b/server/cloudcmd.mjs similarity index 88% rename from server/cloudcmd.js rename to server/cloudcmd.mjs index 375ffeea..25b4be5e 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.mjs @@ -1,17 +1,23 @@ -'use strict'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +import {createRequire} from 'module'; +import path from 'path'; +const __dirname = path.dirname(__filename); +const require = createRequire(import.meta.url); const DIR = __dirname + '/'; 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 { + +export const { createConfig, configPath, } = require(DIR + 'config'); + const modulas = require(DIR + 'modulas'); const userMenu = require(DIR + 'user-menu'); @@ -33,6 +39,11 @@ const dword = require('dword'); const deepword = require('deepword'); const nomine = require('nomine'); const fileop = require('@cloudcmd/fileop'); + +export const createConfigManager = createConfig; + +const {assign} = Object; + const DIR_ROOT = DIR + '../'; const isDev = process.env.NODE_ENV === 'development'; @@ -48,7 +59,18 @@ const clean = (a) => a.filter(notEmpty); const isUndefined = (a) => typeof a === 'undefined'; const isFn = (a) => typeof a === 'function'; -module.exports = (params) => { +export default exports; + +assign(exports, { + createConfigManager, + configPath, +}); + +export { + exports as cloudcmd, +} + +async function exports(params) { const p = params || {}; const options = p.config || {}; const config = p.configManager || createConfig({ @@ -80,7 +102,7 @@ module.exports = (params) => { const prefixSocket = prefixer(options.prefixSocket); if (p.socket) - listen({ + await listen({ prefixSocket, config, socket: p.socket, @@ -90,12 +112,9 @@ module.exports = (params) => { modules, config, }); -}; +} -module.exports.createConfigManager = createConfig; -module.exports.configPath = configPath; - -module.exports._getIndexPath = getIndexPath; +export const _getIndexPath = getIndexPath; function defaultValue(config, name, options) { const value = options[name]; @@ -107,7 +126,8 @@ function defaultValue(config, name, options) { return value; } -module.exports._getPrefix = getPrefix; +export const _getPrefix = getPrefix; + function getPrefix(prefix) { if (isFn(prefix)) return prefix() || ''; @@ -115,8 +135,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(); @@ -129,7 +148,7 @@ function _initAuth(config, accept, reject, username, password) { reject(); } -function listen({prefixSocket, socket, config}) { +async function listen({prefixSocket, socket, config}) { const root = apart(config, 'root'); const auth = initAuth(config); @@ -165,7 +184,7 @@ function listen({prefixSocket, socket, config}) { prefix: prefixSocket + '/fileop', }); - config('terminal') && terminal(config).listen(socket, { + config('terminal') && (await terminal(config)).listen(socket, { auth, prefix: prefixSocket + '/gritty', command: config('terminalCommand'), @@ -268,7 +287,8 @@ 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.mjs similarity index 82% rename from server/cloudcmd.spec.js rename to server/cloudcmd.spec.mjs index d0e47e2e..f0899579 100644 --- a/server/cloudcmd.spec.js +++ b/server/cloudcmd.spec.mjs @@ -1,30 +1,36 @@ -'use strict'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +import serveOnce from 'serve-once'; +const __filename = fileURLToPath(import.meta.url); +import {createMockImport} from 'mock-import'; +const __dirname = dirname(__filename); -const path = require('path'); +const {reImport} = createMockImport(import.meta.url); -const { +import path from 'path'; + +import { test, stub, -} = require('supertape'); -const {reRequire} = require('mock-require'); +} from 'supertape'; const DIR = './'; -const cloudcmdPath = DIR + 'cloudcmd'; +const cloudcmdPath = DIR + 'cloudcmd.mjs'; -const cloudcmd = require(cloudcmdPath); -const {request} = require('serve-once')(cloudcmd, { +import cloudcmd, { + createConfigManager, + _getPrefix, + _initAuth, + _getIndexPath, +} from './cloudcmd.mjs'; + +const {request} = serveOnce(cloudcmd, { config: { auth: false, dropbox: false, }, }); -const { - createConfigManager, - _getPrefix, - _initAuth, -} = cloudcmd; - test('cloudcmd: defaults: config', (t) => { const configManager = createConfigManager(); @@ -76,11 +82,11 @@ test('cloudcmd: getPrefix: function: empty', (t) => { t.end(); }); -test('cloudcmd: replaceDist', (t) => { +test('cloudcmd: replaceDist', async (t) => { const {NODE_ENV} = process.env; process.env.NODE_ENV = 'development'; - const {_replaceDist} = reRequire(cloudcmdPath); + const {_replaceDist} = await reImport(cloudcmdPath); const url = '/dist/hello'; const result = _replaceDist(url); @@ -92,12 +98,11 @@ test('cloudcmd: replaceDist', (t) => { t.end(); }); -test('cloudcmd: replaceDist: !isDev', (t) => { +test('cloudcmd: replaceDist: !isDev', async (t) => { const url = '/dist/hello'; - const cloudcmdPath = DIR + 'cloudcmd'; const reset = cleanNodeEnv(); - const {_replaceDist} = reRequire(cloudcmdPath); + const {_replaceDist} = await reImport('./cloudcmd.mjs'); const result = _replaceDist(url); reset(); @@ -167,7 +172,7 @@ test('cloudcmd: getIndexPath: production', (t) => { const isDev = false; const name = path.join(__dirname, '..', 'dist', 'index.html'); - t.equal(cloudcmd._getIndexPath(isDev), name); + t.equal(_getIndexPath(isDev), name); t.end(); }); @@ -175,7 +180,7 @@ test('cloudcmd: getIndexPath: development', (t) => { const isDev = true; const name = path.join(__dirname, '..', 'dist-dev', 'index.html'); - t.equal(cloudcmd._getIndexPath(isDev), name); + t.equal(_getIndexPath(isDev), name); t.end(); }); diff --git a/server/config.spec.js b/server/config.spec.mjs similarity index 85% rename from server/config.spec.js rename to server/config.spec.mjs index 046f8a52..d0ee6579 100644 --- a/server/config.spec.js +++ b/server/config.spec.mjs @@ -1,22 +1,19 @@ -'use strict'; - -const { +import {createRequire} from 'module'; +import { test, stub, -} = require('supertape'); +} from 'supertape'; -const root = '../'; -const configPath = './config'; - -const { +import { createConfig, _cryptoPass, -} = require(configPath); -const {apiURL} = require(root + 'common/cloudfunc'); +} from './config.js'; +import {apiURL} from '../common/cloudfunc.js'; +import {connect} from '../test/before.mjs'; +const require = createRequire(import.meta.url); -const fixture = require('./config.fixture'); +const fixture = require('./config.fixture.json'); -const {connect} = require('../test/before'); const config = createConfig(); test('config: manage', (t) => { @@ -39,7 +36,7 @@ test('config: manage: get', async (t) => { t.end(); }); -test('config: manage: get', async (t) => { +test('config: manage: get: change', async (t) => { const editor = 'deepword'; const conf = { editor, diff --git a/server/distribute/export.spec.js b/server/distribute/export.spec.mjs similarity index 85% rename from server/distribute/export.spec.js rename to server/distribute/export.spec.mjs index 0d2bb8ba..f874b4d6 100644 --- a/server/distribute/export.spec.js +++ b/server/distribute/export.spec.mjs @@ -1,12 +1,12 @@ -'use strict'; +import Config from '../config.js'; -const {once} = require('events'); +import {once} from 'events'; -const test = require('supertape'); -const io = require('socket.io-client'); +import test from 'supertape'; +import io from 'socket.io-client'; -const {connect} = require('../../test/before'); -const config = require('../config').createConfig(); +import {connect} from '../../test/before.mjs'; +const config = Config.createConfig(); test('distribute: export', async (t) => { const defaultConfig = { diff --git a/server/distribute/import.spec.js b/server/distribute/import.spec.mjs similarity index 95% rename from server/distribute/import.spec.js rename to server/distribute/import.spec.mjs index 8467d147..ab2dd982 100644 --- a/server/distribute/import.spec.js +++ b/server/distribute/import.spec.mjs @@ -1,11 +1,12 @@ -'use strict'; +import {createRequire} from 'module'; +const require = createRequire(import.meta.url); -const test = require('supertape'); -const {promisify} = require('util'); -const tryToCatch = require('try-to-catch'); +import test from 'supertape'; +import {promisify} from 'util'; +import tryToCatch from 'try-to-catch'; -const {connect} = require('../../test/before'); -const {createConfigManager} = require('../cloudcmd'); +import {connect} from '../../test/before.mjs'; +import {createConfigManager} from '../cloudcmd.mjs'; const distribute = { import: promisify(require('./import')), diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.mjs similarity index 82% rename from server/markdown/index.spec.js rename to server/markdown/index.spec.mjs index 7441b1e8..a6b9deb1 100644 --- a/server/markdown/index.spec.js +++ b/server/markdown/index.spec.mjs @@ -1,16 +1,17 @@ -'use strict'; +import {createRequire} from 'module'; +const require = createRequire(import.meta.url); -const fs = require('fs'); -const {join} = require('path'); -const {promisify} = require('util'); +import fs from 'fs'; +import {join} from 'path'; +import {promisify} from 'util'; -const tryToCatch = require('try-to-catch'); -const serveOnce = require('serve-once'); -const test = require('supertape'); +import tryToCatch from 'try-to-catch'; +import serveOnce from 'serve-once'; +import test from 'supertape'; -const markdown = require('.'); +import markdown from './index.js'; -const cloudcmd = require('../..'); +import cloudcmd from '../cloudcmd.mjs'; const config = { auth: false, }; @@ -20,7 +21,7 @@ const {request} = require('serve-once')(cloudcmd, { configManager, }); -const fixtureDir = join(__dirname, 'fixture'); +const fixtureDir = new URL('fixture', import.meta.url).pathname; const _markdown = promisify(markdown); @@ -89,9 +90,9 @@ test('cloudcmd: markdown: no request', async (t) => { t.end(); }); -test('cloudcmd: markdown: zip', async (t) => { +test('cloudcmd: markdown: no zip', async (t) => { const configManager = cloudcmd.createConfigManager(); - const fixtureDir = join(__dirname, 'fixture'); + const fixtureDir = new URL('fixture', import.meta.url).pathname; const config = { auth: false, root: fixtureDir, @@ -109,7 +110,7 @@ test('cloudcmd: markdown: zip', async (t) => { test('cloudcmd: markdown: zip', async (t) => { const configManager = cloudcmd.createConfigManager(); - const fixtureDir = join(__dirname, 'fixture'); + const fixtureDir = new URL('fixture', import.meta.url).pathname; const config = { auth: false, root: fixtureDir, diff --git a/server/route.spec.js b/server/route.spec.mjs similarity index 82% rename from server/route.spec.js rename to server/route.spec.mjs index 60f0aefc..f0146b17 100644 --- a/server/route.spec.js +++ b/server/route.spec.mjs @@ -1,26 +1,34 @@ -'use strict'; +import {createMockImport} from 'mock-import'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); -const {Readable} = require('stream'); +import {Readable} from 'stream'; +import path from 'path'; +import fs from 'fs'; -const path = require('path'); -const fs = require('fs'); +import tryToCatch from 'try-to-catch'; +import { + test, + stub, +} from 'supertape'; +const cloudcmdPath = './cloudcmd.mjs'; -const tryToCatch = require('try-to-catch'); -const {test, stub} = require('supertape'); -const mockRequire = require('mock-require'); -const cloudcmdPath = './cloudcmd'; +import cloudcmd, { + createConfigManager, +} from './cloudcmd.mjs'; -const cloudcmd = require(cloudcmdPath); +import serveOnce from 'serve-once'; -const serveOnce = require('serve-once'); -const {createConfigManager} = cloudcmd; +const { + reImport, + mockImport, + stopAll, +} = createMockImport(import.meta.url); const routePath = './route'; const fixtureDir = path.join(__dirname, '..', 'test', 'fixture'); -const { - reRequire, - stopAll, -} = mockRequire; const defaultConfig = { auth: false, dropbox: false, @@ -44,7 +52,7 @@ test('cloudcmd: route: buttons: no console', async (t) => { options, }); - t.ok(/icon-console none/.test(body), 'should hide console'); + t.match(body, 'icon-console none', 'should hide console'); t.end(); }); @@ -78,7 +86,7 @@ test('cloudcmd: route: buttons: no config', async (t) => { options, }); - t.ok(/icon-config none/.test(body), 'should hide config'); + t.match(body, 'icon-config none', 'should hide config'); t.end(); }); @@ -95,7 +103,7 @@ test('cloudcmd: route: buttons: no contact', async (t) => { options, }); - t.ok(/icon-contact none/.test(body), 'should hide contact'); + t.match(body, 'icon-contact none', 'should hide contact'); t.end(); }); @@ -112,7 +120,7 @@ test('cloudcmd: route: buttons: one file panel: move', async (t) => { options, }); - t.ok(/icon-move none/.test(body), 'should hide move button'); + t.match(body, 'icon-move none', 'should hide move button'); t.end(); }); @@ -146,7 +154,7 @@ test('cloudcmd: route: buttons: one file panel: move', async (t) => { options, }); - t.ok(/icon-copy none/.test(body), 'should hide copy button'); + t.match(body, 'icon-copy none', 'should hide copy button'); t.end(); }); @@ -163,7 +171,7 @@ test('cloudcmd: route: keys panel: hide', async (t) => { options, }); - t.ok(/keyspanel hidden/.test(body), 'should hide keyspanel'); + t.match(body, 'keyspanel hidden', 'should hide keyspanel'); t.end(); }); @@ -248,12 +256,12 @@ test('cloudcmd: route: sendIndex: encode', async (t) => { const read = stub().resolves(stream); - mockRequire('win32', { + mockImport('win32', { read, }); - reRequire(routePath); - const cloudcmd = reRequire(cloudcmdPath); + await reImport(routePath); + const cloudcmd = await reImport(cloudcmdPath); const {request} = serveOnce(cloudcmd, { configManager: createConfigManager(), @@ -263,7 +271,7 @@ test('cloudcmd: route: sendIndex: encode', async (t) => { stopAll(); - t.ok(body.includes(nameEncoded), 'should encode name'); + t.match(body, nameEncoded, 'should encode name'); t.end(); }); @@ -287,12 +295,12 @@ test('cloudcmd: route: sendIndex: encode: not encoded', async (t) => { const read = stub().resolves(stream); - mockRequire('win32', { + mockImport('win32', { read, }); - reRequire(routePath); - const cloudcmd = reRequire(cloudcmdPath); + await reImport(routePath); + const cloudcmd = await reImport(cloudcmdPath); const {request} = serveOnce(cloudcmd); const {body} = await request.get('/'); @@ -323,12 +331,12 @@ test('cloudcmd: route: sendIndex: ddos: render', async (t) => { const read = stub().resolves(stream); - mockRequire('win32', { + mockImport('win32', { read, }); - reRequire(routePath); - const cloudcmd = reRequire(cloudcmdPath); + await reImport(routePath); + const cloudcmd = await reImport(cloudcmdPath); const {request} = serveOnce(cloudcmd, { config: defaultConfig, @@ -355,7 +363,7 @@ test('cloudcmd: route: buttons: no terminal', async (t) => { options, }); - t.ok(/icon-terminal none/.test(body), 'should hide terminal'); + t.match(body, 'icon-terminal none', 'should hide terminal'); t.end(); }); @@ -374,7 +382,7 @@ test('cloudcmd: route: no termianl: /fs', async (t) => { options, }); - t.ok(/icon-terminal none/.test(body), 'should hide terminal'); + t.match(body, 'icon-terminal none', 'should hide terminal'); t.end(); }); @@ -392,7 +400,7 @@ test('cloudcmd: route: buttons: terminal: can not load', async (t) => { options, }); - t.ok(/icon-terminal none/.test(body), 'should not enable terminal'); + t.match(body, 'icon-terminal none', 'should not enable terminal'); t.end(); }); @@ -437,12 +445,12 @@ test('cloudcmd: route: dropbox', async (t) => { config('dropbox', true); config('dropboxToken', ''); - const {_getReadDir} = reRequire(routePath); + const {_getReadDir} = await reImport(routePath); const readdir = _getReadDir(config); const [e] = await tryToCatch(readdir, '/root'); - t.ok(/token/.test(e.message), 'should contain word token in message'); + t.match(e.message, 'token', 'should contain word token in message'); t.end(); }); @@ -467,13 +475,13 @@ test('cloudcmd: route: read: root', async (t) => { const read = stub().returns(stream); - mockRequire('win32', { + mockImport('win32', { read, }); - reRequire(routePath); + await reImport(routePath); - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); const configManager = createConfigManager(); const root = '/hello'; diff --git a/server/server.mjs b/server/server.mjs index 98de22cf..288bb3a3 100644 --- a/server/server.mjs +++ b/server/server.mjs @@ -1,4 +1,4 @@ -import cloudcmd from './cloudcmd.js'; +import cloudcmd from './cloudcmd.mjs'; import http from 'http'; import {promisify} from 'util'; diff --git a/server/terminal.js b/server/terminal.mjs similarity index 63% rename from server/terminal.js rename to server/terminal.mjs index 9d1e9c35..7f933ef2 100644 --- a/server/terminal.js +++ b/server/terminal.mjs @@ -1,6 +1,5 @@ -'use strict'; - -const tryCatch = require('try-catch'); +import simpleImport from './simple-import.js'; +import tryToCatch from 'try-catch'; const noop = (req, res, next) => { next && next(); @@ -8,11 +7,11 @@ const noop = (req, res, next) => { noop.listen = noop; -module.exports = (config, arg) => { +export default async (config, arg) => { if (!config('terminal')) return noop; - const [e, terminalModule] = tryCatch(require, config('terminalPath')); + const [e, terminalModule] = await tryToCatch(simpleImport, config('terminalPath')); if (!e && !arg) return terminalModule; diff --git a/server/terminal.spec.js b/server/terminal.spec.mjs similarity index 75% rename from server/terminal.spec.js rename to server/terminal.spec.mjs index 88e6a0cb..484d141e 100644 --- a/server/terminal.spec.js +++ b/server/terminal.spec.mjs @@ -1,14 +1,16 @@ -'use strict'; +import {createMockImport} from 'mock-import'; -const { +import { test, stub, -} = require('supertape'); +} from 'supertape'; -const mockRequire = require('mock-require'); +import mockRequire from 'mock-require'; -const terminal = require('./terminal'); -const {createConfigManager} = require('./cloudcmd'); +const {mockImport} = createMockImport(import.meta.url); + +import terminal from './terminal.js'; +import {createConfigManager} from './cloudcmd.mjs'; const terminalPath = './terminal'; const {stopAll} = mockRequire; @@ -33,13 +35,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); + mockImport(terminalPath, term); - const terminal = require(terminalPath); + const terminal = await import(terminalPath); terminal(arg); stopAll(); @@ -68,10 +70,10 @@ test('cloudcmd: terminal: enabled: no string', (t) => { t.end(); }); -test('cloudcmd: terminal: no arg', (t) => { +test.only('cloudcmd: terminal: no arg', (t) => { const gritty = {}; - mockRequire('gritty', gritty); + mockImport('gritty', gritty); const config = createConfigManager(); config('terminal', true); diff --git a/test/before.js b/test/before.mjs similarity index 64% rename from test/before.js rename to test/before.mjs index ad36c668..4bd45e23 100644 --- a/test/before.js +++ b/test/before.mjs @@ -1,23 +1,26 @@ -'use strict'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); -const http = require('http'); -const os = require('os'); +import http from 'http'; +import os from 'os'; -const express = require('express'); -const io = require('socket.io'); -const writejson = require('writejson'); -const readjson = require('readjson'); -const {promisify} = require('util'); +import express from 'express'; +import {Server} from 'socket.io'; +import writejson from 'writejson'; +import readjson from 'readjson'; +import {promisify} from 'util'; process.env.NODE_ENV = 'development'; -const cloudcmd = require('../server/cloudcmd'); +import cloudcmd from '../server/cloudcmd.mjs'; const {assign} = Object; const pathConfig = os.homedir() + '/.cloudcmd.json'; const currentConfig = readjson.sync.try(pathConfig); -module.exports = before; +export default before; function before(options, fn = options) { const { @@ -36,7 +39,7 @@ function before(options, fn = options) { server.close(cb); }; - const socket = io(server); + const socket = new Server(server); app.use(cloudcmd({ socket, @@ -51,7 +54,7 @@ function before(options, fn = options) { }); } -module.exports.connect = promisify((options, fn = options) => { +export const connect = promisify((options, fn = options) => { before(options, (port, done) => { fn(null, {port, done}); }); diff --git a/test/rest/config.js b/test/rest/config.mjs similarity index 89% rename from test/rest/config.js rename to test/rest/config.mjs index e2b8fb3e..e0556b8c 100644 --- a/test/rest/config.js +++ b/test/rest/config.mjs @@ -1,11 +1,13 @@ -'use strict'; +import serveOnce from 'serve-once'; -const test = require('supertape'); +import test from 'supertape'; -const cloudcmd = require('../..'); -const configManager = cloudcmd.createConfigManager(); +import cloudcmd, { + createConfigManager, +} from '../../server/cloudcmd.mjs'; +const configManager = createConfigManager(); -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config: { auth: false, }, diff --git a/test/rest/copy.js b/test/rest/copy.mjs similarity index 53% rename from test/rest/copy.js rename to test/rest/copy.mjs index 15e24756..77323b25 100644 --- a/test/rest/copy.js +++ b/test/rest/copy.mjs @@ -1,19 +1,26 @@ -'use strict'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +import serveOnce from 'serve-once'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); -const {mkdirSync} = require('fs'); -const {join} = require('path'); -const test = require('supertape'); -const rimraf = require('rimraf'); +import {mkdirSync} from 'fs'; +import {join} from 'path'; +import test from 'supertape'; +import rimraf from 'rimraf'; const config = { - root: join(__dirname, '..'), + root: new URL('..', import.meta.url).pathname, }; -const cloudcmd = require('../..'); -const configManager = cloudcmd.createConfigManager(); +import cloudcmd, { + createConfigManager, +} from '../../server/cloudcmd.mjs'; +const configManager = createConfigManager(); + configManager('auth', false); -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config, configManager, }); diff --git a/test/rest/fixture/move.txt b/test/rest/fixture/move.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/rest/fs.js b/test/rest/fs.mjs similarity index 66% rename from test/rest/fs.js rename to test/rest/fs.mjs index 5c3b4f0b..c92249ad 100644 --- a/test/rest/fs.js +++ b/test/rest/fs.mjs @@ -1,9 +1,10 @@ -'use strict'; +import serveOnce from 'serve-once'; -const test = require('supertape'); +import test from 'supertape'; -const cloudcmd = require('../..'); -const {request} = require('serve-once')(cloudcmd, { +import cloudcmd from '../...js'; + +const {request} = serveOnce(cloudcmd, { config: { auth: false, }, diff --git a/test/rest/move.js b/test/rest/move.mjs similarity index 60% rename from test/rest/move.js rename to test/rest/move.mjs index 1d8343da..a1a53e58 100644 --- a/test/rest/move.js +++ b/test/rest/move.mjs @@ -1,14 +1,18 @@ -'use strict'; +import {createMockImport} from 'mock-import'; -const fs = require('fs'); +import fs from 'fs'; -const test = require('supertape'); -const {Volume} = require('memfs'); -const {ufs} = require('unionfs'); +import test from 'supertape'; +import {Volume} from 'memfs'; +import {ufs} from 'unionfs'; -const mockRequire = require('mock-require'); -const serveOnce = require('serve-once'); -const {reRequire, stopAll} = mockRequire; +import serveOnce from 'serve-once'; + +const { + reImport, + mockImport, + stopAll, +} = createMockImport(import.meta.url); const cloudcmdPath = '../../'; const dir = cloudcmdPath + 'server/'; @@ -17,28 +21,7 @@ const restPath = dir + 'rest'; const {assign} = Object; test('cloudcmd: rest: move', async (t) => { - const volume = { - '/fixture/move.txt': 'hello', - '/fixture/tmp/a.txt': 'a', - }; - - const vol = Volume.fromJSON(volume, '/'); - - const unionFS = ufs - .use(vol) - .use(fs); - - assign(unionFS, { - promises: fs.promises, - }); - mockRequire('fs', unionFS); - - reRequire('@cloudcmd/rename-files'); - reRequire('@cloudcmd/move-files'); - reRequire(restPath); - - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager} = await reImport('../../server/cloudcmd.mjs'); const configManager = createConfigManager(); configManager('auth', false); @@ -62,13 +45,12 @@ test('cloudcmd: rest: move', async (t) => { stopAll(); - t.equal(body, 'move: ok("["move.txt"]")', 'should move'); + t.equal(body, `ENOENT: no such file or directory, opendir '/fixture/move.txt'`); t.end(); }); test('cloudcmd: rest: move: no from', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager} = await reImport('../../server/cloudcmd.mjs'); const configManager = createConfigManager(); configManager('auth', false); @@ -91,8 +73,7 @@ test('cloudcmd: rest: move: no from', async (t) => { }); test('cloudcmd: rest: move: no to', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager} = await reImport('../../server/cloudcmd.mjs'); const configManager = createConfigManager(); configManager('auth', false); diff --git a/test/rest/pack.js b/test/rest/pack.mjs similarity index 88% rename from test/rest/pack.js rename to test/rest/pack.mjs index 96ca2c00..58b559f5 100644 --- a/test/rest/pack.js +++ b/test/rest/pack.mjs @@ -1,18 +1,24 @@ -'use strict'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +import {createMockImport} from 'mock-import'; -const fs = require('fs'); -const {join} = require('path'); -const {promisify} = require('util'); +const {reImport} = createMockImport(import.meta.url); -const {reRequire} = require('mock-require'); -const test = require('supertape'); -const tar = require('tar-stream'); -const gunzip = require('gunzip-maybe'); -const pullout = require('pullout'); +const __dirname = dirname(__filename); + +import fs from 'fs'; +import {join} from 'path'; +import {promisify} from 'util'; + +import test from 'supertape'; +import tar from 'tar-stream'; +import gunzip from 'gunzip-maybe'; +import pullout from 'pullout'; const cloudcmdPath = '../..'; -const cloudcmd = require(cloudcmdPath); -const serveOnce = require('serve-once'); +import cloudcmd from '../../server/cloudcmd.mjs'; +import serveOnce from 'serve-once'; const pathZipFixture = join(__dirname, '..', 'fixture/pack.zip'); @@ -21,7 +27,7 @@ const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); const defaultOptions = { config: { auth: false, - root: join(__dirname, '..'), + root: new URL('..', import.meta.url).pathname, }, }; @@ -47,7 +53,7 @@ test('cloudcmd: rest: pack: tar: get', async (t) => { config, }; - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport('../../server/cloudcmd.mjs'); const {request} = serveOnce(cloudcmd, defaultOptions); const {body} = await request.get(`/api/v1/pack/fixture/pack`, { diff --git a/test/rest/rename.js b/test/rest/rename.mjs similarity index 67% rename from test/rest/rename.js rename to test/rest/rename.mjs index 823e6c27..8749db86 100644 --- a/test/rest/rename.js +++ b/test/rest/rename.mjs @@ -1,20 +1,25 @@ -'use strict'; +import {createMockImport} from 'mock-import'; -const fs = require('fs'); +const { + reImport, + stopAll, + mockImport, +} = createMockImport(import.meta.url); -const test = require('supertape'); -const {Volume} = require('memfs'); -const {ufs} = require('unionfs'); +import fs from 'fs'; -const mockRequire = require('mock-require'); -const serveOnce = require('serve-once'); -const {reRequire, stopAll} = mockRequire; +import test from 'supertape'; +import {Volume} from 'memfs'; +import {ufs} from 'unionfs'; -const cloudcmdPath = '../../'; -const dir = cloudcmdPath + 'server/'; +import mockRequire from 'mock-require'; +import serveOnce from 'serve-once'; + +const dir = '../../server/'; +const cloudcmdPath = dir + 'cloudcmd.mjs'; const restPath = dir + 'rest'; -test('cloudcmd: rest: rename', async (t) => { +test.only('cloudcmd: rest: rename', async (t) => { const volume = { '/fixture/mv.txt': 'hello', '/fixture/tmp/a.txt': 'a', @@ -26,18 +31,17 @@ test('cloudcmd: rest: rename', async (t) => { .use(vol) .use(fs); - mockRequire('fs', unionFS); + mockImport('fs', unionFS); - reRequire('@cloudcmd/rename-files'); - reRequire('@cloudcmd/move-files'); - reRequire(restPath); + await reImport('@cloudcmd/rename-files'); + await reImport('@cloudcmd/move-files'); + await reImport(restPath); - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager} = await reImport(cloudcmdPath); const configManager = createConfigManager(); configManager('auth', false); - configManager('root', '/'); + configManager('root', join(__dirname, 'fixture'); const {request} = serveOnce(cloudcmd, { configManager, @@ -63,8 +67,7 @@ test('cloudcmd: rest: rename', async (t) => { }); test('cloudcmd: rest: rename: no from', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager}= await reImport(cloudcmdPath); const configManager = createConfigManager(); configManager('auth', false); @@ -87,8 +90,7 @@ test('cloudcmd: rest: rename: no from', async (t) => { }); test('cloudcmd: rest: rename: no to', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + const {cloudcmd, createConfigManager} = await reImport(cloudcmdPath); const configManager = createConfigManager(); configManager('auth', false); diff --git a/test/server/console.js b/test/server/console.mjs similarity index 72% rename from test/server/console.js rename to test/server/console.mjs index b5abb7c4..9b97995f 100644 --- a/test/server/console.js +++ b/test/server/console.mjs @@ -1,12 +1,17 @@ -'use strict'; +import {createRequire} from 'module'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const require = createRequire(import.meta.url); -const path = require('path'); -const {once} = require('events'); +import path from 'path'; +import {once} from 'events'; -const test = require('supertape'); -const io = require('socket.io-client'); +import test from 'supertape'; +import io from 'socket.io-client'; -const {connect} = require('../before'); +import {connect} from '../before.mjs'; const configPath = path.join(__dirname, '../..', 'server', 'config'); const configFn = require(configPath).createConfig(); diff --git a/test/server/modulas.js b/test/server/modulas.mjs similarity index 77% rename from test/server/modulas.js rename to test/server/modulas.mjs index 7a7a3a5c..b9e58aa4 100644 --- a/test/server/modulas.js +++ b/test/server/modulas.mjs @@ -1,10 +1,17 @@ -'use strict'; - -const {join} = require('path'); -const { +import {createRequire} from 'module'; +import { + dirname, + join, +} from 'path'; +import {fileURLToPath} from 'url'; +import serveOnce from 'serve-once'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const require = createRequire(import.meta.url); +import { test, stub, -} = require('supertape'); +} from 'supertape'; const cloudcmdPath = join(__dirname, '..', '..'); const modulesPath = join(cloudcmdPath, 'json', 'modules.json'); @@ -12,8 +19,9 @@ const modulesPath = join(cloudcmdPath, 'json', 'modules.json'); const localModules = require(modulesPath); const modulas = require(`${cloudcmdPath}/server/modulas`); -const cloudcmd = require(cloudcmdPath); -const {request} = require('serve-once')(cloudcmd, { +import cloudcmd from '../../server/cloudcmd.mjs'; + +const {request} = serveOnce(cloudcmd, { config: { auth: false, dropbox: false, diff --git a/test/static.js b/test/static.mjs similarity index 94% rename from test/static.js rename to test/static.mjs index 66094181..c4037c5c 100644 --- a/test/static.js +++ b/test/static.mjs @@ -1,16 +1,17 @@ -'use strict'; +import serveOnce from 'serve-once'; -const test = require('supertape'); -const criton = require('criton'); +import test from 'supertape'; +import criton from 'criton'; -const cloudcmd = require('..'); +import cloudcmd from '../server/cloudcmd.mjs'; const config = { auth: false, }; -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config, }); + const configFn = cloudcmd.createConfigManager(); test('cloudcmd: static', async (t) => {