fix(plugins): invalidate runtime deps cache on package upgrade

This commit is contained in:
Peter Steinberger
2026-05-01 11:39:37 +01:00
parent f3d5c54884
commit 931e60723d
3 changed files with 215 additions and 1 deletions

View File

@@ -544,6 +544,72 @@ function setCachedPluginRegistry(cacheKey: string, state: CachedPluginState): vo
pluginLoaderCacheState.set(cacheKey, state);
}
function resolveBundledPackageRootForCache(stockRoot?: string): string | undefined {
if (!stockRoot) {
return undefined;
}
const resolved = path.resolve(stockRoot);
const parent = path.dirname(resolved);
if (
path.basename(resolved) === "extensions" &&
(path.basename(parent) === "dist" || path.basename(parent) === "dist-runtime")
) {
return path.dirname(parent);
}
const sourcePackageRoot = parent;
if (fs.existsSync(path.join(sourcePackageRoot, "package.json"))) {
return sourcePackageRoot;
}
return undefined;
}
function readPackageVersionForCache(packageJsonPath: string): string {
try {
const parsed = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")) as unknown;
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
return "unknown";
}
const version = (parsed as { version?: unknown }).version;
return typeof version === "string" && version.trim() ? version.trim() : "unknown";
} catch {
return "unknown";
}
}
function resolveBundledPackageCacheIdentity(stockRoot?: string):
| {
packageJson: string;
packageRoot: string;
packageVersion: string;
size: number;
mtimeMs: number;
}
| undefined {
const packageRoot = resolveBundledPackageRootForCache(stockRoot);
if (!packageRoot) {
return undefined;
}
const packageJsonPath = path.join(packageRoot, "package.json");
try {
const stat = fs.statSync(packageJsonPath);
return {
packageJson: safeRealpathOrResolve(packageJsonPath),
packageRoot: safeRealpathOrResolve(packageRoot),
packageVersion: readPackageVersionForCache(packageJsonPath),
size: stat.size,
mtimeMs: stat.mtimeMs,
};
} catch {
return {
packageJson: path.resolve(packageJsonPath),
packageRoot: safeRealpathOrResolve(packageRoot),
packageVersion: "missing",
size: -1,
mtimeMs: -1,
};
}
}
function buildCacheKey(params: {
workspaceDir?: string;
plugins: NormalizedPluginsConfig;
@@ -567,6 +633,7 @@ function buildCacheKey(params: {
loadPaths: params.plugins.loadPaths,
env: params.env,
});
const bundledPackage = resolveBundledPackageCacheIdentity(roots.stock);
const installs = Object.fromEntries(
Object.entries(params.installs ?? {}).map(([pluginId, install]) => [
pluginId,
@@ -600,6 +667,7 @@ function buildCacheKey(params: {
const gatewayMethodsKey = JSON.stringify(params.coreGatewayMethodNames ?? []);
const activationMode = params.activate === false ? "snapshot" : "active";
return `${roots.workspace ?? ""}::${roots.global ?? ""}::${roots.stock ?? ""}::${JSON.stringify({
bundledPackage,
...params.plugins,
installs,
loadPaths,