45
45
import com .vaadin .flow .server .frontend .scanner .ClassFinder ;
46
46
import com .vaadin .flow .server .frontend .scanner .FrontendDependenciesScanner ;
47
47
48
+ import static com .vaadin .flow .server .frontend .VersionsJsonConverter .JS_VERSION ;
49
+ import static com .vaadin .flow .server .frontend .VersionsJsonConverter .NPM_NAME ;
50
+ import static com .vaadin .flow .server .frontend .VersionsJsonConverter .NPM_VERSION ;
51
+ import static com .vaadin .flow .server .frontend .VersionsJsonConverter .VAADIN_CORE_NPM_PACKAGE ;
52
+
48
53
/**
49
54
* Updates <code>package.json</code> by visiting {@link NpmPackage} annotations
50
55
* found in the classpath. It also visits classes annotated with
@@ -114,6 +119,7 @@ boolean lockVersionForNpm(ObjectNode packageJson) throws IOException {
114
119
115
120
ObjectNode overridesSection = getOverridesSection (packageJson );
116
121
final JsonNode dependencies = packageJson .get (DEPENDENCIES );
122
+ ObjectNode fullPlatformDependencies = getFullPlatformDependencies ();
117
123
for (String dependency : JacksonUtils .getKeys (versionsJson )) {
118
124
if (!overridesSection .has (dependency )
119
125
&& shouldLockDependencyVersion (dependency , dependencies ,
@@ -133,9 +139,108 @@ && shouldLockDependencyVersion(dependency, dependencies,
133
139
}
134
140
}
135
141
142
+ /*
143
+ * Remove platform dependencies for all existing dependencies and
144
+ * devDependencies
145
+ */
146
+ for (String dependency : JacksonUtils .getKeys (dependencies )) {
147
+ fullPlatformDependencies .remove (dependency );
148
+ }
149
+ for (String dependency : JacksonUtils .getKeys (devDependencies )) {
150
+ fullPlatformDependencies .remove (dependency );
151
+ }
152
+
153
+ // After removing any existing dependencies and devDependencies add all
154
+ // platform versions to overrides block
155
+ for (String dependency : JacksonUtils
156
+ .getKeys (fullPlatformDependencies )) {
157
+ try {
158
+ FrontendVersion frontendVersion = new FrontendVersion (
159
+ fullPlatformDependencies .get (dependency ).textValue ());
160
+ if ("SNAPSHOT" .equals (frontendVersion .getBuildIdentifier ())) {
161
+ continue ;
162
+ }
163
+ overridesSection .set (dependency , JacksonUtils
164
+ .createNode (frontendVersion .getFullVersion ()));
165
+ versionLockingUpdated = true ;
166
+ } catch (NumberFormatException nfe ) {
167
+ continue ;
168
+ }
169
+ }
170
+
136
171
return versionLockingUpdated ;
137
172
}
138
173
174
+ /**
175
+ * Collect all platform npm dependencies from vaadin-core-versions.json and
176
+ * vaadin-versions.json to use in overrides so that any component versions
177
+ * get locked even when they are transitive.
178
+ *
179
+ * @return json containing all npm keys and versions
180
+ * @throws IOException
181
+ * thrown for exception reading stream
182
+ */
183
+ private ObjectNode getFullPlatformDependencies () throws IOException {
184
+ ObjectNode platformDependencies = JacksonUtils .createObjectNode ();
185
+ URL coreVersionsResource = finder
186
+ .getResource (Constants .VAADIN_CORE_VERSIONS_JSON );
187
+ if (coreVersionsResource == null ) {
188
+ return platformDependencies ;
189
+ }
190
+
191
+ try (InputStream content = coreVersionsResource .openStream ()) {
192
+ collectDependencies (
193
+ JacksonUtils .readTree (
194
+ IOUtils .toString (content , StandardCharsets .UTF_8 )),
195
+ platformDependencies );
196
+ }
197
+
198
+ URL vaadinVersionsResource = finder
199
+ .getResource (Constants .VAADIN_VERSIONS_JSON );
200
+ if (vaadinVersionsResource == null ) {
201
+ // vaadin is not on the classpath, only vaadin-core is present.
202
+ return platformDependencies ;
203
+ }
204
+
205
+ try (InputStream content = vaadinVersionsResource .openStream ()) {
206
+ collectDependencies (
207
+ JacksonUtils .readTree (
208
+ IOUtils .toString (content , StandardCharsets .UTF_8 )),
209
+ platformDependencies );
210
+ }
211
+
212
+ return platformDependencies ;
213
+ }
214
+
215
+ private void collectDependencies (JsonNode obj , ObjectNode collection ) {
216
+ for (String key : JacksonUtils .getKeys (obj )) {
217
+ JsonNode value = obj .get (key );
218
+ if (!(value instanceof ObjectNode )) {
219
+ continue ;
220
+ }
221
+ if (value .has (NPM_NAME )) {
222
+ String npmName = value .get (NPM_NAME ).textValue ();
223
+ if (Objects .equals (npmName , VAADIN_CORE_NPM_PACKAGE )) {
224
+ return ;
225
+ }
226
+ String version ;
227
+ if (value .has (NPM_VERSION )) {
228
+ version = value .get (NPM_VERSION ).textValue ();
229
+ } else if (value .has (JS_VERSION )) {
230
+ version = value .get (JS_VERSION ).textValue ();
231
+ } else {
232
+ log ().debug (
233
+ "dependency '{}' has no 'npmVersion'/'jsVersion'." ,
234
+ npmName );
235
+ continue ;
236
+ }
237
+ collection .put (npmName , version );
238
+ } else {
239
+ collectDependencies (value , collection );
240
+ }
241
+ }
242
+ }
243
+
139
244
private boolean shouldLockDependencyVersion (String dependency ,
140
245
JsonNode projectDependencies , JsonNode versionsJson ) {
141
246
String platformDefinedVersion = versionsJson .get (dependency )
@@ -166,9 +271,37 @@ private boolean isInternalPseudoDependency(String dependencyVersion) {
166
271
167
272
private ObjectNode getOverridesSection (ObjectNode packageJson ) {
168
273
ObjectNode overridesSection = (ObjectNode ) packageJson .get (OVERRIDES );
274
+ ObjectNode oldOverrides = null ;
275
+ if (options .isEnablePnpm ()) {
276
+ if (overridesSection != null ) {
277
+ oldOverrides = overridesSection ;
278
+ // remove npm overrides when moving to pnpm
279
+ packageJson .remove (OVERRIDES );
280
+ }
281
+ JsonNode pnpm = packageJson .get (PNPM );
282
+ if (pnpm == null ) {
283
+ overridesSection = null ;
284
+ } else {
285
+ overridesSection = (ObjectNode ) pnpm .get (OVERRIDES );
286
+ }
287
+ } else if (packageJson .has (PNPM )) {
288
+ oldOverrides = overridesSection ;
289
+ // remove pnpm overrides for npm
290
+ ((ObjectNode ) packageJson .get (PNPM )).remove (OVERRIDES );
291
+ }
169
292
if (overridesSection == null ) {
170
- overridesSection = JacksonUtils .createObjectNode ();
171
- packageJson .set (OVERRIDES , overridesSection );
293
+ overridesSection = oldOverrides == null
294
+ ? JacksonUtils .createObjectNode ()
295
+ : oldOverrides ;
296
+ if (options .isEnablePnpm ()) {
297
+ ObjectNode pnpmNode = packageJson .has (PNPM )
298
+ ? (ObjectNode ) packageJson .get (PNPM )
299
+ : JacksonUtils .createObjectNode ();
300
+ packageJson .set (PNPM , pnpmNode );
301
+ pnpmNode .set (OVERRIDES , overridesSection );
302
+ } else {
303
+ packageJson .set (OVERRIDES , overridesSection );
304
+ }
172
305
}
173
306
return overridesSection ;
174
307
}
0 commit comments