build: fix bundled plugin runtime mirror guard

This commit is contained in:
Peter Steinberger
2026-04-23 04:15:39 +01:00
parent 87c6aaff3e
commit ff260ce67b
2 changed files with 54 additions and 21 deletions

View File

@@ -2,11 +2,6 @@ import fs from "node:fs";
import path from "node:path";
const JS_EXTENSIONS = new Set([".cjs", ".js", ".mjs"]);
const CURATED_ROOT_RUNTIME_MIRRORS = new Set([
"@matrix-org/matrix-sdk-crypto-nodejs",
"@matrix-org/matrix-sdk-crypto-wasm",
]);
export function collectRuntimeDependencySpecs(packageJson = {}) {
return new Map(
[
@@ -151,8 +146,12 @@ function extractModuleSpecifiers(source) {
return specifiers;
}
function isPluginOwnedDistImporter(relativePath, pluginIds) {
return pluginIds.some((pluginId) => relativePath.startsWith(`extensions/${pluginId}/`));
function isPluginOwnedDistImporter(relativePath, source, pluginIds) {
return pluginIds.some(
(pluginId) =>
relativePath.startsWith(`extensions/${pluginId}/`) ||
source.includes(`//#region extensions/${pluginId}/`),
);
}
export function collectRootDistBundledRuntimeMirrors(params) {
@@ -160,18 +159,6 @@ export function collectRootDistBundledRuntimeMirrors(params) {
const bundledSpecs = params.bundledRuntimeDependencySpecs;
const mirrors = new Map();
for (const dependencyName of CURATED_ROOT_RUNTIME_MIRRORS) {
const bundledSpec = bundledSpecs.get(dependencyName);
if (!bundledSpec) {
continue;
}
mirrors.set(dependencyName, {
importers: new Set(["<curated root runtime surface>"]),
pluginIds: bundledSpec.pluginIds,
spec: bundledSpec.spec,
});
}
for (const filePath of walkJavaScriptFiles(distDir)) {
const source = fs.readFileSync(filePath, "utf8");
const relativePath = path.relative(distDir, filePath).replaceAll(path.sep, "/");
@@ -181,7 +168,7 @@ export function collectRootDistBundledRuntimeMirrors(params) {
continue;
}
const bundledSpec = bundledSpecs.get(dependencyName);
if (isPluginOwnedDistImporter(relativePath, bundledSpec.pluginIds)) {
if (isPluginOwnedDistImporter(relativePath, source, bundledSpec.pluginIds)) {
continue;
}
const existing = mirrors.get(dependencyName);

View File

@@ -168,6 +168,7 @@ describe("collectInstalledMirroredRootDependencyManifestErrors", () => {
function writeSlackWebApiProbePackage(params: {
root: string;
importerSource?: string;
importerPath?: string;
rootDependencies?: Record<string, string>;
rootOptionalDependencies?: Record<string, string>;
@@ -184,7 +185,11 @@ describe("collectInstalledMirroredRootDependencyManifestErrors", () => {
});
const importerPath = params.importerPath ?? "dist/probe-Cz2PiFtC.js";
mkdirSync(join(params.root, "dist"), { recursive: true });
writeFileSync(join(params.root, importerPath), 'import("@slack/web-api");\n', "utf8");
writeFileSync(
join(params.root, importerPath),
params.importerSource ?? 'import("@slack/web-api");\n',
"utf8",
);
}
it("flags bundled plugin deps imported by root dist when root mirrors are missing", () => {
@@ -216,6 +221,47 @@ describe("collectInstalledMirroredRootDependencyManifestErrors", () => {
}
});
it("allows bundled plugin deps imported from root chunks sourced from their extension", () => {
const packageRoot = makeInstalledPackageRoot();
try {
writeSlackWebApiProbePackage({
root: packageRoot,
importerSource: '//#region extensions/slack/client.ts\nimport("@slack/web-api");\n',
});
expect(collectInstalledMirroredRootDependencyManifestErrors(packageRoot)).toEqual([]);
} finally {
rmSync(packageRoot, { recursive: true, force: true });
}
});
it("does not require root mirrors for extension-only Matrix crypto deps", () => {
const packageRoot = makeInstalledPackageRoot();
try {
writePackageFile(packageRoot, "package.json", {
version: "2026.4.10",
dependencies: {},
});
writePackageFile(packageRoot, "dist/extensions/matrix/package.json", {
dependencies: {
"@matrix-org/matrix-sdk-crypto-nodejs": "^0.4.0",
"@matrix-org/matrix-sdk-crypto-wasm": "18.1.0",
},
});
writeFileSync(
join(packageRoot, "dist/extensions/matrix/crypto-node.runtime.js"),
'require("@matrix-org/matrix-sdk-crypto-nodejs");\n',
"utf8",
);
expect(collectInstalledMirroredRootDependencyManifestErrors(packageRoot)).toEqual([]);
} finally {
rmSync(packageRoot, { recursive: true, force: true });
}
});
it("accepts mirrored root dependencies declared in package optionalDependencies", () => {
const packageRoot = makeInstalledPackageRoot();