Migrate to ECMAScript Modules

Migrate the usage of CommonJS specific code and imports to ESM.  Roughly
summarised this:
- Changes all require() calls to import statement or expressions.
- Changes usage of module.exports to export statements.
- Replaces require.resolve with import.meta.resolve.
- Replaces conditional imports with conditional subpath imports.
- Replaces module === require.main with import.meta.main.
- Adds the full filename with extention to all relative imports.
- Changes all usage of __dirname and __filename to their import.meta
  equivalents.
- Sets "type": "module" in package.json files.
- Removes usage of "use strict".
- Adds .ts an an alias of .js for the webpack build.

Due to differences in how require and import resolves files the plugin
entrypoints will have to include the filename and extension after this
migration in order to work.
This commit is contained in:
Hornwitser committed 2026-09-11 22:43:57 +02:00
1 parent b69111dda3
commit 5dcaca4d0b
261 files changed
+1115 -1330

No files matched your search

+4 -10
View File
@@ -1,6 +1,5 @@
"use strict";
const assert = require("assert").strict;
const { compile } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { compile } from "@clusterio/lib";
/**
* Generate a flat array of tests from a matrix of inputs.
@@ -10,7 +9,7 @@ const { compile } = require("@clusterio/lib");
* @returns {Array<{ [K in keyof T]: T[K][number] }>}
* An array of tuples, each containing one value from each input array.
*/
function testMatrix(...arrays) {
export function testMatrix(...arrays) {
return arrays.reduce((acc, curr) => acc.flatMap(a => curr.map(b => [...a, b])), [[]]);
}
@@ -21,7 +20,7 @@ function testMatrix(...arrays) {
* @param {{new(...args: T): object}} Class - The class which has toJSON and fromJSON methods.
* @param {T[]} tests - The tests inputs to pass to the class constructor.
*/
function testRoundTripJsonSerialisable(Class, tests) {
export function testRoundTripJsonSerialisable(Class, tests) {
const validate = compile(Class.jsonSchema);
for (const test of tests) {
const original = new Class(...test);
@@ -34,8 +33,3 @@ function testRoundTripJsonSerialisable(Class, tests) {
}
}
}
module.exports = {
testMatrix,
testRoundTripJsonSerialisable,
};
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const mock = require("../mock");
const controller = require("@clusterio/controller");
import * as mock from "../mock.js";
import * as controller from "@clusterio/controller";
describe("controller/src/BaseControllerPlugin", function() {
describe("class BaseControllerPlugin", function() {
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const assert = require("assert").strict;
const { ControlConnection } = require("@clusterio/controller");
import assert from "node:assert/strict";
import { ControlConnection } from "@clusterio/controller";
describe("controller/src/ControlConnection", function() {
describe(".handleControllerRestartRequest()", function() {
+14 -13
View File
@@ -1,17 +1,16 @@
"use strict";
const path = require("node:path");
const assert = require("assert").strict;
const { Controller, HostRecord, InstanceRecord, UserRecord } = require("@clusterio/controller");
const { EventEmitter } = require("stream");
const events = require("node:events");
const http = require("node:http");
const express = require("express");
import path from "node:path";
import assert from "node:assert/strict";
import { Controller, HostRecord, InstanceRecord, UserRecord } from "@clusterio/controller";
import events, { EventEmitter } from "node:events";
import http from "node:http";
import express from "express";
import { fileURLToPath } from "node:url";
const {
import {
ControllerConfig, Address, RequestError,
InstanceConfig, SystemInfo, Role, ModPack,
addPluginConfigFields,
} = require("@clusterio/lib");
} from "@clusterio/lib";
class MockEvent {}
@@ -33,10 +32,12 @@ class MockInstanceConfig extends EventEmitter {
}
describe("controller/src/Controller", function() {
describe("class Controller", function() {
describe("class Controller", async function() {
/** @type {Controller} */
let controller, mockInstanceConfig;
const controllerVersion = require("@clusterio/controller/package.json").version;
const controllerVersion = (
await import("@clusterio/controller/package.json", { with: { type: "json" }})
).default.version;
before(async function() {
const controllerConfig = new ControllerConfig("controller", { "controller.version": controllerVersion });
controller = new Controller({}, [], controllerConfig);
@@ -245,7 +246,7 @@ describe("controller/src/Controller", function() {
controller.config.restartRequired = false;
controller.pluginInfos[0] = {
name: "restart_test",
packagePath: require.resolve("@clusterio/controller/package.json"),
packagePath: fileURLToPath(import.meta.resolve("@clusterio/controller/package.json")),
version: controllerVersion,
};
});
+3 -4
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const { User } = require("@clusterio/controller");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
import { User } from "@clusterio/controller";
describe("controller/src/User", function() {
describe("class User", function() {
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const { HostDetails } = require("@clusterio/lib");
const { HostRecord } = require("@clusterio/controller");
import assert from "node:assert/strict";
import { HostDetails } from "@clusterio/lib";
import { HostRecord } from "@clusterio/controller";
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
describe("controller/HostRecord", function () {
const samplePlugins = new Map([
+7 -8
View File
@@ -1,12 +1,11 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const http = require("http");
const https = require("https");
const util = require("util");
const events = require("node:events");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import http from "node:http";
import https from "node:https";
import util from "node:util";
import events from "node:events";
const HttpCloser = require("@clusterio/controller/dist/node/src/HttpCloser").default;
import HttpCloser from "@clusterio/controller/dist/node/src/HttpCloser.js";
// Time to wait during async operations to ensure they happened in order.
const tick = 20;
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
const { Controller, InstanceRecord, InstanceManager } = require("@clusterio/controller");
import { Controller, InstanceRecord, InstanceManager } from "@clusterio/controller";
describe("controller/InstanceManager", function () {
/** @type {Controller} */
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const { InstanceRecord } = require("@clusterio/controller");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
import { InstanceRecord } from "@clusterio/controller";
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
describe("controller/InstanceRecord", function () {
/** @type {lib.InstanceConfig} */
+3 -4
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
const { Role, SubscribableDatastore } = require("@clusterio/lib");
const { User } = require("@clusterio/controller");
import assert from "node:assert/strict";
import { Role, SubscribableDatastore } from "@clusterio/lib";
import { User } from "@clusterio/controller";
describe("controller/User", function () {
/** @type {SubscribableDatastore<UserRecord>} */
+6 -7
View File
@@ -1,10 +1,9 @@
"use strict";
const path = require("path");
const fs = require("node:fs/promises");
const assert = require("assert").strict;
const jwt = require("jsonwebtoken");
const { Role, SubscribableDatastore, ControllerConfig } = require("@clusterio/lib");
const { UserRecord, UserManager } = require("@clusterio/controller");
import path from "node:path";
import fs from "node:fs/promises";
import assert from "node:assert/strict";
import jwt from "jsonwebtoken";
import { Role, SubscribableDatastore, ControllerConfig } from "@clusterio/lib";
import { UserRecord, UserManager } from "@clusterio/controller";
const TEMP_DIR = path.join("temp", "test", "UserManager");
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const { UserDetails, PlayerStats } = require("@clusterio/lib");
const { UserRecord } = require("@clusterio/controller");
import assert from "node:assert/strict";
import { UserDetails, PlayerStats } from "@clusterio/lib";
import { UserRecord } from "@clusterio/controller";
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
describe("controller/UserRecord", function () {
it("should be round trip serialisable", function () {
+3 -4
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
const { Controller, WsServer } = require("@clusterio/controller");
const { ControllerConfig } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { Controller, WsServer } from "@clusterio/controller";
import { ControllerConfig } from "@clusterio/lib";
describe("controller/src/WsServer", function() {
describe("class WsServer", function() {
+7 -8
View File
@@ -1,12 +1,11 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
const FormData = require("form-data");
const http = require("http");
import assert from "node:assert/strict";
import events from "node:events";
import FormData from "form-data";
import http from "node:http";
const { wait } = require("@clusterio/lib");
const routes = require("@clusterio/controller/dist/node/src/routes");
const mock = require("../mock");
import { wait } from "@clusterio/lib";
import * as routes from "@clusterio/controller/dist/node/src/routes.js";
import * as mock from "../mock.js";
describe("controller/src/routes", function() {
let controller;
+1 -2
View File
@@ -1,4 +1,3 @@
"use strict";
if (module === require.main) {
if (import.meta.main) {
process.stdout.write(JSON.stringify(process.argv.slice(2)));
}
+6 -7
View File
@@ -1,17 +1,16 @@
"use strict";
const child_process = require("child_process");
const util = require("util");
const assert = require("assert").strict;
const path = require("path");
import child_process from "node:child_process";
import util from "node:util";
import assert from "node:assert/strict";
import path from "node:path";
const { escapeArg } = require("../../packages/create/escape_arg");
import { escapeArg } from "../../packages/create/escape_arg.js";
const execFile = util.promisify(child_process.execFile);
async function exec(file, args) {
const command = [file, ...args.map(escapeArg)].join(" ");
const { stdout, stderr } = await execFile(
command,
{ shell: true, cwd: __dirname, env: { ...process.env, pct: "%"} }
{ shell: true, cwd: import.meta.dirname, env: { ...process.env, pct: "%"} }
);
return { stdout: JSON.parse(stdout), stderr };
}
+3 -8
View File
@@ -1,6 +1,5 @@
"use strict";
const { Command, CommandTree } = require("@clusterio/lib");
const { BaseCtlPlugin } = require("@clusterio/ctl");
import { Command, CommandTree } from "@clusterio/lib";
import { BaseCtlPlugin } from "@clusterio/ctl";
const testPluginCommands = new CommandTree({
name: "test-plugin", description: "Test plugin commands",
@@ -15,12 +14,8 @@ testPluginCommands.add(new Command({
},
}));
class CtlPlugin extends BaseCtlPlugin {
export class CtlPlugin extends BaseCtlPlugin {
async addCommands(rootCommand) {
rootCommand.add(testPluginCommands);
}
}
module.exports = {
CtlPlugin,
};
+3 -8
View File
@@ -1,9 +1,8 @@
"use strict";
const { BaseControllerPlugin } = require("@clusterio/controller");
import { BaseControllerPlugin } from "@clusterio/controller";
const { ControllerEcho, HostEcho } = require("./messages");
import { ControllerEcho, HostEcho } from "./messages.js";
class ControllerPlugin extends BaseControllerPlugin {
export class ControllerPlugin extends BaseControllerPlugin {
async init() {
this.logger.info("test_plugin controller loaded");
this.controller.handle(ControllerEcho, this.handleControllerEcho.bind(this));
@@ -15,7 +14,3 @@ class ControllerPlugin extends BaseControllerPlugin {
return request.text;
}
}
module.exports = {
ControllerPlugin,
};
+3 -8
View File
@@ -1,9 +1,8 @@
"use strict";
const { BaseHostPlugin } = require("@clusterio/host");
import { BaseHostPlugin } from "@clusterio/host";
const { HostEcho, HostEchoReceived } = require("./messages");
import { HostEcho, HostEchoReceived } from "./messages.js";
class HostPlugin extends BaseHostPlugin {
export class HostPlugin extends BaseHostPlugin {
async init() {
this.logger.info("test_plugin host loaded");
this.receivedEchoes = new Set();
@@ -20,7 +19,3 @@ class HostPlugin extends BaseHostPlugin {
return this.receivedEchoes.has(request.text);
}
}
module.exports = {
HostPlugin,
};
+14 -17
View File
@@ -1,24 +1,21 @@
"use strict";
// Plugin exercising the plugin system in the integration tests, see #342.
// Written as plain JavaScript so that it does not need to be built.
const { ControllerEcho, HostEcho, HostEchoReceived } = require("./messages");
import { ControllerEcho, HostEcho, HostEchoReceived } from "./messages.js";
module.exports = {
plugin: {
name: "test_plugin",
title: "Test Plugin",
description: "Plugin used to test the plugin system.",
export const plugin = {
name: "test_plugin",
title: "Test Plugin",
description: "Plugin used to test the plugin system.",
controllerEntrypoint: "controller",
hostEntrypoint: "host",
instanceEntrypoint: "instance",
ctlEntrypoint: "control",
controllerEntrypoint: "controller.js",
hostEntrypoint: "host.js",
instanceEntrypoint: "instance.js",
ctlEntrypoint: "control.js",
messages: [
ControllerEcho,
HostEcho,
HostEchoReceived,
],
},
messages: [
ControllerEcho,
HostEcho,
HostEchoReceived,
],
};
+2 -7
View File
@@ -1,12 +1,7 @@
"use strict";
const { BaseInstancePlugin } = require("@clusterio/host");
import { BaseInstancePlugin } from "@clusterio/host";
class InstancePlugin extends BaseInstancePlugin {
export class InstancePlugin extends BaseInstancePlugin {
async init() {
this.logger.info("test_plugin instance loaded");
}
}
module.exports = {
InstancePlugin,
};
+4 -11
View File
@@ -1,9 +1,8 @@
"use strict";
const { JsonBoolean, JsonString } = require("@clusterio/lib");
import { JsonBoolean, JsonString } from "@clusterio/lib";
// Sent from ctl to the controller, which answers with the text it was given
// and broadcasts a HostEcho to the hosts.
class ControllerEcho {
export class ControllerEcho {
static type = "request";
static src = "control";
static dst = "controller";
@@ -21,7 +20,7 @@ class ControllerEcho {
}
// Broadcast from the controller to the hosts by broadcastEventToHosts.
class HostEcho {
export class HostEcho {
static type = "event";
static src = "controller";
static dst = "host";
@@ -39,7 +38,7 @@ class HostEcho {
// Sent from ctl to a host, which answers with whether it received the given
// text via a HostEcho.
class HostEchoReceived {
export class HostEchoReceived {
static type = "request";
static src = "control";
static dst = "host";
@@ -55,9 +54,3 @@ class HostEchoReceived {
toJSON() { return this.text; }
static fromJSON(json) { return new this(json); }
}
module.exports = {
ControllerEcho,
HostEcho,
HostEchoReceived,
};
+1
View File
@@ -3,6 +3,7 @@
"version": "0.0.1",
"description": "Plugin used to test the plugin system, see #342",
"private": true,
"type": "module",
"main": "index.js",
"keywords": [
"clusterio-plugin"
+16 -13
View File
@@ -1,12 +1,11 @@
"use strict";
const assert = require("assert").strict;
const path = require("path");
import assert from "node:assert/strict";
import path from "node:path";
import { fileURLToPath } from "node:url";
const lib = require("@clusterio/lib");
const Host = require("@clusterio/host/dist/node/src/Host").default;
const Instance = require("@clusterio/host/dist/node/src/Instance").default;
const { _discoverInstances } = require("@clusterio/host/dist/node/src/Host");
const { HostConnector } = require("@clusterio/host/dist/node/host");
import * as lib from "@clusterio/lib";
import Host, { _discoverInstances } from "@clusterio/host/dist/node/src/Host.js";
import Instance from "@clusterio/host/dist/node/src/Instance.js";
import { HostConnector } from "@clusterio/host/dist/node/host.js";
describe("Host testing", function() {
describe("discoverInstances()", function() {
@@ -116,9 +115,11 @@ describe("Host testing", function() {
]);
});
});
describe(".checkRestartRequired()", function() {
describe(".checkRestartRequired()", async function() {
let host;
const hostVersion = require("@clusterio/host/package.json").version;
const hostVersion = (
await import("@clusterio/host/package.json", { with: { type: "json" }})
).default.version;
before(function() {
lib.addPluginConfigFields([{ name: "restart_test", hostEntrypoint: "host.js" }]);
});
@@ -126,7 +127,7 @@ describe("Host testing", function() {
// This can be used more generally, but i did not want to interfere with handleSyncUserListsEvent
const pluginInfos = [{
name: "restart_test",
packagePath: require.resolve("@clusterio/host/package.json"),
packagePath: fileURLToPath(import.meta.resolve("@clusterio/host/package.json")),
version: hostVersion,
}];
const hostConfig = new lib.HostConfig("host", { "host.version": hostVersion });
@@ -177,9 +178,11 @@ describe("Host testing", function() {
assert.equal(host.config.restartRequired, true);
});
});
describe(".checkRestartDowngrade()", function() {
describe(".checkRestartDowngrade()", async function() {
let host;
const hostVersion = require("@clusterio/host/package.json").version;
const hostVersion = (
await import("@clusterio/host/package.json", { with: { type: "json" }})
).default.version;
beforeEach(function() {
const hostConfig = new lib.HostConfig("host", { "host.version": hostVersion });
const hostConnector = new HostConnector(hostConfig, []);
+2 -4
View File
@@ -1,8 +1,6 @@
"use strict";
const assert = require("assert").strict;
const mock = require("../mock");
import * as mock from "../mock.js";
const host = require("@clusterio/host");
import * as host from "@clusterio/host";
describe("host/src/BaseHostPlugin", function() {
describe("class BaseHostPlugin", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const mock = require("../mock");
import assert from "node:assert/strict";
import * as mock from "../mock.js";
const host = require("@clusterio/host");
import * as host from "@clusterio/host";
describe("host/src/BaseInstancePlugin", function() {
describe("class BaseInstancePlugin", function() {
+6 -7
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const path = require("path");
import assert from "node:assert/strict";
import path from "node:path";
const lib = require("@clusterio/lib");
const { PlayerStats, wait } = lib;
const Instance = require("@clusterio/host/dist/node/src/Instance").default;
const { MockConnector, MockServer } = require("../mock");
import * as lib from "@clusterio/lib";
import { PlayerStats, wait } from "@clusterio/lib";
import Instance from "@clusterio/host/dist/node/src/Instance.js";
import { MockConnector, MockServer } from "../mock.js";
const addr = lib.Address.fromShorthand;
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const path = require("path");
import assert from "node:assert/strict";
import path from "node:path";
const { FactorioServer } = require("@clusterio/host/dist/node/src/server");
const { _exportLocale } = require("@clusterio/host/dist/node/src/export");
import { FactorioServer } from "@clusterio/host/dist/node/src/server.js";
import { _exportLocale } from "@clusterio/host/dist/node/src/export.js";
describe("host/src/export", function() {
+6 -7
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const JSZip = require("jszip");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import JSZip from "jszip";
import path from "node:path";
const lib = require("@clusterio/lib");
const patch = require("@clusterio/host/dist/node/src/patch");
import * as lib from "@clusterio/lib";
import * as patch from "@clusterio/host/dist/node/src/patch.js";
describe("host/patch", function() {
+9 -11
View File
@@ -1,14 +1,12 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import events from "node:events";
import fs from "node:fs/promises";
import path from "node:path";
const hostServer = require("@clusterio/host/dist/node/src/server");
const lib = require("@clusterio/lib");
const { wait } = lib;
const { testLines } = require("../lib/factorio/lines");
const { slowTest, externalTest } = require("../integration");
import * as hostServer from "@clusterio/host/dist/node/src/server.js";
import { Link, wait } from "@clusterio/lib";
import { testLines } from "../lib/factorio/lines.js";
import { slowTest, externalTest } from "../integration/index.js";
describe("host/server", function() {
@@ -326,7 +324,7 @@ describe("host/server", function() {
static jsonSchema = { type: "number" };
static fromJSON(json) { return new this(json); }
}
let eventFromJSON = lib.Link.eventFromJSON(NumberEvent, "NumberEvent");
let eventFromJSON = Link.eventFromJSON(NumberEvent, "NumberEvent");
ipcServer.handle("bad_event", async () => { eventFromJSON("not a number"); });
ipcServer.emit("ipc-bad_event", {});
await new Promise(resolve => setImmediate(resolve));
+12 -13
View File
@@ -1,22 +1,21 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const jwt = require("jsonwebtoken");
const path = require("path");
const events = require("events");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import jwt from "jsonwebtoken";
import path from "node:path";
import events from "node:events";
const lib = require("@clusterio/lib");
const libBuildMod = require("@clusterio/lib/build_mod");
const { wait } = lib;
import * as lib from "@clusterio/lib";
import { wait } from "@clusterio/lib";
import * as libBuildMod from "@clusterio/lib/build_mod.js";
const testStrings = require("../lib/factorio/test_strings");
const {
import * as testStrings from "../lib/factorio/test_strings.js";
import {
TestControl, TestControlConnector, url, controlToken, slowTest,
execCtl, execCtlProcess, execController, execHost, sendRcon, getControl,
spawnNode, instancesDir, factorioDir, databaseDir, controllerConfigPath,
requiresFactorio, hasFactorio,
} = require("./index");
const { ControllerEcho, HostEchoReceived } = require("../file/test_plugin/messages");
} from "./index.js";
import { ControllerEcho, HostEchoReceived } from "../file/test_plugin/messages.js";
/** @returns {Promise<Map<number, lib.InstanceDetails>>} */
+7 -8
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const jwt = require("jsonwebtoken");
const path = require("path");
const events = require("events");
const child_process = require("child_process");
const util = require("util");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import jwt from "jsonwebtoken";
import path from "node:path";
import events from "node:events";
import child_process from "node:child_process";
import util from "node:util";
const cwd = path.join("temp", "test_integration");
+5 -6
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const path = require("path");
import assert from "node:assert/strict";
import path from "node:path";
const { _exportLocale } = require("@clusterio/host/dist/node/src/export");
const { FactorioServer } = require("@clusterio/host/dist/node/src/server");
import { _exportLocale } from "@clusterio/host/dist/node/src/export.js";
import { FactorioServer } from "@clusterio/host/dist/node/src/server.js";
const { factorioDir, requiresFactorio } = require("./index");
import { factorioDir, requiresFactorio } from "./index.js";
describe("Integration of lib/factorio/export", function() {
+42 -74
View File
@@ -1,27 +1,26 @@
/* eslint-disable no-console */
"use strict";
const path = require("path");
const fs = require("node:fs/promises");
const { readFileSync } = require("node:fs");
const child_process = require("child_process");
const jwt = require("jsonwebtoken");
const util = require("util");
const events = require("events");
import path from "node:path";
import fs from "node:fs/promises";
import { readFileSync } from "node:fs";
import child_process from "node:child_process";
import jwt from "jsonwebtoken";
import util from "node:util";
import events from "node:events";
const lib = require("@clusterio/lib");
const { LineSplitter, ConsoleTransport, logger } = lib;
import * as lib from "@clusterio/lib";
import { LineSplitter, ConsoleTransport, logger } from "@clusterio/lib";
const { selectTargetCommand, initialize: initializeCtl } = require("@clusterio/ctl");
const { _listFactorioVersions } = require("@clusterio/host/dist/node/src/server");
import { selectTargetCommand, initialize as initializeCtl } from "@clusterio/ctl";
import { _listFactorioVersions } from "@clusterio/host/dist/node/src/server.js";
// Make sure permissions from plugins are loaded
require("../../plugins/global_chat/dist/node/index");
require("../../plugins/player_auth/dist/node/index");
require("../../plugins/research_sync/dist/node/index");
require("../../plugins/statistics_exporter/dist/node/index");
require("../../plugins/subspace_storage/dist/node/index");
import "../../plugins/global_chat/dist/node/index.js";
import "../../plugins/player_auth/dist/node/index.js";
import "../../plugins/research_sync/dist/node/index.js";
import "../../plugins/statistics_exporter/dist/node/index.js";
import "../../plugins/subspace_storage/dist/node/index.js";
class TestControl extends lib.Link {
export class TestControl extends lib.Link {
constructor(connector, subscribe = true) {
super(connector);
this.hostUpdates = [];
@@ -93,7 +92,7 @@ class TestControl extends lib.Link {
}
}
class TestControlConnector extends lib.WebSocketClientConnector {
export class TestControlConnector extends lib.WebSocketClientConnector {
register() {
this.sendHandshake(
new lib.MessageRegisterControl(
@@ -105,7 +104,7 @@ class TestControlConnector extends lib.WebSocketClientConnector {
}
}
class TestHostConnector extends lib.WebSocketClientConnector {
export class TestHostConnector extends lib.WebSocketClientConnector {
register() {
this.sendHandshake(
new lib.MessageRegisterHost(
@@ -119,7 +118,7 @@ class TestHostConnector extends lib.WebSocketClientConnector {
}
// Mark that this test takes a lot of time, or depends on a test that takes a lot of time.
function slowTest(test) {
export function slowTest(test) {
if (process.env.FAST_TEST) {
test.skip();
@@ -129,7 +128,7 @@ function slowTest(test) {
}
// Mark that this test depends on an external API and may be slow or flaky.
function externalTest(test) {
export function externalTest(test) {
if (process.env.NO_EXTERNAL_TEST) {
test.skip();
}
@@ -138,7 +137,7 @@ function externalTest(test) {
}
// Mark that this test or suite of tests requires a factorio install to run.
function requiresFactorio(testOrSuite) {
export function requiresFactorio(testOrSuite) {
if (testOrSuite.skip) {
if (!haveFactorioInstall) {
testOrSuite.skip();
@@ -152,11 +151,11 @@ function requiresFactorio(testOrSuite) {
}
}
function hasFactorio() {
export function hasFactorio() {
return haveFactorioInstall;
}
async function get(urlPath) {
export async function get(urlPath) {
const url = new URL("https://localhost:4443");
url.pathname = urlPath;
let res = await fetch(url);
@@ -191,16 +190,16 @@ let haveFactorioInstall;
const baseHostConfig = loadJSON("config-host.json");
let url = "https://localhost:4443/";
let controlToken = jwt.sign({ aud: "user", user: "test" }, Buffer.from("TestSecretDoNotUse", "base64"));
let instancesDir = path.join("temp", "test", "instances");
let modsDir = path.join("temp", "test", "mods");
let databaseDir = path.join("temp", "test", "database");
let factorioDir = getFactorioDir(baseHostConfig);
export let url = "https://localhost:4443/";
export let controlToken = jwt.sign({ aud: "user", user: "test" }, Buffer.from("TestSecretDoNotUse", "base64"));
export let instancesDir = path.join("temp", "test", "instances");
export let modsDir = path.join("temp", "test", "mods");
export let databaseDir = path.join("temp", "test", "database");
export let factorioDir = getFactorioDir(baseHostConfig);
let pluginListPath = path.join("temp", "test", "plugin-list.json");
let controllerConfigPath = path.join("temp", "test", "config-controller.json");
let hostConfigPath = path.join("temp", "test", "config-host.json");
let controlConfigPath = path.join("temp", "test", "config-control.json");
export let controllerConfigPath = path.join("temp", "test", "config-controller.json");
export let hostConfigPath = path.join("temp", "test", "config-host.json");
export let controlConfigPath = path.join("temp", "test", "config-control.json");
function childOptions(options) {
return {
@@ -210,29 +209,29 @@ function childOptions(options) {
};
}
function exec(command, options = {}) {
export function exec(command, options = {}) {
// Uncomment to show commands run in tests
// console.log(command);
return util.promisify(child_process.exec)(command, childOptions(options));
}
function execController(...args) {
export function execController(...args) {
args[0] = `node --enable-source-maps ../../packages/controller ${args[0]}`;
return exec(...args);
}
function execHost(...args) {
export function execHost(...args) {
args[0] = `node --enable-source-maps ../../packages/host ${args[0]}`;
return exec(...args);
}
function execCtlProcess(...args) {
export function execCtlProcess(...args) {
args[0] = `node --enable-source-maps ../../packages/ctl ${args[0]}`;
return exec(...args);
}
let inExecCtl = false;
async function execCtl(command) {
export async function execCtl(command) {
inExecCtl = true;
process.chdir("temp/test");
try {
@@ -257,16 +256,16 @@ afterEach(function() {
}
});
async function sendRcon(instanceId, command) {
export async function sendRcon(instanceId, command) {
return await control.sendTo({ instanceId }, new lib.InstanceSendRconRequest(command));
}
function getControl() {
export function getControl() {
return control;
}
/** @returns {Promise<child_process.ChildProcess>} */
function spawn(name, cmd, waitFor, options = {}) {
export function spawn(name, cmd, waitFor, options = {}) {
const silent = process.env.SILENT_TEST;
const bootstrap = !controllerProcess || !hostProcess;
@@ -303,7 +302,7 @@ function spawn(name, cmd, waitFor, options = {}) {
});
}
function spawnNode(name, cmd, waitFor, options) {
export function spawnNode(name, cmd, waitFor, options) {
return spawn(name, `node --enable-source-maps ${cmd}`, waitFor, options);
}
@@ -437,34 +436,3 @@ process.on("exit", () => {
if (hostProcess) { hostProcess.kill(); }
if (controllerProcess) { controllerProcess.kill(); }
});
module.exports = {
TestControl,
TestControlConnector,
TestHostConnector,
execController,
execCtlProcess,
slowTest,
externalTest,
requiresFactorio,
get,
exec,
execCtl,
execHost,
sendRcon,
getControl,
spawn,
spawnNode,
url,
controlToken,
instancesDir,
modsDir,
databaseDir,
factorioDir,
hasFactorio,
controllerConfigPath,
hostConfigPath,
controlConfigPath,
};
+7 -8
View File
@@ -1,14 +1,13 @@
"use strict";
const path = require("path");
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const fs = require("node:fs/promises");
import path from "node:path";
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
import fs from "node:fs/promises";
const { testMatrix } = require("../common");
const {
import { testMatrix } from "../common.js";
import {
slowTest, exec, execCtl, execCtlProcess, sendRcon, getControl,
requiresFactorio, hasFactorio, instancesDir,
} = require("./index");
} from "./index.js";
const instId = 48;
const instName = "Integration";
+5 -7
View File
@@ -1,11 +1,9 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
const fs = require("node:fs/promises");
const jwt = require("jsonwebtoken");
import assert from "node:assert/strict";
import events from "node:events";
import jwt from "jsonwebtoken";
const { TestControlConnector, TestHostConnector, TestControl, get, exec, url, slowTest } = require("./index");
const { ConnectionClosed, ProtocolError, PolicyViolation, AuthenticationFailed } = require("@clusterio/lib");
import { TestControlConnector, TestHostConnector, TestControl, get, exec, url, slowTest } from "./index.js";
import { ConnectionClosed, ProtocolError, PolicyViolation, AuthenticationFailed } from "@clusterio/lib";
let token = jwt.sign({ aud: "user", user: "test" }, Buffer.from("TestSecretDoNotUse", "base64"));
let tokenHost = jwt.sign({ aud: "host", host: 0 }, Buffer.from("TestSecretDoNotUse", "base64"));
+8 -9
View File
@@ -1,17 +1,16 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const JSZip = require("jszip");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import JSZip from "jszip";
import path from "node:path";
const { patch, SaveModule } = require("@clusterio/host/dist/node/src/patch");
const lib = require("@clusterio/lib");
import { patch, SaveModule } from "@clusterio/host/dist/node/src/patch.js";
import * as lib from "@clusterio/lib";
const { slowTest } = require("./index");
import { slowTest } from "./index.js";
// The server integration test is required to run before this one
require("./server");
import "./server.js";
describe("Integration of lib/factorio/patch", function() {
describe("patch()", function() {
+5 -6
View File
@@ -1,12 +1,11 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
const { Host, Instance, InstanceConnection } = require("@clusterio/host");
const { ControlConnection, Controller, HostConnection, InstanceRecord } = require("@clusterio/controller");
import * as lib from "@clusterio/lib";
import { Host, Instance, InstanceConnection } from "@clusterio/host";
import { ControlConnection, Controller, HostConnection, InstanceRecord } from "@clusterio/controller";
// Although there are no imports, the file has side-effects such as "before" which can effect tests
require("./index");
import "./index.js";
const addr = lib.Address.fromShorthand;
+9 -10
View File
@@ -1,15 +1,14 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import events from "node:events";
import fs from "node:fs/promises";
import path from "node:path";
const lib = require("@clusterio/lib");
const { InstanceManager } = require("@clusterio/controller");
const { FactorioServer, _getFactorioVersion } = require("@clusterio/host/dist/node/src/server");
const { logger } = lib;
import * as lib from "@clusterio/lib";
import { InstanceManager } from "@clusterio/controller";
import { FactorioServer, _getFactorioVersion } from "@clusterio/host/dist/node/src/server.js";
import { logger } from "@clusterio/lib";
const { slowTest, factorioDir, requiresFactorio } = require("./index");
import { slowTest, factorioDir, requiresFactorio } from "./index.js";
describe("Integration of host/src/server", function() {
+2 -3
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const { ExponentialBackoff } = require("@clusterio/lib");
import { ExponentialBackoff } from "@clusterio/lib";
describe("lib/ExponentialBackoff", function() {
describe("class ExponentialBackoff", function() {
+4 -5
View File
@@ -1,10 +1,9 @@
/* eslint-disable node/no-sync */
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
const { LockFile } = require("@clusterio/lib");
import { LockFile } from "@clusterio/lib";
const baseDir = path.join("temp", "test", "lock_file");
+7 -8
View File
@@ -1,15 +1,14 @@
"use strict";
const assert = require("assert").strict;
const path = require("path");
const fs = require("node:fs/promises");
const stream = require("node:stream");
const JSZip = require("jszip"); // Added for creating mock zips
import assert from "node:assert/strict";
import path from "node:path";
import fs from "node:fs/promises";
import stream from "node:stream";
import JSZip from "jszip"; // Added for creating mock zips
// Capture native fetch before any potential mocks are applied
const nativeFetch = global.fetch;
const { ModStore, ModInfo, ModVersionEquality } = require("@clusterio/lib"); // Adjust path based on compiled output
const { externalTest } = require("../integration");
import { ModStore, ModInfo, ModVersionEquality } from "@clusterio/lib"; // Adjust path based on compiled output
import { externalTest } from "../integration/index.js";
const MODS_DIR = path.join("temp", "test", "mod_store", "mods");
const CACHE_FILE = path.join(MODS_DIR, "mod-info-cache.json");
+2 -3
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const { RateLimiter, wait } = require("@clusterio/lib");
import { RateLimiter, wait } from "@clusterio/lib";
describe("lib/RateLimiter", function() {
+2 -2
View File
@@ -1,5 +1,5 @@
const assert = require("assert").strict;
const { ValueCache, wait } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { ValueCache, wait } from "@clusterio/lib";
describe("ValueCache", function () {
describe("constructor", function () {
+4 -4
View File
@@ -1,12 +1,12 @@
const assert = require("assert").strict;
const { checkSingletonImport } = require("@clusterio/lib/dist/node/src/check_singleton_import");
import assert from "node:assert/strict";
import { checkSingletonImport } from "@clusterio/lib/dist/node/src/check_singleton_import.js";
// Import lib so it sets the global indicating lib has been imported.
require("@clusterio/lib");
import "@clusterio/lib";
describe("lib/check_singleton_import", function() {
it("Should throw an installation error if called twice", function() {
assert.throws(
() => checkSingletonImport(__filename),
() => checkSingletonImport(import.meta.filename),
{
message: /Attempt to import duplicate copy of @clusterio\/lib/,
code: "InstallationError",
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
const mock = require("../mock");
import * as lib from "@clusterio/lib";
import * as mock from "../mock.js";
const addr = lib.Address.fromShorthand;
+4 -5
View File
@@ -1,8 +1,7 @@
"use strict";
const lib = require("@clusterio/lib");
const fs = require("node:fs/promises");
const path = require("path");
const assert = require("assert").strict;
import * as lib from "@clusterio/lib";
import fs from "node:fs/promises";
import path from "node:path";
import assert from "node:assert/strict";
const CA = lib.ConfigAccess;
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const lib = require("@clusterio/lib");
const assert = require("assert").strict;
import * as lib from "@clusterio/lib";
import assert from "node:assert/strict";
// Each migration test should indicate which version introduced the migration
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
const validators = lib.Config.validators;
const { ControllerConfig, HostConfig, InstanceConfig, ControlConfig } = lib;
import { ControllerConfig, HostConfig, InstanceConfig, ControlConfig } from "@clusterio/lib";
describe("lib/config/validators", function() {
describe("all", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const { HostDetails } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { HostDetails } from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../../common.js";
describe("lib/data/HostDetails", function () {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const { InstanceDetails } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { InstanceDetails } from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../../common.js";
describe("lib/data/InstanceDetails", function () {
+7 -8
View File
@@ -1,13 +1,12 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
const lib = require("@clusterio/lib");
const libBuildMod = require("@clusterio/lib/build_mod");
const { ModInfo, ModDependency } = lib;
import * as lib from "@clusterio/lib";
import * as libBuildMod from "@clusterio/lib/build_mod.js";
import { ModInfo, ModDependency } from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../../common.js";
describe("lib/data/ModInfo", function() {
describe("class ModDependency", function() {
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const zlib = require("zlib");
import assert from "node:assert/strict";
import zlib from "node:zlib";
const lib = require("@clusterio/lib");
const { ModInfo, ModPack, getInstalledModUpdates, applyModRecordAdvisories } = lib;
import * as lib from "@clusterio/lib";
import { ModInfo, ModPack, getInstalledModUpdates, applyModRecordAdvisories } from "@clusterio/lib";
describe("lib/data/ModPack", function() {
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
describe("lib/data/Role", function() {
let defaultPermissions;
+2 -4
View File
@@ -1,8 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
const { SystemInfo } = lib;
import { SystemInfo } from "@clusterio/lib";
describe("lib/data/SystemInfo", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const { UserDetails, PlayerStats } = require("@clusterio/lib");
import assert from "node:assert/strict";
import { UserDetails, PlayerStats } from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../../common.js";
describe("lib/data/UserDetails", function () {
it("should be round trip serialisable", function () {
+2 -4
View File
@@ -1,7 +1,5 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const { Address } = lib;
import assert from "node:assert/strict";
import { Address } from "@clusterio/lib";
describe("lib/data/messages_core", function() {
describe("class Address", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../../common.js";
describe("lib/data/version", function() {
describe("isVersionEquality()", function() {
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/database", function() {
describe("mapToObject()", function() {
+5 -6
View File
@@ -1,9 +1,8 @@
"use strict";
const events = require("events");
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const fs = require("node:fs/promises");
const path = require("path");
import events from "node:events";
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
import fs from "node:fs/promises";
import path from "node:path";
class MockDatastoreProvider extends lib.DatastoreProvider {
constructor() {
+2 -3
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/errors", function() {
describe("class InvalidMessage", function() {
+4 -4
View File
@@ -1,8 +1,8 @@
const assert = require("assert").strict;
const { readFile } = require("node:fs/promises");
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
const { fetchFactorioVersions } = require("@clusterio/lib");
const { slowTest, externalTest } = require("../../integration");
import { fetchFactorioVersions } from "@clusterio/lib";
import { slowTest, externalTest } from "../../integration/index.js";
describe("FactorioVersions", function() {
describe("fetchFactorioVersions", function() {
+3 -3
View File
@@ -1,7 +1,7 @@
const assert = require("assert").strict;
import assert from "node:assert/strict";
const { fetchLatestReleases, resolveReleaseChannel } = require("@clusterio/lib");
const { slowTest, externalTest } = require("../../integration");
import { fetchLatestReleases, resolveReleaseChannel } from "@clusterio/lib";
import { slowTest, externalTest } from "../../integration/index.js";
describe("LatestReleases", function() {
describe("fetchLatestReleases", function() {
+5 -6
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const zlib = require("zlib");
import assert from "node:assert/strict";
import zlib from "node:zlib";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
const testStrings = require("./test_strings");
const testSettings = require("./test_settings");
import * as testStrings from "./test_strings.js";
import * as testSettings from "./test_settings.js";
// Simple linear congruential random number generator
+1 -7
View File
@@ -1,7 +1,5 @@
// Lines for testing the factorio output
"use strict";
let testLines = new Map([
export const testLines = new Map([
[
" 1.306 Info RemoteCommandProcessor.cpp:131: Starting RCON interface at port 4000",
{
@@ -219,7 +217,3 @@ let testLines = new Map([
},
],
]);
module.exports = {
testLines,
};
+10 -24
View File
@@ -1,6 +1,5 @@
"use strict";
const default_map_gen_settings = {
export const default_map_gen_settings = {
autoplace_controls: {
"coal": { frequency: 1, size: 1, richness: 1 },
"copper-ore": { frequency: 1, size: 1, richness: 1 },
@@ -37,7 +36,7 @@ const default_map_gen_settings = {
water: 1,
};
const default_map_settings = {
export const default_map_settings = {
pollution: {
enabled: true,
diffusion_ratio: 0.02,
@@ -140,7 +139,7 @@ const default_map_settings = {
},
};
const modified_map_gen_settings = {
export const modified_map_gen_settings = {
autoplace_controls: {
"coal": { frequency: 1, size: 1, richness: 1 },
"copper-ore": { frequency: 0.5, size: 1, richness: 1 },
@@ -196,7 +195,7 @@ const modified_map_gen_settings = {
water: 0.3333333432674408,
};
const modified_map_settings = {
export const modified_map_settings = {
pollution: {
enabled: true,
diffusion_ratio: 0.02,
@@ -299,7 +298,7 @@ const modified_map_settings = {
},
};
const modified_v2_map_gen_settings = {
export const modified_v2_map_gen_settings = {
autoplace_controls: {
"coal": { frequency: 1, size: 1, richness: 1 },
"copper-ore": { frequency: 0.5, size: 1, richness: 1 },
@@ -362,7 +361,7 @@ const modified_v2_map_gen_settings = {
territory_settings: null,
};
const modified_v2_map_settings = {
export const modified_v2_map_settings = {
pollution: {
enabled: true,
diffusion_ratio: 0.02,
@@ -467,7 +466,7 @@ const modified_v2_map_settings = {
},
};
const modified_v2_1_map_gen_settings = {
export const modified_v2_1_map_gen_settings = {
"autoplace_controls": {
"coal": { "frequency": 1, "size": 1, "richness": 1 },
"copper-ore": { "frequency": 0.5, "size": 1, "richness": 1 },
@@ -516,7 +515,7 @@ const modified_v2_1_map_gen_settings = {
"territory_settings": null,
};
const modified_v2_1_map_settings = {
export const modified_v2_1_map_settings = {
"pollution": {
"enabled": true,
"diffusion_ratio": 0.02,
@@ -615,7 +614,7 @@ const modified_v2_1_map_settings = {
},
};
const modified_v2_1_13_map_settings = {
export const modified_v2_1_13_map_settings = {
...modified_v2_1_map_settings,
"enemy_expansion": {
...modified_v2_1_map_settings.enemy_expansion,
@@ -623,7 +622,7 @@ const modified_v2_1_13_map_settings = {
},
};
const modified_space_age_map_gen_settings = {
export const modified_space_age_map_gen_settings = {
autoplace_controls: {
"aquilo_crude_oil": { frequency: 1, size: 1, richness: 1 },
"calcite": { frequency: 1, size: 1, richness: 1 },
@@ -701,16 +700,3 @@ const modified_space_age_map_gen_settings = {
no_enemies_mode: false,
territory_settings: null,
};
module.exports = {
default_map_gen_settings,
default_map_settings,
modified_map_gen_settings,
modified_map_settings,
modified_v2_map_gen_settings,
modified_v2_map_settings,
modified_v2_1_map_gen_settings,
modified_v2_1_map_settings,
modified_v2_1_13_map_settings,
modified_space_age_map_gen_settings,
};
+6 -16
View File
@@ -1,7 +1,6 @@
"use strict";
// Exchange strings for testing with
const default_ = `
export default `
>>>eNpjZGBkUGQAgwZ7EOZgSc5PzIHxQJgrOb+gILVIN78oFVmYM
7moNCVVNz8TVXFqXmpupW5SYjGKYo7Movw8dBNYi0vy81BFSopSU
4uRRbhLixLzMktz0fUyMF5imubZ0CLHAML/6xkU/v8HYSDrAdAvI
@@ -14,7 +13,7 @@ MPlQMQJEAG2EO4yRgjTod+B0UEeJiuJUALUb8SA7IYUhA9Pwqw9j
GQ/mkMwIwLZH2giKg5YooELZGEKnHjBDHcNMDwvsMN4DvMdGJlBD
JCqL0AxCA8kAzMKQgs4gIObmQEBgGmjrO/lHgDxa6G4<<<`;
const modified = `
export const modified = `
>>>eNp1UzFs00AUvZ8mbRIEypCBSlCCyFAhOQqBKULxlQUxMCCxgnCc
S2rh2On5LAgMZOjAgISEurQLXSmCBTGwRWKhEkgIJraiMgBiaGmFOiC
FO5/PsUz6pfv+9/6/99+/kwEBOo2k6c83NhrZtOkaNkIDXa286fZ6hG
@@ -31,7 +30,7 @@ jnh3gmXQRElVwYyxI8x4FMqOzsu4edrKK6hNZ5wU7V9G+ufEFL+7yHi
cySQMp7wDHnRsBW571ORGn6fH2fUDj/FwV0iUbXPMbmTP7akkt8ChiL
/BPceEs3j1M3iz71/ObT9tA==<<<`;
const modified_v2 = `
export const modified_v2 = `
>>>eNp1Uz9oU0EY/y5N2iRWzRCFitSAGURIjNEpSN7VRRwcBFeJl5dL
+ujLe+3de9XoYIYODoogXdrFrlZ0EQe3gIsFBdHJrVIHBYdWi3QQ4l3
u3csz1Q++7333+31/75IYAJwRCpNx0yU2QNfQmjbd+XnKCi6jgg/hlM
@@ -49,7 +48,7 @@ Ln6IET6h2alhiMgvQ3SGxnDDDd32daT/yCD5fQ8R3WMEyeN/PENaNmy
E5utYOI24z/cT+oQf48FdgozaFZg6qX+1KqW+GYyy4qNZgFNY/0IAHj
RI5Q/27QvL<<<`;
const modified_v2_1 = `
export const modified_v2_1 = `
>>>eNp1U89rE0EUftM0NYlVc4iCIjWHHkRICNFTkezoRTx4ELxKnGwm
unSz087uVlsP5uDBg1CQXvSiVyt6EY9CwIu9if4DlXqwt1aK9CDEeZm
dyZrgg/f49nu/37BTQCAPGYDZaVcwH6DnGC24YmmJy4qQHAAsnXdl3O
@@ -65,7 +64,7 @@ JYkZplFakZG9jCkjt5gyQ4nHFv3qqTPmsjWiYeiVKOkP57RB9xB0Dvk
X9skPmJ46b3GGNscC4FCtiwbc3PTPrUX46YL/qSDp8BMOqAJI8C+u/S
peyl8e7GC3Ce2le3AIs019Y//gU3lOV1<<<`;
const modified_space_age = `
export const modified_space_age = `
>>>eNp1VEFoE0EUnUkb27TWBomFSqkBexAhMVZPRbJbL+LBg+BV1slm
kgzd7LYzs9HYgz304EEQpJf2Yq9W9CIevBW8WFAQPXmr1IOCh1aL9CD
UmZ2dzW4aB2by972Z9//7MyQFALggJpjIogWfOJ5lU7+KLY84ACwZeg
@@ -86,7 +85,7 @@ Gx0+5gy4RUpPimXd3JJg0hSVAZVaD42oXlGs+OdLeL8NIjXUO043NJp
38bydxUydeQi4j66kCmzxzUMyYTVaPneF1Uj+vlxQH+ZT82gl0Du2he
Y+lJ/JEpK/WZNmBM/mgXgnKlfCACLzljjH+s/hYo=<<<`;
const modified_v2_1_13 = `
export const modified_v2_1_13 = `
>>>eNp1U89rE0EUftMmNYm15hAFRWoOPYiQEKKgFMmOXsSDB0HwJHGy
mejSzU47u1utHszBgwdBkF70olcrehHvAS/2JvUfqNSDvbVSpAehzsv
sTNYEH7zHt9/7/YadAAIzSmE64wrmA/QcowVXLC5yWRGSA4Cl866M27
@@ -101,12 +100,3 @@ JYkZpmFakZGd1AkjtxhSQjYziizPKvHmmTPmUDWuYoiVKOgP57RB9yS
0Dvo1NMEfJJWw1i+YLmuywM1C1jwbPKaGnjffEMETl1yE9Qxu/9C7rp
u3nVP+RQebGLpzeY4SxwbkUKGDDtjU/J9P3/nrIfNHXdPAWgFF7JHkZ
0L+YLmXPjcc3XoAz1D69BVjk1sULxb83nuUA<<<`;
module.exports = {
default: default_,
modified,
modified_v2,
modified_v2_1,
modified_v2_1_13,
modified_space_age,
};
+6 -7
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const http = require("node:http");
const path = require("path");
const util = require("node:util");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import http from "node:http";
import path from "node:path";
import util from "node:util";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/file_ops", function() {
let baseDir = path.join("temp", "test", "file_ops");
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/hash", function() {
+2 -3
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const hrtime = process.hrtime.bigint;
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/helpers", function() {
+3 -4
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import * as lib from "@clusterio/lib";
describe("lib/ini", function() {
describe("parse()", function() {
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
import assert from "node:assert/strict";
import events from "node:events";
const mock = require("../../mock");
const lib = require("@clusterio/lib");
import * as mock from "../../mock.js";
import * as lib from "@clusterio/lib";
describe("lib/link/connectors", function() {
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const events = require("events");
import assert from "node:assert/strict";
import events from "node:events";
const lib = require("@clusterio/lib");
const mock = require("../../mock");
import * as lib from "@clusterio/lib";
import * as mock from "../../mock.js";
const addr = lib.Address.fromShorthand;
+5 -6
View File
@@ -1,10 +1,9 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
const { testLines } = require("./factorio/lines");
const lib = require("@clusterio/lib");
import { testLines } from "./factorio/lines.js";
import * as lib from "@clusterio/lib";
describe("lib/logging_utils.js", function() {
+2 -3
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
describe("lib/lua_tools", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const mock = require("../mock");
const lib = require("@clusterio/lib");
import * as mock from "../mock.js";
import * as lib from "@clusterio/lib";
describe("lib/plugin", function() {
+15 -15
View File
@@ -1,10 +1,10 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
import { pathToFileURL } from "node:url";
const lib = require("@clusterio/lib");
const { BaseControllerPlugin } = require("@clusterio/controller");
import * as lib from "@clusterio/lib";
import { BaseControllerPlugin } from "@clusterio/controller";
describe("lib/plugin_loader", function() {
@@ -19,7 +19,7 @@ describe("lib/plugin_loader", function() {
await fs.mkdir(pluginPath, { recursive: true });
await fs.writeFile(
path.join(pluginPath, "index.js"),
`module.exports.plugin = { name: "${infoName}" };`
`export const plugin = { name: "${infoName}" };`
);
await fs.writeFile(
path.join(pluginPath, "package.json"),
@@ -56,7 +56,7 @@ describe("lib/plugin_loader", function() {
it("should reject on broken plugin", async function() {
let brokenMessage;
try {
require(path.resolve(brokenPlugin));
await import(pathToFileURL(path.resolve(path.join(brokenPlugin, "index.js"))));
} catch (err) {
brokenMessage = err.message;
}
@@ -84,7 +84,7 @@ describe("lib/plugin_loader", function() {
await writeEntrypoint(missingClass, "");
await writeEntrypoint(
wrongParentClass, "class ControllerPlugin {}\n module.exports = { ControllerPlugin };\n"
wrongParentClass, "export class ControllerPlugin {};\n"
);
});
it("should throw if class is missing from entrypoint", async function() {
@@ -92,13 +92,13 @@ describe("lib/plugin_loader", function() {
await assert.rejects(
lib.loadPluginClass(
"test",
path.posix.join(requirePath, "controller"),
path.posix.join(requirePath, "controller.js"),
"ControllerPlugin",
BaseControllerPlugin,
),
{
message:
`PluginError: Expected ${path.posix.join(requirePath, "controller")} ` +
`PluginError: Expected ${path.posix.join(requirePath, "controller.js")} ` +
"to export a class named ControllerPlugin",
}
);
@@ -108,14 +108,14 @@ describe("lib/plugin_loader", function() {
await assert.rejects(
lib.loadPluginClass(
"test",
path.posix.join(requirePath, "controller"),
path.posix.join(requirePath, "controller.js"),
"ControllerPlugin",
BaseControllerPlugin,
),
{
message:
"PluginError: Expected ControllerPlugin exported from " +
`${path.posix.join(requirePath, "controller")} to be a subclass of BaseControllerPlugin`,
`${path.posix.join(requirePath, "controller.js")} to be a subclass of BaseControllerPlugin`,
}
);
});
@@ -152,7 +152,7 @@ describe("lib/plugin_loader", function() {
await fs.mkdir(pluginPath, { recursive: true });
await fs.writeFile(
path.join(pluginPath, "index.js"),
`module.exports.plugin = { name: "${name}" };`
`export const plugin = { name: "${name}" };`
);
await fs.writeFile(
path.join(pluginPath, "package.json"),
@@ -195,7 +195,7 @@ describe("lib/plugin_loader", function() {
await fs.mkdir(path.join(deepPluginPath, "dist"));
await fs.writeFile(
path.join(deepPluginPath, "dist", "index.js"),
'module.exports.plugin = { name: "deep" };'
'export const plugin = { name: "deep" };'
);
// Create an npm module that is not a plugin
+2 -3
View File
@@ -1,7 +1,6 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const prometheus = require("@clusterio/lib");
import * as prometheus from "@clusterio/lib";
describe("lib/prometheus", function() {
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
describe("rce_ops", function() {
describe("updatePackage", function() {
+6 -7
View File
@@ -1,11 +1,10 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const path = require("path");
const stream = require("stream");
const util = require("util");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
import stream from "node:stream";
import util from "node:util";
const lib = require("@clusterio/lib");
import * as lib from "@clusterio/lib";
const finished = util.promisify(stream.finished);
+5 -6
View File
@@ -1,9 +1,8 @@
"use strict";
const events = require("events");
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
const { MockController, MockConnector, MockControl } = require("../mock");
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import events from "node:events";
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
import { MockController, MockConnector, MockControl } from "../mock.js";
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
const addr = lib.Address.fromShorthand;
+2 -3
View File
@@ -1,6 +1,5 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
describe("lib/users", function() {
+3 -4
View File
@@ -1,8 +1,7 @@
"use strict";
const assert = require("assert").strict;
const JSZip = require("jszip");
import assert from "node:assert/strict";
import JSZip from "jszip";
const { findRoot } = require("@clusterio/lib");
import { findRoot } from "@clusterio/lib";
describe("lib/factorio", function() {
+1 -2
View File
@@ -1,5 +1,4 @@
"use strict";
const { ModPack } = require("@clusterio/lib");
import { ModPack } from "@clusterio/lib";
const pack = new ModPack();
pack.name = "test-settings";
+7 -8
View File
@@ -1,12 +1,11 @@
"use strict";
const assert = require("assert").strict;
const fs = require("node:fs/promises");
const os = require("node:os");
const path = require("node:path");
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import * as lib from "@clusterio/lib";
const { Controller, ControlConnection } = require("@clusterio/controller");
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { Controller, ControlConnection } from "@clusterio/controller";
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
describe("messages/controller", function() {
/** @type {Controller} */
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
const { Host } = require("@clusterio/host");
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { Host } from "@clusterio/host";
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
describe("messages/host", function() {
/** @type {Host} */
+6 -7
View File
@@ -1,13 +1,12 @@
"use strict";
const assert = require("assert").strict;
import assert from "node:assert/strict";
const lib = require("@clusterio/lib");
const { ModDependencyResolveRequest, ModDependency, ModInfo } = lib;
import * as lib from "@clusterio/lib";
import { ModDependencyResolveRequest, ModDependency, ModInfo } from "@clusterio/lib";
const { testMatrix, testRoundTripJsonSerialisable } = require("../common");
import { testMatrix, testRoundTripJsonSerialisable } from "../common.js";
const { Controller, ControlConnection } = require("@clusterio/controller");
const { externalTest } = require("../integration");
import { Controller, ControlConnection } from "@clusterio/controller";
import { externalTest } from "../integration/index.js";
describe("messages/mod", function() {
/** @type {Controller} */
+4 -5
View File
@@ -1,9 +1,8 @@
"use strict";
const assert = require("assert").strict;
const lib = require("@clusterio/lib");
import assert from "node:assert/strict";
import * as lib from "@clusterio/lib";
const { Controller, ControlConnection } = require("@clusterio/controller");
const { Host } = require("@clusterio/host");
import { Controller, ControlConnection } from "@clusterio/controller";
import { Host } from "@clusterio/host";
describe("messages/plugin", function() {
/** @type {Host} */
+15 -31
View File
@@ -1,14 +1,13 @@
"use strict";
const events = require("events");
const http = require("http");
const express = require("express");
import events from "node:events";
import http from "node:http";
import express from "express";
const lib = require("@clusterio/lib");
const { User, UserManager, UserRecord, InstanceManager } = require("@clusterio/controller");
import * as lib from "@clusterio/lib";
import { User, UserManager, UserRecord, InstanceManager } from "@clusterio/controller";
const addr = lib.Address.fromShorthand;
class MockLogger {
export class MockLogger {
child() { return this; }
fatal() { }
@@ -26,7 +25,7 @@ class MockLogger {
verbose() { }
}
class MockSocket {
export class MockSocket {
constructor() {
this.sentMessages = [];
this.events = new Map();
@@ -66,7 +65,7 @@ class MockSocket {
}
}
class MockConnector extends lib.BaseConnector {
export class MockConnector extends lib.BaseConnector {
constructor(src, dst) {
super(src, dst);
@@ -86,7 +85,7 @@ class MockConnector extends lib.BaseConnector {
}
}
class MockServer extends events.EventEmitter {
export class MockServer extends events.EventEmitter {
constructor() {
super();
this.reset();
@@ -116,7 +115,7 @@ class MockServer extends events.EventEmitter {
}
}
class MockInstance extends lib.Link {
export class MockInstance extends lib.Link {
constructor() {
super(new MockConnector(addr({ instanceId: 7357 }), addr({ hostId: 1 })));
this.logger = new MockLogger();
@@ -144,15 +143,15 @@ class MockInstance extends lib.Link {
}
}
class MockHost extends lib.Link {
export class MockHost extends lib.Link {
constructor() {
super(new MockConnector(addr({ hostId: 1 }), addr("controller")));
}
}
class MockControl extends lib.Link { }
export class MockControl extends lib.Link { }
class MockController {
export class MockController {
constructor() {
this.app = express();
this.app.locals.controller = this;
@@ -224,7 +223,7 @@ class MockController {
}
}
async function createControllerPlugin(ControllerPluginClass, info) {
export async function createControllerPlugin(ControllerPluginClass, info) {
let controller = new MockController();
let metrics = {};
let logger = new MockLogger();
@@ -233,25 +232,10 @@ async function createControllerPlugin(ControllerPluginClass, info) {
return plugin;
}
async function createInstancePlugin(InstancePluginClass, info) {
export async function createInstancePlugin(InstancePluginClass, info) {
let instance = new MockInstance();
let host = new MockHost();
let plugin = new InstancePluginClass(info, instance, host);
await plugin.init();
return plugin;
}
module.exports = {
MockLogger,
MockSocket,
MockConnector,
MockServer,
MockInstance,
MockHost,
MockControl,
MockController,
createControllerPlugin,
createInstancePlugin,
};