mirror of
https://github.com/getpaseo/paseo.git
synced 2026-11-07 08:54:42 +00:00
feat(plugins): install npm sources and review CLI updates
Treat install selectors as one-time choices. Keep source identity separate from the installed revision, and resolve ordinary updates from the current upstream default. npm only acquires directories; plugin loading remains independent of npm.
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
import { resolveCliVersion } from "../../src/version.js";
|
||||
import { readPluginManifest } from "../../../server/src/server/plugins/manifest.js";
|
||||
|
||||
import {
|
||||
startNpmRegistry,
|
||||
npmPluginPackages,
|
||||
} from "../../../../scripts/test-support/npm-registry.mjs";
|
||||
import assert from "node:assert/strict";
|
||||
import { execFile } from "node:child_process";
|
||||
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
||||
@@ -26,7 +30,8 @@ async function git(cwd: string, args: string[]): Promise<void> {
|
||||
async function main(): Promise<void> {
|
||||
const directory = await mkdtemp(path.join(tmpdir(), "paseo-plugin-cli-e2e-"));
|
||||
const gitDirectory = await mkdtemp(path.join(tmpdir(), "paseo-plugin-git-cli-e2e-"));
|
||||
const context = await createE2ETestContext({ timeout: 45_000 });
|
||||
const registry = await startNpmRegistry(npmPluginPackages());
|
||||
const context = await createE2ETestContext({ timeout: 45_000, env: registry.env });
|
||||
try {
|
||||
const scaffold = path.join(context.workDir, "authored-plugin");
|
||||
const init = await context.paseo(["plugin", "init", scaffold, "--json"]);
|
||||
@@ -82,7 +87,7 @@ async function main(): Promise<void> {
|
||||
const gitInstall = await context.paseo([
|
||||
"plugin",
|
||||
"add",
|
||||
pathToFileURL(gitDirectory).href,
|
||||
`git:${pathToFileURL(gitDirectory).href}`,
|
||||
"--json",
|
||||
]);
|
||||
assert.equal(gitInstall.exitCode, 0, gitInstall.stderr);
|
||||
@@ -99,11 +104,11 @@ async function main(): Promise<void> {
|
||||
assert.equal(JSON.parse(status.stdout)[0].status, "running");
|
||||
assert.equal(JSON.parse(status.stdout)[0].commit, JSON.parse(gitInstall.stdout).commit);
|
||||
|
||||
const update = await context.paseo(["plugin", "update", "git-cli-e2e", "--json"]);
|
||||
const update = await context.paseo(["plugin", "update", "git-cli-e2e", "--yes", "--json"]);
|
||||
assert.equal(update.exitCode, 0, update.stderr);
|
||||
assert.equal(JSON.parse(update.stdout)[0].updated, true);
|
||||
assert.equal(JSON.parse(update.stdout)[0].outcome, "updated");
|
||||
|
||||
const installedCommit = JSON.parse(update.stdout)[0].currentCommit;
|
||||
const installedCommit = JSON.parse(update.stdout)[0].plugin.installation.currentRevision;
|
||||
const buildMarker = path.join(context.workDir, "incompatible-build-ran");
|
||||
await writeFile(
|
||||
path.join(gitDirectory, "paseo-plugin.json"),
|
||||
@@ -122,9 +127,15 @@ async function main(): Promise<void> {
|
||||
);
|
||||
await git(gitDirectory, ["add", "-A"]);
|
||||
await git(gitDirectory, ["commit", "-m", "requires a future Paseo"]);
|
||||
const incompatibleUpdate = await context.paseo(["plugin", "update", "git-cli-e2e", "--json"]);
|
||||
const incompatibleUpdate = await context.paseo([
|
||||
"plugin",
|
||||
"update",
|
||||
"git-cli-e2e",
|
||||
"--yes",
|
||||
"--json",
|
||||
]);
|
||||
assert.equal(incompatibleUpdate.exitCode, 1);
|
||||
assert.match(incompatibleUpdate.stderr, /requires Paseo >=999.0.0/);
|
||||
assert.match(JSON.parse(incompatibleUpdate.stdout)[0].error, /requires Paseo >=999.0.0/);
|
||||
await assert.rejects(readFile(buildMarker), { code: "ENOENT" });
|
||||
const retained = await context.paseo(["plugin", "ls", "git-cli-e2e", "--json"]);
|
||||
assert.equal(retained.exitCode, 0, retained.stderr);
|
||||
@@ -160,11 +171,54 @@ async function main(): Promise<void> {
|
||||
assert.equal(removeGit.exitCode, 0, removeGit.stderr);
|
||||
const removeScaffold = await context.paseo(["plugin", "remove", "authored-plugin", "--json"]);
|
||||
assert.equal(removeScaffold.exitCode, 0, removeScaffold.stderr);
|
||||
for (const source of ["npm:paseo-fixture-plugin@^1.0.0", "npm:@paseo-fixture/review@2.0.0"]) {
|
||||
const npmInstall = await context.paseo([
|
||||
"plugin",
|
||||
"install",
|
||||
source,
|
||||
"--path",
|
||||
".",
|
||||
"--json",
|
||||
]);
|
||||
assert.equal(npmInstall.exitCode, 0, npmInstall.stderr);
|
||||
assert.equal(JSON.parse(npmInstall.stdout).id, "npm-review");
|
||||
assert.equal(JSON.parse(npmInstall.stdout).status, "running");
|
||||
assert.equal(
|
||||
JSON.parse(npmInstall.stdout).installation.currentRevision,
|
||||
source.includes("@paseo-fixture") ? "2.0.0" : "1.1.0",
|
||||
);
|
||||
const npmDisabled = await context.paseo(["plugin", "disable", "npm-review", "--json"]);
|
||||
assert.equal(npmDisabled.exitCode, 0, npmDisabled.stderr);
|
||||
const restart = await context.paseo(["daemon", "restart", "--timeout", "45", "--json"], {
|
||||
timeout: 60_000,
|
||||
});
|
||||
assert.equal(restart.exitCode, 0, restart.stderr);
|
||||
assert.notEqual(
|
||||
JSON.parse(restart.stdout).workerPid,
|
||||
JSON.parse(restart.stdout).previousWorkerPid,
|
||||
);
|
||||
const persisted = await context.paseo(["plugin", "ls", "npm-review", "--json"]);
|
||||
assert.equal(persisted.exitCode, 0, persisted.stderr);
|
||||
assert.equal(JSON.parse(persisted.stdout)[0].status, "disabled");
|
||||
assert.equal(JSON.parse(persisted.stdout)[0].path, JSON.parse(npmInstall.stdout).path);
|
||||
assert.deepEqual(
|
||||
JSON.parse(persisted.stdout)[0].installation,
|
||||
JSON.parse(npmInstall.stdout).installation,
|
||||
);
|
||||
const npmEnabled = await context.paseo(["plugin", "enable", "npm-review", "--json"]);
|
||||
assert.equal(npmEnabled.exitCode, 0, npmEnabled.stderr);
|
||||
assert.equal(JSON.parse(npmEnabled.stdout).status, "running");
|
||||
const npmReload = await context.paseo(["plugin", "reload", "npm-review", "--json"]);
|
||||
assert.equal(npmReload.exitCode, 0, npmReload.stderr);
|
||||
const npmRemove = await context.paseo(["plugin", "remove", "npm-review", "--json"]);
|
||||
assert.equal(npmRemove.exitCode, 0, npmRemove.stderr);
|
||||
}
|
||||
const list = await context.paseo(["plugin", "ls", "--json"]);
|
||||
assert.equal(list.exitCode, 0, list.stderr);
|
||||
assert.deepEqual(JSON.parse(list.stdout), []);
|
||||
} finally {
|
||||
await context.stop();
|
||||
await registry.close();
|
||||
await rm(directory, { recursive: true, force: true });
|
||||
await rm(gitDirectory, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user