mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 17:40:44 +00:00
build: exclude private QA from npm package
This commit is contained in:
@@ -5,6 +5,10 @@ import { mkdtempSync, mkdirSync, readdirSync, readFileSync, rmSync } from "node:
|
||||
import { tmpdir } from "node:os";
|
||||
import { join, resolve } from "node:path";
|
||||
import { pathToFileURL } from "node:url";
|
||||
import {
|
||||
PACKAGE_DIST_INVENTORY_RELATIVE_PATH,
|
||||
writePackageDistInventory,
|
||||
} from "../src/infra/package-dist-inventory.ts";
|
||||
import {
|
||||
collectBundledExtensionManifestErrors,
|
||||
type BundledExtension,
|
||||
@@ -38,13 +42,13 @@ type PackFile = { path: string };
|
||||
type PackResult = { files?: PackFile[]; filename?: string; unpackedSize?: number };
|
||||
|
||||
const requiredPathGroups = [
|
||||
PACKAGE_DIST_INVENTORY_RELATIVE_PATH,
|
||||
["dist/index.js", "dist/index.mjs"],
|
||||
["dist/entry.js", "dist/entry.mjs"],
|
||||
...listPluginSdkDistArtifacts(),
|
||||
...listBundledPluginPackArtifacts(),
|
||||
...listStaticExtensionAssetOutputs(),
|
||||
...WORKSPACE_TEMPLATE_PACK_PATHS,
|
||||
...listRequiredQaScenarioPackPaths(),
|
||||
"scripts/npm-runner.mjs",
|
||||
"scripts/preinstall-package-manager-warning.mjs",
|
||||
"scripts/postinstall-bundled-plugins.mjs",
|
||||
@@ -57,21 +61,27 @@ const requiredPathGroups = [
|
||||
const forbiddenPrefixes = [
|
||||
"dist-runtime/",
|
||||
"dist/OpenClaw.app/",
|
||||
"dist/extensions/qa-lab/",
|
||||
"dist/plugin-sdk/extensions/qa-lab/",
|
||||
"dist/plugin-sdk/qa-lab.",
|
||||
"dist/plugin-sdk/qa-runtime.",
|
||||
"dist/plugin-sdk/src/plugin-sdk/qa-lab.d.ts",
|
||||
"dist/plugin-sdk/src/plugin-sdk/qa-runtime.d.ts",
|
||||
"dist/qa-runtime-",
|
||||
"dist/plugin-sdk/.tsbuildinfo",
|
||||
"docs/.generated/",
|
||||
"qa/",
|
||||
];
|
||||
const forbiddenPrivateQaContentMarkers = [
|
||||
"//#region extensions/qa-lab/",
|
||||
"qa-lab/cli.js",
|
||||
"qa-lab/runtime-api.js",
|
||||
] as const;
|
||||
const forbiddenPrivateQaContentScanPrefixes = ["dist/"] as const;
|
||||
const appcastPath = resolve("appcast.xml");
|
||||
const laneBuildMin = 1_000_000_000;
|
||||
const laneFloorAdoptionDateKey = 20260227;
|
||||
|
||||
export function listRequiredQaScenarioPackPaths(): string[] {
|
||||
const scenariosDir = resolve("qa/scenarios");
|
||||
return readdirSync(scenariosDir, { withFileTypes: true })
|
||||
.filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
|
||||
.map((entry) => `qa/scenarios/${entry.name}`)
|
||||
.toSorted((left, right) => left.localeCompare(right));
|
||||
}
|
||||
|
||||
function collectBundledExtensions(): BundledExtension[] {
|
||||
const extensionsDir = resolve("extensions");
|
||||
const entries = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) =>
|
||||
@@ -269,6 +279,30 @@ export function collectForbiddenPackPaths(paths: Iterable<string>): string[] {
|
||||
.toSorted((left, right) => left.localeCompare(right));
|
||||
}
|
||||
|
||||
export function collectForbiddenPackContentPaths(
|
||||
paths: Iterable<string>,
|
||||
rootDir = process.cwd(),
|
||||
): string[] {
|
||||
const textPathPattern = /\.(?:[cm]?js|d\.ts|json|md|mjs|cjs)$/u;
|
||||
return [...paths]
|
||||
.filter((packedPath) => {
|
||||
if (!forbiddenPrivateQaContentScanPrefixes.some((prefix) => packedPath.startsWith(prefix))) {
|
||||
return false;
|
||||
}
|
||||
if (!textPathPattern.test(packedPath)) {
|
||||
return false;
|
||||
}
|
||||
let content: string;
|
||||
try {
|
||||
content = readFileSync(resolve(rootDir, packedPath), "utf8");
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
return forbiddenPrivateQaContentMarkers.some((marker) => content.includes(marker));
|
||||
})
|
||||
.toSorted((left, right) => left.localeCompare(right));
|
||||
}
|
||||
|
||||
export { collectPackUnpackedSizeErrors } from "./lib/npm-pack-budget.mjs";
|
||||
|
||||
function extractTag(item: string, tag: string): string | null {
|
||||
@@ -430,6 +464,7 @@ async function main() {
|
||||
checkAppcastSparkleVersions();
|
||||
await checkPluginSdkExports();
|
||||
checkBundledExtensionMetadata();
|
||||
await writePackageDistInventory(process.cwd());
|
||||
|
||||
const results = runPackDry();
|
||||
const files = results.flatMap((entry) => entry.files ?? []);
|
||||
@@ -444,9 +479,15 @@ async function main() {
|
||||
})
|
||||
.toSorted((left, right) => left.localeCompare(right));
|
||||
const forbidden = collectForbiddenPackPaths(paths);
|
||||
const forbiddenContent = collectForbiddenPackContentPaths(paths);
|
||||
const sizeErrors = collectNpmPackUnpackedSizeErrors(results);
|
||||
|
||||
if (missing.length > 0 || forbidden.length > 0 || sizeErrors.length > 0) {
|
||||
if (
|
||||
missing.length > 0 ||
|
||||
forbidden.length > 0 ||
|
||||
forbiddenContent.length > 0 ||
|
||||
sizeErrors.length > 0
|
||||
) {
|
||||
if (missing.length > 0) {
|
||||
console.error("release-check: missing files in npm pack:");
|
||||
for (const path of missing) {
|
||||
@@ -471,6 +512,12 @@ async function main() {
|
||||
console.error(` - ${path}`);
|
||||
}
|
||||
}
|
||||
if (forbiddenContent.length > 0) {
|
||||
console.error("release-check: forbidden private QA markers in npm pack:");
|
||||
for (const path of forbiddenContent) {
|
||||
console.error(` - ${path}`);
|
||||
}
|
||||
}
|
||||
if (sizeErrors.length > 0) {
|
||||
console.error("release-check: npm pack unpacked size budget exceeded:");
|
||||
for (const error of sizeErrors) {
|
||||
|
||||
Reference in New Issue
Block a user