Skip to content

Commit a0fcb91

Browse files
committed
fix(release): keep private test helpers out of npm pack
1 parent 2d8cebb commit a0fcb91

7 files changed

Lines changed: 41 additions & 18 deletions

scripts/check-plugin-sdk-exports.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import { readFileSync, existsSync } from "node:fs";
1212
import { resolve, dirname } from "node:path";
1313
import { fileURLToPath, pathToFileURL } from "node:url";
14-
import { pluginSdkSubpaths } from "./lib/plugin-sdk-entries.mjs";
14+
import { publicPluginSdkSubpaths } from "./lib/plugin-sdk-entries.mjs";
1515

1616
const scriptDir = dirname(fileURLToPath(import.meta.url));
1717
const distFile = resolve(scriptDir, "..", "dist", "plugin-sdk", "index.js");
@@ -70,7 +70,7 @@ for (const name of requiredExports) {
7070
}
7171
}
7272

73-
for (const entry of pluginSdkSubpaths) {
73+
for (const entry of publicPluginSdkSubpaths) {
7474
const jsPath = resolve(scriptDir, "..", "dist", "plugin-sdk", `${entry}.js`);
7575
const dtsPath = resolve(scriptDir, "..", "dist", "plugin-sdk", `${entry}.d.ts`);
7676
if (!existsSync(jsPath)) {

scripts/lib/bundled-plugin-build-entries.mjs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ const TOP_LEVEL_PUBLIC_SURFACE_EXTENSIONS = new Set([".ts", ".js", ".mts", ".cts
1212
export const NON_PACKAGED_BUNDLED_PLUGIN_DIRS = new Set(["qa-channel", "qa-lab", "qa-matrix"]);
1313
const EXCLUDED_CORE_BUNDLED_PLUGIN_DIRS = new Set(["qqbot", "whatsapp"]);
1414
const BUNDLED_PLUGIN_BUILD_IDS_ENV = "OPENCLAW_BUNDLED_PLUGIN_BUILD_IDS";
15+
const TOP_LEVEL_PRIVATE_TEST_SURFACE_RE =
16+
/(?:^|[._-])(?:test|spec|test-support|test-helpers|test-fixtures|test-harness|mock-setup)(?:[._-]|$)/u;
1517
const toPosixPath = (value) => value.replaceAll("\\", "/");
1618

1719
function parseBundledPluginBuildIdFilter(env = process.env) {
@@ -88,8 +90,7 @@ export function collectTopLevelPublicSurfaceEntries(pluginDir) {
8890
if (
8991
normalizedName.endsWith(".d.ts") ||
9092
/^config-api\.(?:[cm]?[jt]s)$/u.test(normalizedName) ||
91-
normalizedName.includes(".test.") ||
92-
normalizedName.includes(".spec.") ||
93+
TOP_LEVEL_PRIVATE_TEST_SURFACE_RE.test(normalizedName) ||
9394
normalizedName.includes(".fixture.") ||
9495
normalizedName.includes(".snap")
9596
) {
@@ -117,8 +118,7 @@ function collectTopLevelPublicSurfaceEntriesFromFiles(relativeFiles) {
117118
if (
118119
normalizedName.endsWith(".d.ts") ||
119120
/^config-api\.(?:[cm]?[jt]s)$/u.test(normalizedName) ||
120-
normalizedName.includes(".test.") ||
121-
normalizedName.includes(".spec.") ||
121+
TOP_LEVEL_PRIVATE_TEST_SURFACE_RE.test(normalizedName) ||
122122
normalizedName.includes(".fixture.") ||
123123
normalizedName.includes(".snap")
124124
) {

scripts/lib/plugin-sdk-entries.d.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const publicPluginSdkSubpaths: string[];
66
export const deprecatedPublicPluginSdkEntrypoints: string[];
77
export const deprecatedBarrelPluginSdkEntrypoints: string[];
88

9-
export function buildPluginSdkEntrySources(): Record<string, string>;
9+
export function buildPluginSdkEntrySources(entries?: readonly string[]): Record<string, string>;
1010
export function buildPluginSdkPackageExports(): Record<
1111
string,
1212
{

scripts/lib/plugin-sdk-entries.mjs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,8 @@ export const deprecatedBarrelPluginSdkEntrypoints = pluginSdkSubpaths.filter((en
3333
deprecatedBarrelPluginSdkSubpathList.includes(entry),
3434
);
3535

36-
export function buildPluginSdkEntrySources() {
37-
return Object.fromEntries(
38-
pluginSdkEntrypoints.map((entry) => [entry, `src/plugin-sdk/${entry}.ts`]),
39-
);
36+
export function buildPluginSdkEntrySources(entries = pluginSdkEntrypoints) {
37+
return Object.fromEntries(entries.map((entry) => [entry, `src/plugin-sdk/${entry}.ts`]));
4038
}
4139

4240
export function buildPluginSdkPackageExports() {

scripts/write-plugin-sdk-entry-dts.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import fs from "node:fs";
22
import os from "node:os";
33
import path from "node:path";
44
import { build } from "tsdown";
5-
import { buildPluginSdkEntrySources, pluginSdkEntrypoints } from "./lib/plugin-sdk-entries.mjs";
5+
import {
6+
buildPluginSdkEntrySources,
7+
pluginSdkEntrypoints,
8+
publicPluginSdkEntrypoints,
9+
} from "./lib/plugin-sdk-entries.mjs";
610

711
const RUNTIME_SHIMS: Partial<Record<string, string>> = {
812
"webhook-path": [
@@ -67,14 +71,19 @@ function copyFlatDeclarations(fromDir: string, toDir: string): void {
6771

6872
const distPluginSdkDir = path.join(process.cwd(), "dist/plugin-sdk");
6973
const flatDeclarationTempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-plugin-sdk-dts-"));
74+
const shouldBuildPrivateQaEntries = process.env.OPENCLAW_BUILD_PRIVATE_QA === "1";
75+
const flatDeclarationEntrypoints = shouldBuildPrivateQaEntries
76+
? pluginSdkEntrypoints
77+
: publicPluginSdkEntrypoints;
78+
const flatDeclarationEntrypointSet = new Set(flatDeclarationEntrypoints);
7079

7180
try {
7281
await build({
7382
clean: true,
7483
config: false,
7584
deps: { neverBundle: (id) => isBareImportSpecifier(id) },
7685
dts: true,
77-
entry: buildPluginSdkEntrySources(),
86+
entry: buildPluginSdkEntrySources(flatDeclarationEntrypoints),
7887
failOnWarn: false,
7988
fixedExtension: false,
8089
format: "esm",
@@ -96,6 +105,10 @@ try {
96105
// The private workspace package keeps source-shaped declaration paths for local
97106
// package-boundary projects, so bridge them back to the packaged flat entries.
98107
for (const entry of pluginSdkEntrypoints) {
108+
if (!flatDeclarationEntrypointSet.has(entry)) {
109+
continue;
110+
}
111+
99112
const packageTypeOut = path.join(
100113
process.cwd(),
101114
`packages/plugin-sdk/dist/src/plugin-sdk/${entry}.d.ts`,

test/scripts/bundled-plugin-build-entries.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ describe("bundled plugin build entries", () => {
103103
expect(entries["extensions/telegram/telegram-ingress-worker.runtime"]).toBeUndefined();
104104
});
105105

106+
it("keeps top-level bundled plugin test helpers out of public-surface entries", () => {
107+
const entries = listBundledPluginBuildEntries();
108+
109+
expect(entries["extensions/browser/test-support"]).toBeUndefined();
110+
});
111+
106112
it("discovers repo plugin build entries without directory scans", () => {
107113
const payload = expectNoNodeFsScans<{
108114
artifacts: number;

tsdown.config.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import {
55
collectBundledPluginBuildEntries,
66
NON_PACKAGED_BUNDLED_PLUGIN_DIRS,
77
} from "./scripts/lib/bundled-plugin-build-entries.mjs";
8-
import { buildPluginSdkEntrySources } from "./scripts/lib/plugin-sdk-entries.mjs";
8+
import {
9+
buildPluginSdkEntrySources,
10+
pluginSdkEntrypoints,
11+
publicPluginSdkEntrypoints,
12+
} from "./scripts/lib/plugin-sdk-entries.mjs";
913

1014
type InputOptionsFactory = Extract<NonNullable<UserConfig["inputOptions"]>, Function>;
1115
type InputOptionsArg = InputOptionsFactory extends (
@@ -140,6 +144,9 @@ function nodeBuildConfig(config: UserConfig): UserConfig {
140144

141145
const bundledPluginBuildEntries = collectBundledPluginBuildEntries();
142146
const shouldBuildPrivateQaEntries = process.env.OPENCLAW_BUILD_PRIVATE_QA === "1";
147+
const productionPluginSdkEntrypoints = shouldBuildPrivateQaEntries
148+
? pluginSdkEntrypoints
149+
: publicPluginSdkEntrypoints;
143150

144151
function buildBundledHookEntries(): Record<string, string> {
145152
const hooksRoot = path.join(process.cwd(), "src", "hooks", "bundled");
@@ -357,10 +364,9 @@ function buildUnifiedDistEntries(): Record<string, string> {
357364
// Private bundled Codex helper for app-server user MCP config projection.
358365
"plugin-sdk/codex-mcp-projection": "src/plugin-sdk/codex-mcp-projection.ts",
359366
...Object.fromEntries(
360-
Object.entries(buildPluginSdkEntrySources()).map(([entry, source]) => [
361-
`plugin-sdk/${entry}`,
362-
source,
363-
]),
367+
Object.entries(buildPluginSdkEntrySources(productionPluginSdkEntrypoints)).map(
368+
([entry, source]) => [`plugin-sdk/${entry}`, source],
369+
),
364370
),
365371
...(shouldBuildPrivateQaEntries
366372
? {

0 commit comments

Comments
 (0)