diff --git a/flow-build-tools/src/main/java/com/vaadin/flow/server/frontend/TaskUpdatePackages.java b/flow-build-tools/src/main/java/com/vaadin/flow/server/frontend/TaskUpdatePackages.java index 12526e4de9d..9a4afa246bf 100644 --- a/flow-build-tools/src/main/java/com/vaadin/flow/server/frontend/TaskUpdatePackages.java +++ b/flow-build-tools/src/main/java/com/vaadin/flow/server/frontend/TaskUpdatePackages.java @@ -157,9 +157,21 @@ boolean lockVersionForNpm(ObjectNode packageJson) throws IOException { // Already locked with a dependency reference, skip continue; } + // By the time the platform overrides are applied here, existing + // dependency versions are expected to be up-to-date already. + // So if there exists a dependency with a different version in + // package.json at this point, we assume it to be an explicit + // user opt-out. Skip such dependencies to avoid overriding them + // with a different version, both for "dependencies" + // and "devDependencies". if (dependencies.has(dependency) - || devDependencies.has(dependency)) { - // Skip platform overrides for existing dependencies + && !dependencies.get(dependency).asString() + .equals(frontendVersion.getFullVersion())) { + continue; + } + if (devDependencies.has(dependency) + && !devDependencies.get(dependency).asString() + .equals(frontendVersion.getFullVersion())) { continue; } // Lock with a version number diff --git a/flow-build-tools/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesNpmVersionLockingTest.java b/flow-build-tools/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesNpmVersionLockingTest.java index 4c4d5d943d0..c1a0a38ece0 100644 --- a/flow-build-tools/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesNpmVersionLockingTest.java +++ b/flow-build-tools/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesNpmVersionLockingTest.java @@ -137,6 +137,33 @@ void shouldNotUpdatesOverrides_whenHasUserModification() packageJson.get(OVERRIDES).get(TEST_DEPENDENCY).stringValue()); } + @Test + void shouldUpdatePlatformOverride_whenDependencyVersionBumped() + throws IOException { + TaskUpdatePackages packageUpdater = createPackageUpdater(); + + // Simulate existing platform override from a previous Flow version + ObjectNode packageJson = packageUpdater.getPackageJson(); + ObjectNode overridesSection = JacksonUtils.createObjectNode(); + packageJson.set(OVERRIDES, overridesSection); + + ((ObjectNode) packageJson.get(DEPENDENCIES)).put(TEST_DEPENDENCY, + PLATFORM_PINNED_DEPENDENCY_VERSION); + overridesSection.put(TEST_DEPENDENCY, "0.0.1"); + + // vaadin.overrides tracks what Flow last wrote + ObjectNode vaadinSection = (ObjectNode) packageJson.get(VAADIN_DEP_KEY); + vaadinSection.set(OVERRIDES, + JacksonUtils.createObjectNode().put(TEST_DEPENDENCY, "0.0.1")); + + packageUpdater.generateVersionsJson(packageJson); + packageUpdater.lockVersionForNpm(packageJson); + + // Override is updated to the new platform version + assertEquals(PLATFORM_PINNED_DEPENDENCY_VERSION, + packageJson.get(OVERRIDES).get(TEST_DEPENDENCY).stringValue()); + } + @Test void shouldUpdatesOverrides_whenNoVaadinOverrides_changingVersion() throws IOException {