Skip to content

Commit 3951cce

Browse files
authored
feat: Always in-memory update package.json (#15732)
Update package.json contents in memory when checking for bundle build as platform version might have changed for instance. Fixes #15727
1 parent 7cb2241 commit 3951cce

File tree

3 files changed

+260
-229
lines changed

3 files changed

+260
-229
lines changed

flow-server/src/main/java/com/vaadin/flow/server/frontend/NodeUpdater.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,11 @@ private static <T extends JsonValue> T computeIfAbsent(
303303
return result;
304304
}
305305

306-
Map<String, String> getDefaultDependencies() {
306+
static Map<String, String> getDefaultDependencies() {
307307
return readDependencies("default", "dependencies");
308308
}
309309

310-
private Map<String, String> readDependencies(String id,
310+
private static Map<String, String> readDependencies(String id,
311311
String packageJsonKey) {
312312
try {
313313
Map<String, String> map = new HashMap<>();
@@ -319,16 +319,16 @@ private Map<String, String> readDependencies(String id,
319319

320320
return map;
321321
} catch (IOException e) {
322-
log().error(
322+
LoggerFactory.getLogger(NodeUpdater.class).error(
323323
"Unable to read " + packageJsonKey + " from '" + id + "'",
324324
e);
325325
return new HashMap<>();
326326
}
327327

328328
}
329329

330-
private JsonObject readPackageJson(String id) throws IOException {
331-
try (InputStream packageJson = getClass()
330+
private static JsonObject readPackageJson(String id) throws IOException {
331+
try (InputStream packageJson = NodeUpdater.class
332332
.getResourceAsStream("dependencies/" + id + "/package.json")) {
333333
JsonObject content = Json.parse(
334334
IOUtils.toString(packageJson, StandardCharsets.UTF_8));

flow-server/src/main/java/com/vaadin/flow/server/frontend/TaskRunDevBundleBuild.java

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ private static boolean hashAndBundleModulesEqual(JsonObject statsJson,
239239
String bundlePackageJsonHash = getStatsHash(statsJson);
240240

241241
if (packageJsonHash == null || packageJsonHash.isEmpty()) {
242-
getLogger().warn("No hash found for 'package.json'.");
242+
getLogger().error(
243+
"No hash found for 'package.json' even though one should always be generated!");
243244
return false;
244245
}
245246

@@ -309,6 +310,20 @@ private static boolean versionAccepted(String expected, String actual) {
309310
return expectedVersion.isEqualTo(actualVersion);
310311
}
311312

313+
/**
314+
* Get the package.json file from disk if available else generate in memory.
315+
* <p>
316+
* For the loaded file update versions as per in memory to get correct
317+
* application versions.
318+
*
319+
* @param options
320+
* the task options
321+
* @param frontendDependencies
322+
* frontend dependency scanner
323+
* @param finder
324+
* classfinder
325+
* @return package.json content as JsonObject
326+
*/
312327
private static JsonObject getPackageJson(Options options,
313328
FrontendDependenciesScanner frontendDependencies,
314329
ClassFinder finder) {
@@ -319,65 +334,47 @@ private static JsonObject getPackageJson(Options options,
319334
final JsonObject packageJson = Json
320335
.parse(FileUtils.readFileToString(packageJsonFile,
321336
StandardCharsets.UTF_8));
322-
if (!packageJson.hasKey(NodeUpdater.VAADIN_DEP_KEY)
323-
|| !packageJson.getObject(NodeUpdater.VAADIN_DEP_KEY)
324-
.hasKey(NodeUpdater.HASH_KEY)) {
325-
updatePackageJsonWithDefaultDependencies(options,
326-
frontendDependencies, finder, packageJson);
327-
}
328-
return packageJson;
337+
return getDefaultPackageJson(options, frontendDependencies,
338+
finder, packageJson);
329339
} catch (IOException e) {
330340
getLogger().warn("Failed to read package.json", e);
331341
}
332342
} else {
333343
JsonObject packageJson = getDefaultPackageJson(options,
334-
frontendDependencies, finder);
344+
frontendDependencies, finder, null);
335345
if (packageJson != null) {
336346
return packageJson;
337347
}
338348
}
339349
return null;
340350
}
341351

342-
private static void updatePackageJsonWithDefaultDependencies(
343-
Options options, FrontendDependenciesScanner frontendDependencies,
344-
ClassFinder finder, JsonObject packageJson) {
345-
// If we have executed flow:clean-frontend we will have an empty
346-
// package.json with no hash field.
347-
JsonObject defaultPackageJson = getDefaultPackageJson(options,
348-
frontendDependencies, finder);
349-
350-
// Add dependencies as it should be enough to have the expected
351-
// dependencies in the package.json
352-
final JsonObject defaultDependencies = defaultPackageJson
353-
.getObject(NodeUpdater.DEPENDENCIES);
354-
for (String key : defaultDependencies.keys()) {
355-
packageJson.getObject(NodeUpdater.DEPENDENCIES).put(key,
356-
defaultDependencies.getString(key));
357-
}
358-
359-
// Add hash to package.json so we don't fail just because it is missing
360-
final String hash = TaskUpdatePackages
361-
.generatePackageJsonHash(packageJson);
362-
if (!packageJson.hasKey(NodeUpdater.VAADIN_DEP_KEY)) {
363-
packageJson.put(NodeUpdater.VAADIN_DEP_KEY, Json.createObject());
364-
}
365-
packageJson.getObject(NodeUpdater.VAADIN_DEP_KEY)
366-
.put(NodeUpdater.HASH_KEY, hash);
367-
}
368-
369352
protected static JsonObject getDefaultPackageJson(Options options,
370353
FrontendDependenciesScanner frontendDependencies,
371-
ClassFinder finder) {
354+
ClassFinder finder, JsonObject packageJson) {
372355
NodeUpdater nodeUpdater = new NodeUpdater(finder, frontendDependencies,
373356
options) {
374357
@Override
375358
public void execute() {
376359
}
377360
};
378361
try {
379-
JsonObject packageJson = nodeUpdater.getPackageJson();
362+
if (packageJson == null) {
363+
packageJson = nodeUpdater.getPackageJson();
364+
}
365+
nodeUpdater.addVaadinDefaultsToJson(packageJson);
380366
nodeUpdater.updateDefaultDependencies(packageJson);
367+
368+
final Map<String, String> applicationDependencies = frontendDependencies
369+
.getPackages();
370+
371+
// Add application dependencies
372+
for (Map.Entry<String, String> dep : applicationDependencies
373+
.entrySet()) {
374+
nodeUpdater.addDependency(packageJson, NodeUpdater.DEPENDENCIES,
375+
dep.getKey(), dep.getValue());
376+
}
377+
381378
final String hash = TaskUpdatePackages
382379
.generatePackageJsonHash(packageJson);
383380
packageJson.getObject(NodeUpdater.VAADIN_DEP_KEY)

0 commit comments

Comments
 (0)