From 56fa18043f52f5e690306eb6c9415a2e00d2c5a5 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 18 Mar 2024 17:59:45 +0200 Subject: [PATCH] feature: convert to ESM --- .madrun.mjs | 6 +- package.json | 5 +- server/{cloudcmd.js => cloudcmd.mjs} | 91 ++++++++++--------- .../{cloudcmd.spec.js => cloudcmd.spec.mjs} | 48 +++++----- server/{config.spec.js => config.spec.mjs} | 19 ++-- .../{export.spec.js => export.spec.mjs} | 14 ++- .../{import.spec.js => import.spec.mjs} | 18 ++-- .../{index.spec.js => index.spec.mjs} | 27 +++--- server/{route.spec.js => route.spec.mjs} | 58 ++++++------ server/server.mjs | 2 +- .../{terminal.spec.js => terminal.spec.mjs} | 22 ++--- .../{validate.spec.js => validate.spec.mjs} | 60 ++++++------ test/{before.js => before.mjs} | 31 ++++--- test/rest/{config.js => config.mjs} | 10 +- test/rest/{copy.js => copy.mjs} | 23 ++--- test/rest/{fs.js => fs.mjs} | 9 +- test/rest/{move.js => move.mjs} | 47 +++++----- test/rest/{pack.js => pack.mjs} | 34 +++---- test/rest/{rename.js => rename.mjs} | 40 ++++---- test/server/{console.js => console.mjs} | 18 ++-- test/server/env.js | 2 +- test/server/{modulas.js => modulas.mjs} | 17 ++-- test/{static.js => static.mjs} | 11 +-- 23 files changed, 303 insertions(+), 309 deletions(-) rename server/{cloudcmd.js => cloudcmd.mjs} (76%) 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} (83%) rename server/{route.spec.js => route.spec.mjs} (89%) rename server/{terminal.spec.js => terminal.spec.mjs} (75%) rename server/{validate.spec.js => validate.spec.mjs} (62%) rename test/{before.js => before.mjs} (63%) rename test/rest/{config.js => config.mjs} (92%) rename test/rest/{copy.js => copy.mjs} (63%) rename test/rest/{fs.js => fs.mjs} (64%) rename test/rest/{move.js => move.mjs} (71%) rename test/rest/{pack.js => pack.mjs} (87%) rename test/rest/{rename.js => rename.mjs} (74%) 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 bda4dcdf..a7167319 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, @@ -33,9 +33,9 @@ export default { 'lint:fresh': () => run('lint', '--fresh'), 'fix:lint': () => run('lint', '--fix'), 'lint:stream': () => run('lint', '-f stream'), - 'test': () => [testEnv, `tape 'test/**/*.js' '{client,static,common,server}/**/*.spec.js' -f fail`], + 'test': () => [testEnv, `escover tape 'test/**/*.{js,mjs}' '{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'`, + 'test:server': () => `tape 'test/**/*.{js,mjs}' 'server/**/*.spec.{js,mjs}' 'common/**/*.spec.{js,mjs}'`, 'wisdom': () => run(['lint:all', 'build', 'test']), 'wisdom:type': () => 'bin/release.mjs', 'coverage': async () => [testEnv, `c8 ${await cutEnv('test')}`], diff --git a/package.json b/package.json index d791677c..dca533b7 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "type": "git", "url": "git://github.com/coderaiser/cloudcmd.git" }, - "main": "server/cloudcmd.js", + "main": "server/cloudcmd.mjs", "keywords": [ "console", "terminal", @@ -170,6 +170,7 @@ "css-modules-require-hook": "^4.2.3", "domtokenlist-shim": "^1.2.0", "emitify": "^4.0.1", + "escover": "^4.1.0", "eslint": "^8.0.1", "eslint-plugin-n": "^16.0.1", "eslint-plugin-putout": "^22.0.0", @@ -186,6 +187,7 @@ "madrun": "^10.0.0", "memfs": "^4.2.0", "minor": "^1.2.2", + "mock-import": "^4.0.3", "mock-require": "^3.0.1", "morgan": "^1.6.1", "multi-rename": "^2.0.0", @@ -195,7 +197,6 @@ "place": "^1.1.4", "readjson": "^2.0.1", "redlint": "^3.13.1", - "request": "^2.76.0", "rimraf": "^5.0.1", "scroll-into-view-if-needed": "^3.0.4", "serve-once": "^3.0.1", diff --git a/server/cloudcmd.js b/server/cloudcmd.mjs similarity index 76% rename from server/cloudcmd.js rename to server/cloudcmd.mjs index 8991b969..dd4d69d3 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.mjs @@ -1,44 +1,44 @@ -'use strict'; +import {join} from 'node:path'; +import process from 'node:process'; +import {readFileSync} from 'node:fs'; +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'; +import cloudfunc from '../common/cloudfunc.js'; +import authentication from './auth.js'; +import modulas from './modulas.js'; +import userMenu from './user-menu.js'; +import rest from './rest/index.js'; +import route from './route.js'; +import validate from './validate.js'; +import prefixer from './prefixer.js'; +import terminal from './terminal.js'; +import distribute from './distribute/index.js'; +import {createConfig, configPath} from './config.js'; -const process = require('process'); -const DIR = `${__dirname}/`; -const DIR_COMMON = `${DIR}../common/`; -const path = require('path'); +const {assign} = Object; -const fs = require('fs'); -const cloudfunc = require(`${DIR_COMMON}cloudfunc`); +export { + createConfig, + configPath, + CloudCmdMiddleware as cloudcmd, +}; -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 DIR_ROOT = `${DIR}../`; +const DIR_ROOT = new URL('..', import.meta.url).pathname; const isDev = process.env.NODE_ENV === 'development'; const getDist = (isDev) => isDev ? 'dist-dev' : 'dist'; -const getIndexPath = (isDev) => path.join(DIR, '..', `${getDist(isDev)}/index.html`); -const html = fs.readFileSync(getIndexPath(isDev), 'utf8'); +const getIndexPath = (isDev) => join(DIR_ROOT, `${getDist(isDev)}/index.html`); +const html = readFileSync(getIndexPath(isDev), 'utf8'); const initAuth = currify(_initAuth); const notEmpty = (a) => a; @@ -47,7 +47,7 @@ const clean = (a) => a.filter(notEmpty); const isUndefined = (a) => typeof a === 'undefined'; const isFn = (a) => typeof a === 'function'; -module.exports = (params) => { +export default function CloudCmdMiddleware(params) { const p = params || {}; const options = p.config || {}; const config = p.configManager || createConfig({ @@ -55,7 +55,6 @@ module.exports = (params) => { }); const {modules} = p; - const keys = Object.keys(options); for (const name of keys) { @@ -89,12 +88,11 @@ module.exports = (params) => { modules, config, }); -}; +} -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]; @@ -106,7 +104,12 @@ function defaultValue(config, name, options) { return value; } -module.exports._getPrefix = getPrefix; +export const _getPrefix = getPrefix; + +assign(CloudCmdMiddleware, { + createConfigManager, +}); + function getPrefix(prefix) { if (isFn(prefix)) return prefix() || ''; @@ -114,8 +117,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(); @@ -255,7 +257,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 ca4d49cc..7136a953 100644 --- a/server/cloudcmd.spec.js +++ b/server/cloudcmd.spec.mjs @@ -1,34 +1,32 @@ -'use strict'; +import process from 'node:process'; +import path, {dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {createMockImport} from 'mock-import'; +import serveOnce from 'serve-once'; +import {test, stub} from 'supertape'; +import cloudcmd, { + createConfigManager, + _getIndexPath, + _getPrefix, + _initAuth, +} from './cloudcmd.mjs'; -const process = require('process'); -const path = require('path'); +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); -const {test, stub} = require('supertape'); +const {reImport} = createMockImport(import.meta.url); -const {reRequire} = require('mock-require'); - -const DIR = './'; -const cloudcmdPath = `${DIR}cloudcmd`; - -const cloudcmd = require(cloudcmdPath); -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config: { auth: false, dropbox: false, }, }); -const { - createConfigManager, - _getPrefix, - _initAuth, -} = cloudcmd; - test('cloudcmd: defaults: config', (t) => { const configManager = createConfigManager(); configManager('configDialog', false); - cloudcmd({ configManager, }); @@ -75,12 +73,12 @@ 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('./cloudcmd.mjs'); const url = '/dist/hello'; const result = _replaceDist(url); @@ -92,12 +90,10 @@ 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 +163,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 +171,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 6732a174..21cea8c0 100644 --- a/server/config.spec.js +++ b/server/config.spec.mjs @@ -1,17 +1,12 @@ -'use strict'; +import {createRequire} from 'node:module'; +import {test, stub} from 'supertape'; +import {createConfig, _cryptoPass} from './config.js'; +import {apiURL} from '../common/cloudfunc.js'; +import {connect} from '../test/before.mjs'; -const {test, stub} = require('supertape'); +const require = createRequire(import.meta.url); +const fixture = require('./config.fixture.json'); -const root = '../'; -const configPath = './config'; - -const {createConfig, _cryptoPass} = require(configPath); - -const {apiURL} = require(`${root}common/cloudfunc`); - -const fixture = require('./config.fixture'); - -const {connect} = require('../test/before'); const config = createConfig(); test('config: manage', (t) => { 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 df1f6911..c8fc4d58 100644 --- a/server/distribute/export.spec.js +++ b/server/distribute/export.spec.mjs @@ -1,12 +1,10 @@ -'use strict'; +import {once} from 'node:events'; +import test from 'supertape'; +import io from 'socket.io-client'; +import {connect} from '../../test/before.mjs'; +import Config from '../config.js'; -const {once} = require('events'); - -const test = require('supertape'); -const io = require('socket.io-client'); - -const {connect} = require('../../test/before'); -const config = require('../config').createConfig(); +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 c171bf07..1ee3ff05 100644 --- a/server/distribute/import.spec.js +++ b/server/distribute/import.spec.mjs @@ -1,15 +1,13 @@ -'use strict'; - -const process = require('process'); -const test = require('supertape'); -const {promisify} = require('util'); -const tryToCatch = require('try-to-catch'); - -const {connect} = require('../../test/before'); -const {createConfigManager} = require('../cloudcmd'); +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'; +import distributeImport from './import.js'; const distribute = { - import: promisify(require('./import')), + import: promisify(distributeImport), }; const config = createConfigManager(); diff --git a/server/markdown/index.spec.js b/server/markdown/index.spec.mjs similarity index 83% rename from server/markdown/index.spec.js rename to server/markdown/index.spec.mjs index 31817ec3..fabfa630 100644 --- a/server/markdown/index.spec.js +++ b/server/markdown/index.spec.mjs @@ -1,16 +1,15 @@ -'use strict'; +import fs from 'node:fs'; +import {join} from 'node:path'; +import {promisify} from 'node:util'; +import tryToCatch from 'try-to-catch'; +import serveOnce from 'serve-once'; +import test from 'supertape'; +import {createRequire} from 'node:module'; +import markdown from './index.js'; +import cloudcmd from '../cloudcmd.mjs'; -const fs = require('fs'); -const {join} = require('path'); -const {promisify} = require('util'); +const require = createRequire(import.meta.url); -const tryToCatch = require('try-to-catch'); -const serveOnce = require('serve-once'); -const test = require('supertape'); - -const markdown = require('.'); - -const cloudcmd = require('../..'); const config = { auth: false, }; @@ -22,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); @@ -93,7 +92,7 @@ test('cloudcmd: markdown: no request', async (t) => { test('cloudcmd: markdown', 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, @@ -112,7 +111,7 @@ test('cloudcmd: markdown', 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 89% rename from server/route.spec.js rename to server/route.spec.mjs index 01061a84..8da3e00a 100644 --- a/server/route.spec.js +++ b/server/route.spec.mjs @@ -1,25 +1,27 @@ -'use strict'; +import {createMockImport} from 'mock-import'; +import {Readable} from 'node:stream'; +import path, {dirname} from 'node:path'; +import fs from 'node:fs'; +import {fileURLToPath} from 'node:url'; +import tryToCatch from 'try-to-catch'; +import serveOnce from 'serve-once'; +import {test, stub} from 'supertape'; +import cloudcmd from './cloudcmd.mjs'; -const {Readable} = require('stream'); +const { + stopAll, + reImport, + mockImport, +} = createMockImport(import.meta.url); -const path = require('path'); -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 __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const cloudcmdPath = './cloudcmd.mjs'; const {createConfigManager} = cloudcmd; const routePath = './route'; const fixtureDir = path.join(__dirname, '..', 'test', 'fixture'); -const {reRequire, stopAll} = mockRequire; - const defaultConfig = { auth: false, dropbox: false, @@ -231,12 +233,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(), @@ -270,12 +272,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('/'); @@ -306,12 +308,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, @@ -422,7 +424,7 @@ 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'); @@ -453,13 +455,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 09cabb69..712d1cd2 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 'node:http'; import {promisify} from 'node:util'; import currify from 'currify'; 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 71abca17..5222c057 100644 --- a/server/terminal.spec.js +++ b/server/terminal.spec.mjs @@ -1,12 +1,12 @@ -'use strict'; +import {test, stub} from 'supertape'; +import mockRequire from 'mock-require'; +import {createMockImport} from 'mock-import'; +import terminal from './terminal.js'; +import {createConfigManager} from './cloudcmd.mjs'; -const {test, stub} = require('supertape'); +const {mockImport} = createMockImport(import.meta.url); -const mockRequire = require('mock-require'); - -const terminal = require('./terminal'); -const {createConfigManager} = require('./cloudcmd'); -const terminalPath = './terminal'; +const terminalPath = './terminal.js'; const {stopAll} = mockRequire; @@ -30,13 +30,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,7 +68,7 @@ test('cloudcmd: terminal: enabled: no string', (t) => { test('cloudcmd: terminal: no arg', (t) => { const gritty = {}; - mockRequire('gritty', gritty); + mockImport('gritty', gritty); const config = createConfigManager(); config('terminal', true); diff --git a/server/validate.spec.js b/server/validate.spec.mjs similarity index 62% rename from server/validate.spec.js rename to server/validate.spec.mjs index 64ebb922..35af8092 100644 --- a/server/validate.spec.js +++ b/server/validate.spec.mjs @@ -1,22 +1,22 @@ -'use strict'; +import fs from 'node:fs'; +import {test, stub} from 'supertape'; +import tryCatch from 'try-catch'; +import {createMockImport} from 'mock-import'; +import validate from './validate.js'; +import cloudcmd from './cloudcmd.mjs'; -const fs = require('fs'); +const { + stopAll, + mockImport, + reImport, +} = createMockImport(import.meta.url); -const {test, stub} = require('supertape'); - -const tryCatch = require('try-catch'); -const mockRequire = require('mock-require'); const dir = '..'; +const validatePath = `${dir}/server/validate.js`; -const validatePath = `${dir}/server/validate`; +const columnsPath = `${dir}/server/columns.js`; -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; +const exitPath = `${dir}/server/exit.js`; test('validate: root: bad', (t) => { const config = { @@ -48,7 +48,7 @@ test('validate: root: /', (t) => { t.end(); }); -test('validate: root: stat', (t) => { +test('validate: root: stat', async (t) => { const fn = stub(); const {statSync} = fs; @@ -58,9 +58,9 @@ test('validate: root: stat', (t) => { throw Error(error); }; - mockRequire(exitPath, fn); + mockImport(exitPath, fn); - const {root} = reRequire(validatePath); + const {root} = await reImport(validatePath); root('hello', fn); @@ -74,12 +74,12 @@ test('validate: root: stat', (t) => { t.end(); }); -test('validate: packer: not valid', (t) => { +test('validate: packer: not valid', async (t) => { const fn = stub(); - mockRequire(exitPath, fn); + mockImport(exitPath, fn); - const {packer} = reRequire(validatePath); + const {packer} = await reImport(validatePath); const msg = 'cloudcmd --packer: could be "tar" or "zip" only'; packer('hello'); @@ -90,12 +90,12 @@ test('validate: packer: not valid', (t) => { t.end(); }); -test('validate: editor: not valid', (t) => { +test('validate: editor: not valid', async (t) => { const fn = stub(); - mockRequire(exitPath, fn); + mockImport(exitPath, fn); - const {editor} = reRequire(validatePath); + const {editor} = await reImport(validatePath); const msg = 'cloudcmd --editor: could be "dword", "edward" or "deepword" only'; editor('hello'); @@ -106,11 +106,11 @@ test('validate: editor: not valid', (t) => { t.end(); }); -test('validate: columns', (t) => { +test('validate: columns', async (t) => { const fn = stub(); - mockRequire(exitPath, fn); + mockImport(exitPath, fn); - const {columns} = require(validatePath); + const {columns} = await import(validatePath); columns('name-size-date'); @@ -120,16 +120,16 @@ test('validate: columns', (t) => { t.end(); }); -test('validate: columns: wrong', (t) => { +test('validate: columns: wrong', async (t) => { const fn = stub(); - mockRequire(exitPath, fn); - mockRequire(columnsPath, { + mockImport(exitPath, fn); + mockImport(columnsPath, { 'name-size-date': '', 'name-size': '', }); - const {columns} = reRequire(validatePath); + const {columns} = await reImport(validatePath); const msg = 'cloudcmd --columns: can be only one of: "name-size-date", "name-size"'; columns('hello'); diff --git a/test/before.js b/test/before.mjs similarity index 63% rename from test/before.js rename to test/before.mjs index e3e1deff..2c15bdd3 100644 --- a/test/before.js +++ b/test/before.mjs @@ -1,24 +1,25 @@ -'use strict'; +import process from 'node:process'; +import http from 'node:http'; +import os from 'node:os'; +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 process = require('process'); -const http = require('http'); -const os = require('os'); - -const express = require('express'); -const io = require('socket.io'); -const writejson = require('writejson'); -const readjson = require('readjson'); -const {promisify} = require('util'); +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); process.env.NODE_ENV = 'development'; - -const cloudcmd = require('../server/cloudcmd'); 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 { @@ -38,7 +39,7 @@ function before(options, fn = options) { server.close(cb); }; - const socket = io(server); + const socket = new Server(server); app.use(cloudcmd({ socket, @@ -54,7 +55,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, diff --git a/test/rest/config.js b/test/rest/config.mjs similarity index 92% rename from test/rest/config.js rename to test/rest/config.mjs index 020ef9e7..b31c65af 100644 --- a/test/rest/config.js +++ b/test/rest/config.mjs @@ -1,11 +1,9 @@ -'use strict'; +import serveOnce from 'serve-once'; +import test from 'supertape'; +import cloudcmd from '../../server/cloudcmd.mjs'; -const test = require('supertape'); - -const cloudcmd = require('../..'); const configManager = cloudcmd.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 63% rename from test/rest/copy.js rename to test/rest/copy.mjs index 424e9164..68596439 100644 --- a/test/rest/copy.js +++ b/test/rest/copy.mjs @@ -1,24 +1,17 @@ -'use strict'; +import {mkdirSync} from 'node:fs'; +import {join, dirname} from 'node:path'; +import test from 'supertape'; +import {rimraf} from 'rimraf'; +import {fileURLToPath} from 'node:url'; +import cloudcmd from '../../server/cloudcmd.mjs'; -const {mkdirSync} = require('fs'); -const {join} = require('path'); -const test = require('supertape'); -const rimraf = require('rimraf'); +const __filename = fileURLToPath(import.meta.url); -const config = { - root: join(__dirname, '..'), -}; - -const cloudcmd = require('../..'); +const __dirname = dirname(__filename); const configManager = cloudcmd.createConfigManager(); configManager('auth', false); -const {request} = require('serve-once')(cloudcmd, { - config, - configManager, -}); - const fixtureDir = join(__dirname, '..', 'fixture') + '/'; test('cloudcmd: rest: copy', async (t) => { diff --git a/test/rest/fs.js b/test/rest/fs.mjs similarity index 64% rename from test/rest/fs.js rename to test/rest/fs.mjs index 016b1341..7557ede0 100644 --- a/test/rest/fs.js +++ b/test/rest/fs.mjs @@ -1,9 +1,8 @@ -'use strict'; +import serveOnce from 'serve-once'; +import test from 'supertape'; +import cloudcmd from '../../server/cloudcmd.mjs'; -const test = require('supertape'); - -const cloudcmd = require('../..'); -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config: { auth: false, }, diff --git a/test/rest/move.js b/test/rest/move.mjs similarity index 71% rename from test/rest/move.js rename to test/rest/move.mjs index 2f1a01b7..8783920e 100644 --- a/test/rest/move.js +++ b/test/rest/move.mjs @@ -1,18 +1,19 @@ -'use strict'; +import {createMockImport} from 'mock-import'; +import fs from 'node:fs'; +import test from 'supertape'; +import {Volume} from 'memfs'; +import {ufs} from 'unionfs'; +import serveOnce from 'serve-once'; -const fs = require('fs'); +const { + stopAll, + mockImport, + reImport, +} = createMockImport(import.meta.url); -const test = require('supertape'); -const {Volume} = require('memfs'); -const {ufs} = require('unionfs'); - -const mockRequire = require('mock-require'); -const serveOnce = require('serve-once'); -const {reRequire, stopAll} = mockRequire; - -const cloudcmdPath = '../../'; -const dir = `${cloudcmdPath}server/`; -const restPath = `${dir}rest`; +const dir = `../../server/`; +const cloudcmdPath = `${dir}cloudcmd.mjs`; +const restPath = `${dir}rest/index.js`; const {assign} = Object; @@ -31,14 +32,17 @@ test('cloudcmd: rest: move', async (t) => { assign(unionFS, { promises: fs.promises, }); - mockRequire('fs', unionFS); - reRequire('@cloudcmd/rename-files'); - reRequire('@cloudcmd/move-files'); - reRequire(restPath); + mockImport('fs', unionFS); - const cloudcmd = reRequire(cloudcmdPath); - const {createConfigManager} = cloudcmd; + await reImport('@cloudcmd/rename-files'); + await reImport('@cloudcmd/move-files'); + await reImport(restPath); + + const { + cloudcmd, + createConfigManager, + } = await reImport(cloudcmdPath); const configManager = createConfigManager(); configManager('auth', false); @@ -65,7 +69,8 @@ test('cloudcmd: rest: move', async (t) => { }); test('cloudcmd: rest: move: no from', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); + const {createConfigManager} = cloudcmd; const configManager = createConfigManager(); @@ -89,7 +94,7 @@ test('cloudcmd: rest: move: no from', async (t) => { }); test('cloudcmd: rest: move: no to', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); const {createConfigManager} = cloudcmd; const configManager = createConfigManager(); diff --git a/test/rest/pack.js b/test/rest/pack.mjs similarity index 87% rename from test/rest/pack.js rename to test/rest/pack.mjs index 3c083a5d..211315a8 100644 --- a/test/rest/pack.js +++ b/test/rest/pack.mjs @@ -1,19 +1,19 @@ -'use strict'; - -const fs = require('fs'); -const {join} = require('path'); -const {promisify} = require('util'); - -const {reRequire} = require('mock-require'); -const test = require('supertape'); -const tar = require('tar-stream'); -const gunzip = require('gunzip-maybe'); -const pullout = require('pullout'); - -const cloudcmdPath = '../..'; -const cloudcmd = require(cloudcmdPath); -const serveOnce = require('serve-once'); +import {createMockImport} from 'mock-import'; +import {fileURLToPath} from 'node:url'; +import fs from 'node:fs'; +import {join, dirname} from 'node:path'; +import {promisify} from 'node:util'; +import test from 'supertape'; +import tar from 'tar-stream'; +import gunzip from 'gunzip-maybe'; +import pullout from 'pullout'; +import serveOnce from 'serve-once'; +import cloudcmd from '../../server/cloudcmd.mjs'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const cloudcmdPath = '../../server/cloudcmd.mjs'; +const {reImport} = createMockImport(import.meta.url); const pathZipFixture = join(__dirname, '..', 'fixture/pack.zip'); const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); @@ -21,7 +21,7 @@ const pathTarFixture = join(__dirname, '..', 'fixture/pack.tar.gz'); const defaultOptions = { config: { auth: false, - root: join(__dirname, '..'), + root: new URL('..', import.meta.url).pathname, }, }; @@ -48,7 +48,7 @@ test('cloudcmd: rest: pack: tar: get', async (t) => { config, }; - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); 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 74% rename from test/rest/rename.js rename to test/rest/rename.mjs index bd5cec32..acd48528 100644 --- a/test/rest/rename.js +++ b/test/rest/rename.mjs @@ -1,17 +1,19 @@ -'use strict'; +import {createMockImport} from 'mock-import'; +import fs from 'node:fs'; +import test from 'supertape'; +import {Volume} from 'memfs'; +import {ufs} from 'unionfs'; +import mockRequire from 'mock-require'; +import serveOnce from 'serve-once'; -const fs = require('fs'); +const { + stopAll, + mockImport, + reImport, +} = createMockImport(import.meta.url); -const test = require('supertape'); -const {Volume} = require('memfs'); -const {ufs} = require('unionfs'); - -const mockRequire = require('mock-require'); -const serveOnce = require('serve-once'); -const {reRequire, stopAll} = mockRequire; - -const cloudcmdPath = '../../'; -const dir = `${cloudcmdPath}server/`; +const dir = `../../server/`; +const cloudcmdPath = `${dir}cloudcmd.mjs`; const restPath = `${dir}rest`; test('cloudcmd: rest: rename', async (t) => { @@ -26,13 +28,13 @@ 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 {cloudcmd} = await reImport(cloudcmdPath); const {createConfigManager} = cloudcmd; const configManager = createConfigManager(); @@ -63,7 +65,7 @@ test('cloudcmd: rest: rename', async (t) => { }); test('cloudcmd: rest: rename: no from', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); const {createConfigManager} = cloudcmd; const configManager = createConfigManager(); @@ -87,7 +89,7 @@ test('cloudcmd: rest: rename: no from', async (t) => { }); test('cloudcmd: rest: rename: no to', async (t) => { - const cloudcmd = reRequire(cloudcmdPath); + const {cloudcmd} = await reImport(cloudcmdPath); const {createConfigManager} = cloudcmd; const configManager = createConfigManager(); 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 c0e9ce58..e542a6d5 100644 --- a/test/server/console.js +++ b/test/server/console.mjs @@ -1,12 +1,14 @@ -'use strict'; +import {createRequire} from 'node:module'; +import path, {dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {once} from 'node:events'; +import test from 'supertape'; +import {io} from 'socket.io-client'; +import {connect} from '../before.mjs'; -const path = require('path'); -const {once} = require('events'); - -const test = require('supertape'); -const io = require('socket.io-client'); - -const {connect} = require('../before'); +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const require = createRequire(import.meta.url); const configPath = path.join(__dirname, '../..', 'server', 'config'); const configFn = require(configPath).createConfig(); diff --git a/test/server/env.js b/test/server/env.js index fa9c421d..3776aa39 100644 --- a/test/server/env.js +++ b/test/server/env.js @@ -2,7 +2,7 @@ const process = require('process'); const test = require('supertape'); -const env = require('../../server/env'); +const env = require('../../server/env.js'); test('env: small', (t) => { process.env.cloudcmd_hello = 'world'; 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 a511c874..d118e8de 100644 --- a/test/server/modulas.js +++ b/test/server/modulas.mjs @@ -1,16 +1,19 @@ -'use strict'; - -const {join} = require('path'); -const {test, stub} = require('supertape'); +import {createRequire} from 'node:module'; +import {dirname, join} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import serveOnce from 'serve-once'; +import {test, stub} from 'supertape'; +import cloudcmd from '../../server/cloudcmd.mjs'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const require = createRequire(import.meta.url); const cloudcmdPath = join(__dirname, '..', '..'); 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, { +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 a821a80b..8d65c384 100644 --- a/test/static.js +++ b/test/static.mjs @@ -1,14 +1,13 @@ -'use strict'; +import serveOnce from 'serve-once'; +import test from 'supertape'; +import criton from 'criton'; +import cloudcmd from '../server/cloudcmd.mjs'; -const test = require('supertape'); -const criton = require('criton'); - -const cloudcmd = require('..'); const config = { auth: false, }; -const {request} = require('serve-once')(cloudcmd, { +const {request} = serveOnce(cloudcmd, { config, });