Address review on plugin install

Rethrow errors other than ENOENT and ENOTDIR when reading the package
spec as a directory, mark the tests that run npm as slow so FAST_TEST
skips them, and use ./external_plugins/my_plugin in the README examples.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bbassieandClaude Fable 5.1 committed 2026-09-12 17:59:01 +00:00
1 parent 5606d5d553
commit 7c0f77499c
5 files changed
+15 -12

No files matched your search

+2 -2
View File
@@ -44,9 +44,9 @@ Add plugin either by require path or relative/absolute path to the plugin direct
A relative path must start with ./ or ../ (or .\ and ..\ on Windows) otherwise it will be assumed to be a require path for an installed package in node_modules.
This is mainly useful for plugins under development, packages published on npm are better installed with `plugin install`.
For example, adding a plugin checked out next to the Clusterio installation:
For example, adding a plugin checked out in the external_plugins directory:
npx clusteriocontroller plugin add ../my_plugin
npx clusteriocontroller plugin add ./external_plugins/my_plugin
#### `plugin remove <name>`
+2 -2
View File
@@ -46,9 +46,9 @@ Add plugin either by require path or relative/absolute path to the plugin direct
A relative path must start with ./ or ../ (or .\ and ..\ on Windows) otherwise it will be assumed to be a require path for an installed package in node_modules.
This is mainly useful for plugins under development, packages published on npm are better installed with `plugin install`.
For example, adding a plugin checked out next to the Clusterio installation:
For example, adding a plugin checked out in the external_plugins directory:
npx clusterioctl plugin add ../my_plugin
npx clusterioctl plugin add ./external_plugins/my_plugin
#### `plugin remove <name>`
+2 -2
View File
@@ -45,9 +45,9 @@ Add plugin either by require path or relative/absolute path to the plugin direct
A relative path must start with ./ or ../ (or .\ and ..\ on Windows) otherwise it will be assumed to be a require path for an installed package in node_modules.
This is mainly useful for plugins under development, packages published on npm are better installed with `plugin install`.
For example, adding a plugin checked out next to the Clusterio installation:
For example, adding a plugin checked out in the external_plugins directory:
npx clusteriohost plugin add ../my_plugin
npx clusteriohost plugin add ./external_plugins/my_plugin
#### `plugin remove <name>`
+4 -2
View File
@@ -74,8 +74,10 @@ async function packageNameFromSpec(packageSpec: string) {
if (typeof packageJson.name === "string") {
return packageJson.name;
}
} catch {
// Not a local directory, treat it as name@version
} catch (err: any) {
if (!["ENOENT", "ENOTDIR"].includes(err.code)) {
throw err;
}
}
return packageSpec.replace(/(?!^)@.*$/, "");
}
+5 -4
View File
@@ -4,6 +4,7 @@ const fs = require("fs/promises");
const path = require("path");
const lib = require("@clusterio/lib");
const { slowTest } = require("../integration");
describe("lib/shared_commands", function() {
@@ -71,7 +72,7 @@ describe("lib/shared_commands", function() {
});
it("should install and add an npm plugin", async function() {
this.timeout(60000);
slowTest(this);
await fs.writeFile("package.json", JSON.stringify({ name: "clusterio-install", private: true }));
await run("install", testPluginPath);
assert.equal(process.exitCode, undefined);
@@ -82,7 +83,7 @@ describe("lib/shared_commands", function() {
});
it("should report plugins that are already installed", async function() {
this.timeout(60000);
slowTest(this);
await fs.writeFile("package.json", JSON.stringify({ name: "clusterio-install", private: true }));
await run("install", testPluginPath);
assert.deepEqual([...pluginList], [["test_plugin", "test_plugin"]]);
@@ -94,7 +95,7 @@ describe("lib/shared_commands", function() {
});
it("should fail when the package is not a plugin", async function() {
this.timeout(60000);
slowTest(this);
await fs.writeFile("package.json", JSON.stringify({ name: "clusterio-install", private: true }));
const notAPlugin = path.resolve("not-a-plugin");
await fs.mkdir(notAPlugin);
@@ -105,7 +106,7 @@ describe("lib/shared_commands", function() {
});
it("should fail when npm install fails", async function() {
this.timeout(60000);
slowTest(this);
await fs.writeFile("package.json", JSON.stringify({ name: "clusterio-install", private: true }));
await run("install", path.resolve("does-not-exist"));
assert.equal(process.exitCode, 1);