






















@@ -462,11 +462,17 @@ function normalizeNpmVersionDrift(lockfile) {
462462return lockfile;
463463}
464464465-function generateShrinkwrap(packageDir) {
465+function generateShrinkwrap(packageDir, options = {}) {
466466const tempDir = mkdtempSync(path.join(tmpdir(), "openclaw-shrinkwrap-"));
467467try {
468468const packageJson = JSON.parse(readFileSync(path.join(packageDir, "package.json"), "utf8"));
469-const shrinkwrapOverrides = readShrinkwrapOverrides();
469+const shrinkwrapOverrides = mergeOverrides(
470+options.useCurrentShrinkwrapOverrides
471+ ? readCurrentShrinkwrapOverrides(packageDir, declaredPackageDependencies(packageJson))
472+ : {},
473+readShrinkwrapOverrides(),
474+{},
475+);
470476const npmInstallArgs = [
471477"install",
472478"--package-lock-only",
@@ -516,6 +522,73 @@ function collectPnpmLockViolations(shrinkwrap, pnpmLockPackages = readPnpmLockPa
516522return violations;
517523}
518524525+function declaredPackageDependencies(packageJson) {
526+const dependencies = new Set();
527+for (const key of ["dependencies", "optionalDependencies", "peerDependencies"]) {
528+const values = packageJson?.[key];
529+if (!values || typeof values !== "object" || Array.isArray(values)) {
530+continue;
531+}
532+for (const dependencyName of Object.keys(values)) {
533+dependencies.add(dependencyName);
534+}
535+}
536+return dependencies;
537+}
538+539+function collectCurrentShrinkwrapOverrides(
540+shrinkwrap,
541+declaredDependencies = new Set(),
542+pnpmLockPackages = readPnpmLockPackages(),
543+) {
544+const packages = shrinkwrap?.packages;
545+if (!packages || typeof packages !== "object") {
546+return {};
547+}
548+const versionsByName = new Map();
549+for (const [lockPath, metadata] of Object.entries(packages)) {
550+if (lockPath === "" || !metadata || typeof metadata !== "object" || !metadata.version) {
551+continue;
552+}
553+const packageName = metadata.name ?? parseLockPackagePath(lockPath).at(-1)?.name;
554+if (
555+!packageName ||
556+declaredDependencies.has(packageName) ||
557+!pnpmLockPackages.has(`${packageName}@${metadata.version}`)
558+) {
559+continue;
560+}
561+const versions = versionsByName.get(packageName) ?? new Set();
562+versions.add(metadata.version);
563+versionsByName.set(packageName, versions);
564+}
565+return Object.fromEntries(
566+[...versionsByName.entries()]
567+.filter(([, versions]) => versions.size === 1)
568+.map(([name, versions]) => [name, [...versions][0]])
569+.toSorted(([left], [right]) => left.localeCompare(right)),
570+);
571+}
572+573+function readCurrentShrinkwrapOverrides(
574+packageDir,
575+declaredDependencies = new Set(),
576+pnpmLockPackages = readPnpmLockPackages(),
577+) {
578+try {
579+return collectCurrentShrinkwrapOverrides(
580+JSON.parse(readFileSync(shrinkwrapPathForPackage(packageDir), "utf8")),
581+declaredDependencies,
582+pnpmLockPackages,
583+);
584+} catch (error) {
585+if (error?.code === "ENOENT") {
586+return {};
587+}
588+throw error;
589+}
590+}
591+519592function assertShrinkwrapMatchesPnpmLock(shrinkwrap) {
520593const violations = collectPnpmLockViolations(shrinkwrap);
521594if (violations.length === 0) {
@@ -610,6 +683,41 @@ function shrinkwrapPackageDirsForChangedPaths(changedPaths) {
610683);
611684}
612685686+function normalizeChangedPath(rawPath) {
687+return String(rawPath ?? "")
688+.trim()
689+.replaceAll("\\", "/")
690+.replace(/^\.\/+/u, "");
691+}
692+693+function packageDependencyInputsChanged(packageDir, changedPaths) {
694+const relativePackageDir = packageLabel(packageDir);
695+const packageManifestPath =
696+relativePackageDir === "." ? "package.json" : `${relativePackageDir}/package.json`;
697+const shrinkwrapPath =
698+relativePackageDir === "."
699+ ? "npm-shrinkwrap.json"
700+ : `${relativePackageDir}/npm-shrinkwrap.json`;
701+return changedPaths.some((rawPath) => {
702+const changedPath = normalizeChangedPath(rawPath);
703+return (
704+changedPath === "pnpm-lock.yaml" ||
705+changedPath === "pnpm-workspace.yaml" ||
706+changedPath === "scripts/generate-npm-shrinkwrap.mjs" ||
707+changedPath === packageManifestPath ||
708+changedPath === shrinkwrapPath
709+);
710+});
711+}
712+713+function listCheckChangedPaths() {
714+try {
715+return listChangedPathsFromGit({ base: "origin/main", head: "HEAD" });
716+} catch {
717+return [];
718+}
719+}
720+613721function resolvePackageDirs(args) {
614722const packageDirs = [];
615723const check = args.includes("--check");
@@ -664,6 +772,7 @@ function resolvePackageDirs(args) {
664772if (all) {
665773return {
666774 check,
775+changedPaths: check ? listCheckChangedPaths() : [],
667776packageDirs: [
668777ROOT_DIR,
669778 ...listPublishablePluginPackageDirs().map((dir) => path.resolve(ROOT_DIR, dir)),
@@ -673,6 +782,7 @@ function resolvePackageDirs(args) {
673782if (plugins) {
674783return {
675784 check,
785+changedPaths: check ? listCheckChangedPaths() : [],
676786packageDirs: listPublishablePluginPackageDirs().map((dir) => path.resolve(ROOT_DIR, dir)),
677787};
678788}
@@ -687,14 +797,22 @@ function resolvePackageDirs(args) {
687797});
688798return {
689799 check,
800+ changedPaths,
690801packageDirs: shrinkwrapPackageDirsForChangedPaths(changedPaths),
691802};
692803}
693-return { check, packageDirs: packageDirs.length > 0 ? packageDirs : [ROOT_DIR] };
804+return {
805+ check,
806+changedPaths: check ? listCheckChangedPaths() : [],
807+packageDirs: packageDirs.length > 0 ? packageDirs : [ROOT_DIR],
808+};
694809}
695810696-function updateOrCheckPackage(packageDir, check) {
697-const generated = generateShrinkwrap(packageDir);
811+function updateOrCheckPackage(packageDir, check, changedPaths = []) {
812+const generated = generateShrinkwrap(packageDir, {
813+useCurrentShrinkwrapOverrides:
814+check && !packageDependencyInputsChanged(packageDir, changedPaths),
815+});
698816const shrinkwrapPath = shrinkwrapPathForPackage(packageDir);
699817const label = packageLabel(packageDir);
700818if (!check) {
@@ -720,13 +838,13 @@ function updateOrCheckPackage(packageDir, check) {
720838}
721839722840function main() {
723-const { check, packageDirs } = resolvePackageDirs(process.argv.slice(2));
841+const { check, changedPaths, packageDirs } = resolvePackageDirs(process.argv.slice(2));
724842if (packageDirs.length === 0) {
725843process.stdout.write("No shrinkwrap-managed package changes detected.\n");
726844return;
727845}
728846for (const packageDir of packageDirs) {
729-updateOrCheckPackage(packageDir, check);
847+updateOrCheckPackage(packageDir, check, changedPaths);
730848}
731849}
732850@@ -740,6 +858,7 @@ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.me
740858}
741859742860export {
861+collectCurrentShrinkwrapOverrides,
743862collectOverrideViolations,
744863collectPnpmLockViolations,
745864disableShrinkwrappedOverrideConflictSources,
@@ -748,6 +867,7 @@ export {
748867applyPackageExtensionPeerMetadata,
749868normalizeNpmVersionDrift,
750869packageJsonForShrinkwrap,
870+packageDependencyInputsChanged,
751871pnpmLockOverrideVersionForVersions,
752872parsePnpmPackageKey,
753873parseLockPackagePath,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。