diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 24b1358..f15e903 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -1,18 +1,18 @@ -name: tests on: - push + jobs: - build: + test: runs-on: ubuntu-latest strategy: matrix: node-version: - - 14.x - - 18.x - - 19.x + - 20.x + - 24.x + - latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - run: npm install-test diff --git a/CHANGELOG.md b/CHANGELOG.md index eb45425..3042279 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,55 @@ faucet-pipeline-core version history ==================================== +v3.1.0 +------ + +_2025-10-30_ + +no significant changes for end users + +notable changes for developers: + +* `faucetDispatch` now has a return value which reports completion of the + initial build + + +v3.0.0 +------ + +_2025-03-02_ + +notable changes for end users: + +* bumped Node requirement to v18 or later, dropping support for obsolete versions +* reduced number of dependencies + +notable changes for developers: + +* switched to named instead of default exports + + this might affect users of utilities like `resolvePath` and `FileFinder` + +* ensured dynamic imports are asynchronous + + this might affect users of utilities like `loadExtension` + +* `promisify` was removed entirely after being deprecated for a while + + +v2.1.0 +------ + +_2025-10-26_ + +notable changes for end users: + +* added support for faucet-pipeline-assets and faucet-pipeline-css +* dropped support for Node 19 and below + +no significant changes for developers + + v2.0.0 ------ diff --git a/bin/faucet b/bin/faucet index 6eb573c..79d8496 100755 --- a/bin/faucet +++ b/bin/faucet @@ -1,8 +1,10 @@ #!/usr/bin/env node "use strict"; -let faucet = require("../lib"); -let parseCLI = require("../lib/cli"); +let { faucetDispatch } = require("../lib"); +let { parseCLI } = require("../lib/cli"); -let { referenceDir, config, options } = parseCLI(); -faucet(referenceDir, config, options); +parseCLI(). + then(({ referenceDir, config, options }) => { + faucetDispatch(referenceDir, config, options); + }); diff --git a/lib/cli.js b/lib/cli.js index 8a0156d..ae8713b 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -1,8 +1,8 @@ "use strict"; -let readConfig = require("./config"); +let { readConfig } = require("./config"); let { abort, repr } = require("./util"); -let parseArgs = require("minimist"); +let { parseArgs } = require("node:util"); let HELP = ` Usage: @@ -27,27 +27,55 @@ Options: serve generated files via HTTP with live reloading `.trim(); -module.exports = function parseCLI(argv = process.argv.slice(2), help = HELP) { - argv = parseArgs(argv, { - boolean: ["watch", "fingerprint", "sourcemaps", "compact"], - alias: { - c: "config", - w: "watch", - h: "help" +exports.parseCLI = async function parseCLI() { + let { values } = parseArgs({ + options: { + help: { + type: "boolean", + short: "h", + default: false + }, + config: { + type: "string", + short: "c" + }, + watch: { + type: "boolean", + short: "w", + default: false + }, + fingerprint: { + type: "boolean", + default: false + }, + sourcemaps: { + type: "boolean", + default: false + }, + compact: { + type: "boolean", + default: false + }, + serve: { + type: "string" + }, + liveserve: { + type: "string" + } } }); - if(argv.help) { - abort(help, 0); + if(values.help) { + abort(HELP, 0); } let options = { - watch: argv.watch, - fingerprint: argv.fingerprint, - sourcemaps: argv.sourcemaps, - compact: argv.compact, - serve: argv.serve, - liveserve: argv.liveserve + watch: values.watch, + fingerprint: values.fingerprint, + sourcemaps: values.sourcemaps, + compact: values.compact, + serve: values.serve, + liveserve: values.liveserve }; if(options.watch && options.fingerprint) { // for convenience @@ -56,6 +84,6 @@ module.exports = function parseCLI(argv = process.argv.slice(2), help = HELP) { } let rootDir = process.cwd(); - let { referenceDir, config } = readConfig(rootDir, argv.config); + let { referenceDir, config } = await readConfig(rootDir, values.config); return { referenceDir, config, options }; }; diff --git a/lib/config.js b/lib/config.js index f585bc2..b87fa5c 100644 --- a/lib/config.js +++ b/lib/config.js @@ -2,10 +2,10 @@ let path = require("path"); -module.exports = function readConfig(rootDir, filepath = "faucet.config.js") { +exports.readConfig = async function readConfig(rootDir, filepath = "faucet.config.js") { let configPath = path.resolve(rootDir, filepath); return { referenceDir: path.dirname(configPath), - config: require(configPath) + config: await require(configPath) }; }; diff --git a/lib/index.js b/lib/index.js index 16d19e3..ea36084 100644 --- a/lib/index.js +++ b/lib/index.js @@ -2,13 +2,13 @@ let server = require("./server"); let { pluginsByBucket } = require("./plugins"); -let AssetManager = require("./manager"); -let resolvePath = require("./util/resolve"); +let { AssetManager } = require("./manager"); +let { resolvePath } = require("./util/resolve"); let { abort, repr } = require("./util"); -let SerializedRunner = require("./util/runner"); +let { SerializedRunner } = require("./util/runner"); let browserslist = require("browserslist"); -module.exports = async function faucetDispatch(referenceDir, config, +exports.faucetDispatch = async function faucetDispatch(referenceDir, config, { watch, fingerprint, sourcemaps, compact, serve, liveserve }) { config = await config; @@ -22,7 +22,7 @@ module.exports = async function faucetDispatch(referenceDir, config, browsers = [browsers]; } - let plugins = pluginsByBucket(config); + let plugins = await pluginsByBucket(config); // initialize plugins with corresponding configuration let buckets = Object.keys(plugins).reduce((memo, bucket) => { memo[bucket] = plugins[bucket].map(({ plugin, config }) => { @@ -36,12 +36,14 @@ module.exports = async function faucetDispatch(referenceDir, config, then(buildStep(buckets.scripts.concat(buckets.styles))). then(buildStep(buckets.markup)); }); - runner.run(); + let res = runner.run(); if(watch) { makeWatcher(config.watchDirs, referenceDir). - on("edit", filepaths => { - runner.rerun(filepaths); + then(watcher => { + watcher.on("edit", filepaths => { + runner.rerun(filepaths); + }); }); } @@ -53,6 +55,8 @@ module.exports = async function faucetDispatch(referenceDir, config, } else if(liveserve) { server.live(liveserve, assetManager.manifest.webRoot); } + + return res; // notifies consumers once the initial build has completed }; function buildStep(plugins) { @@ -60,8 +64,8 @@ function buildStep(plugins) { then(() => files); } -function makeWatcher(watchDirs, referenceDir) { - let niteOwl = require("nite-owl"); +async function makeWatcher(watchDirs, referenceDir) { + let niteOwl = await require("nite-owl"); if(watchDirs) { watchDirs = watchDirs.map(dir => resolvePath(dir, referenceDir, diff --git a/lib/manager.js b/lib/manager.js index 3630419..c75f97a 100644 --- a/lib/manager.js +++ b/lib/manager.js @@ -1,12 +1,12 @@ "use strict"; -let Manifest = require("./manifest"); -let createFile = require("./util/files"); -let resolvePath = require("./util/resolve"); +let { Manifest } = require("./manifest"); +let { createFile } = require("./util/files"); +let { resolvePath } = require("./util/resolve"); let { reportFileStatus, abort, generateFingerprint } = require("./util"); let path = require("path"); -module.exports = class AssetManager { +exports.AssetManager = class AssetManager { constructor(referenceDir, { manifestConfig, fingerprint, exitOnError } = {}) { this.referenceDir = referenceDir; this.fingerprint = fingerprint; diff --git a/lib/manifest.js b/lib/manifest.js index b7985a9..51db3ff 100644 --- a/lib/manifest.js +++ b/lib/manifest.js @@ -1,11 +1,11 @@ "use strict"; -let createFile = require("./util/files"); -let resolvePath = require("./util/resolve"); +let { createFile } = require("./util/files"); +let { resolvePath } = require("./util/resolve"); let { abort } = require("./util"); let path = require("path"); -module.exports = class Manifest { +exports.Manifest = class Manifest { constructor(referenceDir, { target, key, value, baseURI, webRoot } = {}) { if(value && (baseURI || webRoot)) { abort("ERROR: `value` must not be used with `baseURI` and/or `webRoot`"); diff --git a/lib/plugins.js b/lib/plugins.js index 80805e8..29c894a 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -4,9 +4,17 @@ let { loadExtension, abort, repr } = require("./util"); // common plugins included for convenience let DEFAULTS = [{ + key: "assets", + bucket: "static", + plugin: "faucet-pipeline-assets" +}, { key: "js", bucket: "scripts", plugin: "faucet-pipeline-js" +}, { + key: "css", + bucket: "styles", + plugin: "faucet-pipeline-css" }, { key: "sass", bucket: "styles", @@ -33,47 +41,50 @@ module.exports = { // returns plugin functions grouped by bucket and filtered by relevance (based // on configuration) -function pluginsByBucket(config, defaults) { - let plugins = determinePlugins(config.plugins, defaults); +async function pluginsByBucket(config, defaults) { + let plugins = await determinePlugins(config.plugins, defaults); let buckets = [...BUCKETS].reduce((memo, bucket) => { memo[bucket] = []; return memo; }, {}); - Object.entries(plugins).forEach(([key, _plugin]) => { + for(let [key, _plugin] of Object.entries(plugins)) { let pluginConfig = config[key]; if(!pluginConfig) { - return; + continue; } let { bucket, plugin } = _plugin; + if(!plugin.call) { + ({ plugin } = await loadPlugin(plugin)); + } buckets[bucket].push({ - plugin: plugin.call ? plugin : loadPlugin(plugin).plugin, + plugin, config: pluginConfig }); - }); + } return buckets; } // `plugins` is an array of plugins, each either a package identifier or a // `{ key, bucket, plugin }` object`, with `key` being the configuration key and // `plugin` being either a function or a package identifier -function determinePlugins(plugins = [], defaults = DEFAULTS) { +async function determinePlugins(plugins = [], defaults = DEFAULTS) { let registry = {}; // NB: default plugins are resolved lazily because eager loading would // result in them becoming a hard dependency rather than a convenience // preset - however, that requires us to duplicate the respective // configuration keys and buckets here - defaults.forEach(plugin => { - registerPlugin(registry, plugin, false); - }); - plugins.forEach(plugin => { - registerPlugin(registry, plugin, true); - }); + for(let plugin of defaults) { + await registerPlugin(registry, plugin, false); + } + for(let plugin of plugins) { + await registerPlugin(registry, plugin, true); + } return registry; } -function registerPlugin(registry, _plugin, eager) { - let { key, bucket, plugin } = resolvePlugin(_plugin, eager); +async function registerPlugin(registry, _plugin, eager) { + let { key, bucket, plugin } = await resolvePlugin(_plugin, eager); // NB: default plugins may be overridden if(registry[key] && !DEFAULT_KEYS.has(key)) { abort(`ERROR: duplicate plugin key ${repr(key, false)}`); @@ -84,14 +95,14 @@ function registerPlugin(registry, _plugin, eager) { } } -function resolvePlugin(_plugin, eager) { +async function resolvePlugin(_plugin, eager) { if(_plugin.substr) { // package identifier - _plugin = loadPlugin(_plugin); + _plugin = await loadPlugin(_plugin); } let { key, bucket, plugin } = _plugin; if(eager && plugin.substr && (!key || !bucket)) { // auto-configuration - let _plugin = loadPlugin(plugin); + let _plugin = await loadPlugin(plugin); plugin = _plugin.plugin; // local configuration takes precedence key = key || _plugin.key; @@ -104,13 +115,13 @@ function resolvePlugin(_plugin, eager) { return { key, bucket, plugin }; } -function loadPlugin(pkg) { +async function loadPlugin(pkg) { let fail = prop => abort(`ERROR: invalid plugin ${repr(pkg)}; ` + `missing ${repr(prop, false)}`); let { key = fail("key"), bucket = fail("bucket"), plugin = fail("plugin") - } = loadExtension(pkg, "ERROR: missing plugin"); + } = await loadExtension(pkg, "ERROR: missing plugin"); return { key, bucket, plugin }; } diff --git a/lib/server.js b/lib/server.js index 7d3a961..9ecb696 100644 --- a/lib/server.js +++ b/lib/server.js @@ -5,18 +5,16 @@ let DEFAULTS = { port: 3000 }; -exports.static = (config, webroot) => { - let donny = loadExtension("donny", "failed to activate server"); +exports.static = async (config, webroot) => { + let donny = await loadExtension("donny", "failed to activate server"); let [host, port] = parseHost(config); - donny({ port, bind: host, webroot }). - then(() => { - console.error(`serving ${repr(webroot)} at http://${host}:${port}`); - }); + await donny({ port, bind: host, webroot }); + console.error(`serving ${repr(webroot)} at http://${host}:${port}`); }; -exports.live = (config, root) => { - let liveServer = loadExtension("live-server", "failed to activate live-server"); +exports.live = async (config, root) => { + let liveServer = await loadExtension("live-server", "failed to activate live-server"); let [host, port] = parseHost(config); liveServer.start({ port, host, root, open: false }); diff --git a/lib/util/files/finder.js b/lib/util/files/finder.js index 5764be7..2cf86d9 100644 --- a/lib/util/files/finder.js +++ b/lib/util/files/finder.js @@ -1,7 +1,7 @@ let { readdir, stat } = require("fs/promises"); let path = require("path"); -module.exports = class FileFinder { +exports.FileFinder = class FileFinder { constructor(directory, { skipDotfiles, filter = () => true } = {}) { this.directory = directory; this.filter = filename => { diff --git a/lib/util/files/index.js b/lib/util/files/index.js index d067696..f2d8ef0 100644 --- a/lib/util/files/index.js +++ b/lib/util/files/index.js @@ -8,7 +8,7 @@ let KNOWN = new Set(); // avoids redundant `mkdir` invocations let LOCKS = new Map(); // avoids concurrent write operations and creates target directory if necessary -module.exports = function createFile(filepath, contents) { +exports.createFile = function createFile(filepath, contents) { let lock = LOCKS.get(filepath); if(lock) { // defer return lock.then(() => createFile(filepath, contents)); diff --git a/lib/util/index.js b/lib/util/index.js index cf619be..0698bc2 100644 --- a/lib/util/index.js +++ b/lib/util/index.js @@ -13,11 +13,11 @@ exports.reportFileStatus = (filepath, referenceDir, error) => { console.error(error ? `✗ ${ref}: ${error.message || error}` : `✓ ${ref}`); }; -// attempts to `require` a module, prompting the user to install the -// corresponding package if it is unavailable -exports.loadExtension = (pkg, errorMessage, supplier = pkg) => { +// attempts to load a module, prompting the user to install the corresponding +// package if it is unavailable +exports.loadExtension = async (pkg, errorMessage, supplier = pkg) => { try { - return require(pkg); + return await require(pkg); } catch(err) { if(err.code !== "MODULE_NOT_FOUND") { throw err; diff --git a/lib/util/resolve.js b/lib/util/resolve.js index 410e185..afb8124 100644 --- a/lib/util/resolve.js +++ b/lib/util/resolve.js @@ -4,7 +4,8 @@ let { abort, repr } = require("./"); let fs = require("fs"); let path = require("path"); -module.exports = function resolvePath(filepath, referenceDir, { enforceRelative } = {}) { +exports.resolvePath = function resolvePath(filepath, referenceDir, + { enforceRelative } = {}) { if(/^\.?\.\//.test(filepath)) { // starts with `./` or `../` return path.resolve(referenceDir, filepath); } else if(enforceRelative) { diff --git a/lib/util/runner.js b/lib/util/runner.js index d2ce80f..90ec0af 100644 --- a/lib/util/runner.js +++ b/lib/util/runner.js @@ -1,6 +1,6 @@ "use strict"; -module.exports = class SerializedRunner { +exports.SerializedRunner = class SerializedRunner { constructor(asyncOp) { this.asyncOp = asyncOp; } diff --git a/package.json b/package.json index 5bf5e23..357d61e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "faucet-pipeline-core", - "version": "2.0.0", + "version": "3.1.0", "description": "faucet-pipeline's core library", "author": "FND", "contributors": [ @@ -20,22 +20,19 @@ "faucet": "bin/faucet" }, "scripts": { - "test": "npm-run-all --parallel lint test:unit", - "test:unit": "mocha test/test_*.js", - "lint": "eslint --cache lib bin/* test test/bin/* && echo ✓" + "test": "npm run lint && npm run test:unit", + "test:unit": "node --test ./test/test_*.js", + "lint": "eslint --cache ./lib ./bin/* ./test ./test/bin/* && echo ✓" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "dependencies": { - "browserslist": "~4.21.4", - "minimist": "~1.2.7", + "browserslist": "~4.24.4", "nite-owl": "~5.0.5" }, "devDependencies": { "eslint-config-fnd": "^1.13.0", - "mocha": "^10.2.0", - "npm-run-all": "^4.1.5", "release-util-fnd": "^3.0.0" } } diff --git a/test/test_manager.js b/test/test_manager.js index 6375827..9ae62c2 100644 --- a/test/test_manager.js +++ b/test/test_manager.js @@ -1,7 +1,7 @@ -/* global describe, before, after, it */ "use strict"; -let AssetManager = require("../lib/manager"); +let { AssetManager } = require("../lib/manager"); +let { describe, it, before, after } = require("node:test"); let path = require("path"); let assert = require("assert"); diff --git a/test/test_manifest.js b/test/test_manifest.js index 041cc36..07856ff 100644 --- a/test/test_manifest.js +++ b/test/test_manifest.js @@ -1,7 +1,7 @@ -/* global describe, before, after, it */ "use strict"; -let Manifest = require("../lib/manifest"); +let { Manifest } = require("../lib/manifest"); +let { describe, it, before, after } = require("node:test"); let path = require("path"); let assert = require("assert"); diff --git a/test/test_plugins.js b/test/test_plugins.js index 0d730a7..8c9a0d9 100644 --- a/test/test_plugins.js +++ b/test/test_plugins.js @@ -1,7 +1,7 @@ -/* global describe, before, after, it */ "use strict"; let { pluginsByBucket, _determinePlugins } = require("../lib/plugins"); +let { describe, it, before, after } = require("node:test"); let path = require("path"); let assert = require("assert"); @@ -9,10 +9,18 @@ let { deepStrictEqual: assertDeep } = assert; let ROOT = path.resolve(__dirname, "fixtures"); let DEFAULTS = { + assets: { + bucket: "static", + plugin: "faucet-pipeline-assets" + }, js: { bucket: "scripts", plugin: "faucet-pipeline-js" }, + css: { + bucket: "styles", + plugin: "faucet-pipeline-css" + }, sass: { bucket: "styles", plugin: "faucet-pipeline-sass" @@ -39,8 +47,8 @@ describe("plugin registration", () => { updateNodePath(NODE_PATH); }); - it("only loads default plugins referenced within configuration", () => { - let res = pluginsByBucket({ + it("only loads default plugins referenced within configuration", async () => { + let res = await pluginsByBucket({ js: [{ foo: "lorem" }] }); assertDeep(normalizeAll(res), { @@ -53,7 +61,7 @@ describe("plugin registration", () => { markup: [] }); - res = pluginsByBucket({ + res = await pluginsByBucket({ sass: [{ bar: "ipsum" }] }); assertDeep(normalizeAll(res), { @@ -66,7 +74,7 @@ describe("plugin registration", () => { markup: [] }); - res = pluginsByBucket({ + res = await pluginsByBucket({ js: [{ foo: "lorem" }], sass: [{ bar: "ipsum" }] }); @@ -84,8 +92,8 @@ describe("plugin registration", () => { }); }); - it("allows overriding default plugins", () => { - let res = pluginsByBucket({ + it("allows overriding default plugins", async () => { + let res = await pluginsByBucket({ js: [{ foo: "bar" }], plugins: [{ key: "js", @@ -120,12 +128,12 @@ describe("plugin resolution", () => { updateNodePath(NODE_PATH); }); - it("provides a default set of plugins", () => { - let res = _determinePlugins(); + it("provides a default set of plugins", async () => { + let res = await _determinePlugins(); assertDeep(normalizePlugins(res), DEFAULTS); }); - it("supports custom plugins", () => { + it("supports custom plugins", async () => { // plugin function within configuration let anon = () => {}; let config = [{ @@ -133,7 +141,7 @@ describe("plugin resolution", () => { bucket: "static", plugin: anon }]; - let res = _determinePlugins(config); + let res = await _determinePlugins(config); assertDeep(normalizePlugins(res), Object.assign({}, DEFAULTS, { dummy: { bucket: "static", @@ -144,7 +152,7 @@ describe("plugin resolution", () => { // nested package identifier let pkg = "faucet-pipeline-dummy"; config[0].plugin = pkg; - res = _determinePlugins(config); + res = await _determinePlugins(config); assertDeep(normalizePlugins(res), Object.assign({}, DEFAULTS, { dummy: { bucket: "static", @@ -154,7 +162,7 @@ describe("plugin resolution", () => { })); // simple package identifier - res = _determinePlugins([pkg]); + res = await _determinePlugins([pkg]); assertDeep(normalizePlugins(res), Object.assign({}, DEFAULTS, { dummy: { bucket: "static", @@ -163,12 +171,12 @@ describe("plugin resolution", () => { })); }); - it("allows overriding plugins' default configuration", () => { + it("allows overriding plugins' default configuration", async () => { let config = [{ key: "yummy", plugin: "faucet-pipeline-dummy" }]; - let res = _determinePlugins(config); + let res = await _determinePlugins(config); assertDeep(normalizePlugins(res), Object.assign({}, DEFAULTS, { yummy: { bucket: "static", @@ -177,7 +185,7 @@ describe("plugin resolution", () => { })); config[0].bucket = "styles"; - res = _determinePlugins(config); + res = await _determinePlugins(config); assertDeep(normalizePlugins(res), Object.assign({}, DEFAULTS, { yummy: { bucket: "styles", @@ -187,13 +195,13 @@ describe("plugin resolution", () => { })); }); - it("balks at invalid package identifiers", () => { - assert.throws(() => { - _determinePlugins(["faucet-pipeline-yummy"]); + it("balks at invalid package identifiers", async () => { + await assert.rejects(async () => { + return _determinePlugins(["faucet-pipeline-yummy"]); }, /exit 1/); - assert.throws(() => { - _determinePlugins([{ + await assert.rejects(() => { + return _determinePlugins([{ // NB: local configuration must not be comprehensive to ensure // plugin is loaded key: "yummy", @@ -202,9 +210,9 @@ describe("plugin resolution", () => { }, /exit 1/); }); - it("balks at duplicate configuration keys", () => { - assert.throws(() => { - _determinePlugins([{ + it("balks at duplicate configuration keys", async () => { + await assert.rejects(() => { + return _determinePlugins([{ key: "dummy", bucket: "static", plugin: () => {} @@ -216,35 +224,36 @@ describe("plugin resolution", () => { }, /exit 1/); }); - it("balks at invalid plugins", () => { - assert.throws(() => { - _determinePlugins(["faucet-pipeline-invalid-a"]); + it("balks at invalid plugins", async () => { + await assert.rejects(() => { + return _determinePlugins(["faucet-pipeline-invalid-a"]); }, /exit 1/); - assert.throws(() => { - _determinePlugins(["faucet-pipeline-invalid-b"]); + await assert.rejects(() => { + return _determinePlugins(["faucet-pipeline-invalid-b"]); }, /exit 1/); - assert.throws(() => { - _determinePlugins(["faucet-pipeline-invalid-c"]); + await assert.rejects(() => { + return _determinePlugins(["faucet-pipeline-invalid-c"]); }, /exit 1/); }); - it("balks at invalid buckets", () => { + it("balks at invalid buckets", async () => { let plugin = { key: "dummy", plugin: () => {} }; - ["static", "scripts", "styles", "markup"].forEach(bucket => { + const buckets = ["static", "scripts", "styles", "markup"]; + for(let bucket of buckets) { plugin.bucket = bucket; - assert.doesNotThrow(() => { - _determinePlugins([plugin]); + await assert.doesNotReject(async () => { + return _determinePlugins([plugin]); }, /exit 1/); - }); + } plugin.bucket = "dummy"; - assert.throws(() => { - _determinePlugins([plugin]); + await assert.rejects(async () => { + return _determinePlugins([plugin]); }, /exit 1/); }); }); diff --git a/test/test_runner.js b/test/test_runner.js index 8297f70..8a20d0f 100644 --- a/test/test_runner.js +++ b/test/test_runner.js @@ -1,7 +1,7 @@ -/* global describe, it */ "use strict"; -let SerializedRunner = require("../lib/util/runner"); +let { SerializedRunner } = require("../lib/util/runner"); +let { describe, it } = require("node:test"); let { strictEqual: assertSame, deepStrictEqual: assertDeep } = require("assert"); describe("watch mode", () => { diff --git a/test/test_server.js b/test/test_server.js index e7f77a4..35467e1 100644 --- a/test/test_server.js +++ b/test/test_server.js @@ -1,7 +1,7 @@ -/* global describe, before, after, it */ "use strict"; let { _parseHost } = require("../lib/server"); +let { describe, it, before, after } = require("node:test"); let assert = require("assert"); let assertSame = assert.strictEqual; diff --git a/test/test_util.js b/test/test_util.js index ba36a99..cad64c9 100644 --- a/test/test_util.js +++ b/test/test_util.js @@ -1,8 +1,8 @@ -/* global describe, it */ "use strict"; let { generateFingerprint } = require("../lib/util"); -let FileFinder = require("../lib/util/files/finder"); +let { FileFinder } = require("../lib/util/files/finder"); +let { describe, it } = require("node:test"); let path = require("path"); let assert = require("assert");