refactor(plugin-sdk): centralize entrypoint manifest

This commit is contained in:
Peter Steinberger
2026-03-16 01:32:47 +00:00
parent 92e765cdee
commit 59940cb3ee
11 changed files with 150 additions and 414 deletions

View File

@@ -4,68 +4,15 @@ import path from "node:path";
import { pathToFileURL } from "node:url";
import { build } from "tsdown";
import { describe, expect, it } from "vitest";
import {
buildPluginSdkEntrySources,
buildPluginSdkPackageExports,
buildPluginSdkSpecifiers,
pluginSdkEntrypoints,
} from "../../scripts/lib/plugin-sdk-entries.mjs";
import * as sdk from "./index.js";
const pluginSdkEntrypoints = [
"index",
"core",
"compat",
"telegram",
"discord",
"slack",
"signal",
"imessage",
"whatsapp",
"line",
"msteams",
"acpx",
"bluebubbles",
"copilot-proxy",
"device-pair",
"diagnostics-otel",
"diffs",
"feishu",
"googlechat",
"irc",
"llm-task",
"lobster",
"matrix",
"mattermost",
"memory-core",
"memory-lancedb",
"minimax-portal-auth",
"nextcloud-talk",
"nostr",
"open-prose",
"phone-control",
"qwen-portal-auth",
"synology-chat",
"talk-voice",
"test-utils",
"thread-ownership",
"tlon",
"twitch",
"voice-call",
"zalo",
"zalouser",
"account-id",
"keyed-async-queue",
] as const;
const pluginSdkSpecifiers = pluginSdkEntrypoints.map((entry) =>
entry === "index" ? "openclaw/plugin-sdk" : `openclaw/plugin-sdk/${entry}`,
);
function buildPluginSdkPackageExports() {
return Object.fromEntries(
pluginSdkEntrypoints.map((entry) => [
entry === "index" ? "./plugin-sdk" : `./plugin-sdk/${entry}`,
{
default: `./dist/plugin-sdk/${entry}.js`,
},
]),
);
}
const pluginSdkSpecifiers = buildPluginSdkSpecifiers();
describe("plugin-sdk exports", () => {
it("does not expose runtime modules", () => {
@@ -180,9 +127,7 @@ describe("plugin-sdk exports", () => {
clean: true,
config: false,
dts: false,
entry: Object.fromEntries(
pluginSdkEntrypoints.map((entry) => [entry, `src/plugin-sdk/${entry}.ts`]),
),
entry: buildPluginSdkEntrySources(),
env: { NODE_ENV: "production" },
fixedExtension: false,
logLevel: "error",
@@ -237,4 +182,16 @@ describe("plugin-sdk exports", () => {
await fs.rm(fixtureDir, { recursive: true, force: true });
}
});
it("keeps package.json plugin-sdk exports synced with the manifest", async () => {
const packageJsonPath = path.join(process.cwd(), "package.json");
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf8")) as {
exports?: Record<string, unknown>;
};
const currentPluginSdkExports = Object.fromEntries(
Object.entries(packageJson.exports ?? {}).filter(([key]) => key.startsWith("./plugin-sdk")),
);
expect(currentPluginSdkExports).toEqual(buildPluginSdkPackageExports());
});
});

View File

@@ -9,42 +9,14 @@ import * as slackSdk from "openclaw/plugin-sdk/slack";
import * as telegramSdk from "openclaw/plugin-sdk/telegram";
import * as whatsappSdk from "openclaw/plugin-sdk/whatsapp";
import { describe, expect, it } from "vitest";
import { pluginSdkSubpaths } from "../../scripts/lib/plugin-sdk-entries.mjs";
const bundledExtensionSubpathLoaders = [
{ id: "acpx", load: () => import("openclaw/plugin-sdk/acpx") },
{ id: "bluebubbles", load: () => import("openclaw/plugin-sdk/bluebubbles") },
{ id: "copilot-proxy", load: () => import("openclaw/plugin-sdk/copilot-proxy") },
{ id: "device-pair", load: () => import("openclaw/plugin-sdk/device-pair") },
{ id: "diagnostics-otel", load: () => import("openclaw/plugin-sdk/diagnostics-otel") },
{ id: "diffs", load: () => import("openclaw/plugin-sdk/diffs") },
{ id: "feishu", load: () => import("openclaw/plugin-sdk/feishu") },
{ id: "googlechat", load: () => import("openclaw/plugin-sdk/googlechat") },
{ id: "irc", load: () => import("openclaw/plugin-sdk/irc") },
{ id: "llm-task", load: () => import("openclaw/plugin-sdk/llm-task") },
{ id: "lobster", load: () => import("openclaw/plugin-sdk/lobster") },
{ id: "matrix", load: () => import("openclaw/plugin-sdk/matrix") },
{ id: "mattermost", load: () => import("openclaw/plugin-sdk/mattermost") },
{ id: "memory-core", load: () => import("openclaw/plugin-sdk/memory-core") },
{ id: "memory-lancedb", load: () => import("openclaw/plugin-sdk/memory-lancedb") },
{
id: "minimax-portal-auth",
load: () => import("openclaw/plugin-sdk/minimax-portal-auth"),
},
{ id: "nextcloud-talk", load: () => import("openclaw/plugin-sdk/nextcloud-talk") },
{ id: "nostr", load: () => import("openclaw/plugin-sdk/nostr") },
{ id: "open-prose", load: () => import("openclaw/plugin-sdk/open-prose") },
{ id: "phone-control", load: () => import("openclaw/plugin-sdk/phone-control") },
{ id: "qwen-portal-auth", load: () => import("openclaw/plugin-sdk/qwen-portal-auth") },
{ id: "synology-chat", load: () => import("openclaw/plugin-sdk/synology-chat") },
{ id: "talk-voice", load: () => import("openclaw/plugin-sdk/talk-voice") },
{ id: "test-utils", load: () => import("openclaw/plugin-sdk/test-utils") },
{ id: "thread-ownership", load: () => import("openclaw/plugin-sdk/thread-ownership") },
{ id: "tlon", load: () => import("openclaw/plugin-sdk/tlon") },
{ id: "twitch", load: () => import("openclaw/plugin-sdk/twitch") },
{ id: "voice-call", load: () => import("openclaw/plugin-sdk/voice-call") },
{ id: "zalo", load: () => import("openclaw/plugin-sdk/zalo") },
{ id: "zalouser", load: () => import("openclaw/plugin-sdk/zalouser") },
] as const;
const importPluginSdkSubpath = (specifier: string) => import(/* @vite-ignore */ specifier);
const bundledExtensionSubpathLoaders = pluginSdkSubpaths.map((id) => ({
id,
load: () => importPluginSdkSubpath(`openclaw/plugin-sdk/${id}`),
}));
describe("plugin-sdk subpath exports", () => {
it("exports compat helpers", () => {