diff --git a/flow-plugins/flow-gradle-plugin/src/main/kotlin/com/vaadin/gradle/VaadinBuildFrontendTask.kt b/flow-plugins/flow-gradle-plugin/src/main/kotlin/com/vaadin/gradle/VaadinBuildFrontendTask.kt index 8df74c8cf40..5cbf9af25cd 100644 --- a/flow-plugins/flow-gradle-plugin/src/main/kotlin/com/vaadin/gradle/VaadinBuildFrontendTask.kt +++ b/flow-plugins/flow-gradle-plugin/src/main/kotlin/com/vaadin/gradle/VaadinBuildFrontendTask.kt @@ -15,11 +15,15 @@ */ package com.vaadin.gradle +import com.vaadin.experimental.FeatureFlags import com.vaadin.flow.plugin.base.BuildFrontendUtil import com.vaadin.flow.server.Constants import com.vaadin.flow.server.frontend.BundleValidationUtil import com.vaadin.flow.server.frontend.FrontendUtils import com.vaadin.flow.server.frontend.TaskCleanFrontendFiles +import com.vaadin.flow.server.frontend.scanner.ClassFinder +import com.vaadin.flow.server.frontend.scanner.FrontendDependenciesScanner +import com.vaadin.flow.server.frontend.scanner.FrontendDependenciesScanner.FrontendDependenciesScannerFactory import com.vaadin.pro.licensechecker.LicenseChecker import org.gradle.api.DefaultTask import org.gradle.api.provider.Property @@ -80,9 +84,26 @@ public abstract class VaadinBuildFrontendTask : DefaultTask() { check(tokenFile.exists()) { "token file $tokenFile doesn't exist!" } val cleanTask = TaskCleanFrontendFiles(config.npmFolder.get(), - BuildFrontendUtil.getGeneratedFrontendDirectory(adapter.get()), adapter.get().classFinder + BuildFrontendUtil.getGeneratedFrontendDirectory(adapter.get()), adapter.get().classFinder) + + val reactEnabled: Boolean = adapter.get().isReactEnabled() + && FrontendUtils.isReactRouterRequired( + BuildFrontendUtil.getFrontendDirectory(adapter.get()) + ) + val featureFlags: FeatureFlags = FeatureFlags( + adapter.get().createLookup(adapter.get().getClassFinder()) ) - BuildFrontendUtil.runNodeUpdater(adapter.get()) + if (adapter.get().javaResourceFolder() != null) { + featureFlags.setPropertiesLocation(adapter.get().javaResourceFolder()) + } + val frontendDependencies: FrontendDependenciesScanner = FrontendDependenciesScannerFactory() + .createScanner( + !adapter.get().optimizeBundle(), adapter.get().getClassFinder(), + adapter.get().generateEmbeddableWebComponents(), featureFlags, + reactEnabled + ) + + BuildFrontendUtil.runNodeUpdater(adapter.get(), frontendDependencies) if (adapter.get().generateBundle() && BundleValidationUtil.needsBundleBuild (adapter.get().servletResourceOutputDirectory())) { @@ -92,7 +113,7 @@ public abstract class VaadinBuildFrontendTask : DefaultTask() { } } LicenseChecker.setStrictOffline(true) - val licenseRequired = BuildFrontendUtil.validateLicenses(adapter.get()) + val licenseRequired = BuildFrontendUtil.validateLicenses(adapter.get(), frontendDependencies) BuildFrontendUtil.updateBuildFile(adapter.get(), licenseRequired) } diff --git a/flow-plugins/flow-maven-plugin/src/main/java/com/vaadin/flow/plugin/maven/BuildFrontendMojo.java b/flow-plugins/flow-maven-plugin/src/main/java/com/vaadin/flow/plugin/maven/BuildFrontendMojo.java index 7ab4211579c..35b76b0530e 100644 --- a/flow-plugins/flow-maven-plugin/src/main/java/com/vaadin/flow/plugin/maven/BuildFrontendMojo.java +++ b/flow-plugins/flow-maven-plugin/src/main/java/com/vaadin/flow/plugin/maven/BuildFrontendMojo.java @@ -30,6 +30,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import com.vaadin.experimental.FeatureFlags; import com.vaadin.flow.component.dependency.JavaScript; import com.vaadin.flow.component.dependency.JsModule; import com.vaadin.flow.component.dependency.NpmPackage; @@ -41,6 +42,7 @@ import com.vaadin.flow.server.frontend.BundleValidationUtil; import com.vaadin.flow.server.frontend.FrontendUtils; import com.vaadin.flow.server.frontend.TaskCleanFrontendFiles; +import com.vaadin.flow.server.frontend.scanner.FrontendDependenciesScanner; import com.vaadin.flow.theme.Theme; import com.vaadin.pro.licensechecker.LicenseChecker; @@ -139,8 +141,22 @@ protected void executeInternal() TaskCleanFrontendFiles cleanTask = new TaskCleanFrontendFiles( npmFolder(), frontendDirectory(), getClassFinder()); + + boolean reactEnabled = isReactEnabled() + && FrontendUtils.isReactRouterRequired( + BuildFrontendUtil.getFrontendDirectory(this)); + FeatureFlags featureFlags = new FeatureFlags( + createLookup(getClassFinder())); + if (javaResourceFolder() != null) { + featureFlags.setPropertiesLocation(javaResourceFolder()); + } + FrontendDependenciesScanner frontendDependencies = new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() + .createScanner(!optimizeBundle, getClassFinder(), + generateEmbeddableWebComponents, featureFlags, + reactEnabled); + try { - BuildFrontendUtil.runNodeUpdater(this); + BuildFrontendUtil.runNodeUpdater(this, frontendDependencies); } catch (ExecutionFailedException | URISyntaxException exception) { throw new MojoFailureException( "Could not execute build-frontend goal", exception); @@ -160,7 +176,8 @@ protected void executeInternal() } } LicenseChecker.setStrictOffline(true); - boolean licenseRequired = BuildFrontendUtil.validateLicenses(this); + boolean licenseRequired = BuildFrontendUtil.validateLicenses(this, + frontendDependencies); BuildFrontendUtil.updateBuildFile(this, licenseRequired); diff --git a/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java b/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java index 4c4a2f1de89..1f68210abf8 100644 --- a/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java +++ b/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java @@ -311,12 +311,14 @@ public static File propagateBuildInfo(PluginAdapterBase adapter) { * * @param adapter * - the PluginAdapterBase. + * @param frontendDependencies * @throws ExecutionFailedException * - a ExecutionFailedException. * @throws URISyntaxException * - - Could not build an URI from nodeDownloadRoot(). */ - public static void runNodeUpdater(PluginAdapterBuild adapter) + public static void runNodeUpdater(PluginAdapterBuild adapter, + FrontendDependenciesScanner frontendDependencies) throws ExecutionFailedException, URISyntaxException { Set jarFiles = adapter.getJarFiles(); @@ -365,7 +367,8 @@ public static void runNodeUpdater(PluginAdapterBuild adapter) .withFrontendExtraFileExtensions( adapter.frontendExtraFileExtensions()) .withFrontendIgnoreVersionChecks( - adapter.isFrontendIgnoreVersionChecks()); + adapter.isFrontendIgnoreVersionChecks()) + .withFrontendDependenciesScanner(frontendDependencies); new NodeTasks(options).execute(); } catch (ExecutionFailedException exception) { throw exception; @@ -577,10 +580,12 @@ private static void runFrontendBuildTool(PluginAdapterBase adapter, * * @param adapter * the PluginAdapterBase + * @param frontendDependencies * @return {@literal true} if license validation is required because of the * presence of commercial components, otherwise {@literal false}. */ - public static boolean validateLicenses(PluginAdapterBase adapter) { + public static boolean validateLicenses(PluginAdapterBase adapter, + FrontendDependenciesScanner frontendDependencies) { File outputFolder = adapter.webpackOutputDirectory(); String statsJsonContent = null; @@ -609,11 +614,8 @@ public static boolean validateLicenses(PluginAdapterBase adapter) { statsJsonContent = "{}"; } - FrontendDependenciesScanner scanner = new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, adapter.getClassFinder(), true, null, - adapter.isReactEnabled()); List commercialComponents = findCommercialFrontendComponents( - scanner, statsJsonContent); + frontendDependencies, statsJsonContent); commercialComponents.addAll(findCommercialJavaComponents(adapter)); for (Product component : commercialComponents) { diff --git a/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java index b2ed6598621..a4b9ce98c8d 100644 --- a/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java +++ b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java @@ -12,7 +12,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -41,6 +40,7 @@ import com.vaadin.flow.server.Constants; import com.vaadin.flow.server.ExecutionFailedException; import com.vaadin.flow.server.InitParameters; +import com.vaadin.flow.server.PwaConfiguration; import com.vaadin.flow.server.frontend.EndpointGeneratorTaskFactory; import com.vaadin.flow.server.frontend.FileIOUtils; import com.vaadin.flow.server.frontend.FrontendTools; @@ -150,11 +150,15 @@ public void should_useHillaEngine_withNodeUpdater() .when(endpointGeneratorTaskFactory) .createTaskGenerateEndpoint(Mockito.any()); + FrontendDependenciesScanner frontendDependencies = Mockito + .mock(FrontendDependenciesScanner.class); + Mockito.when(frontendDependencies.getPwaConfiguration()) + .thenReturn(new PwaConfiguration()); try (MockedStatic util = Mockito .mockStatic(FrontendUtils.class, Mockito.CALLS_REAL_METHODS)) { util.when(() -> FrontendUtils.isHillaUsed(Mockito.any(), Mockito.any())).thenReturn(true); - BuildFrontendUtil.runNodeUpdater(adapter); + BuildFrontendUtil.runNodeUpdater(adapter, frontendDependencies); } Mockito.verify(lookup).lookup(EndpointGeneratorTaskFactory.class); @@ -524,7 +528,11 @@ public void runNodeUpdater_generateFeatureFlagsJsFile() throws Exception { Mockito.when(adapter.createLookup(Mockito.any())).thenReturn(lookup); Mockito.doReturn(classFinder).when(lookup).lookup(ClassFinder.class); - BuildFrontendUtil.runNodeUpdater(adapter); + FrontendDependenciesScanner frontendDependencies = Mockito + .mock(FrontendDependenciesScanner.class); + Mockito.when(frontendDependencies.getPwaConfiguration()) + .thenReturn(new PwaConfiguration()); + BuildFrontendUtil.runNodeUpdater(adapter, frontendDependencies); File generatedFeatureFlagsFile = new File(adapter.generatedTsFolder(), FEATURE_FLAGS_FILE_NAME); diff --git a/flow-server/src/main/java/com/vaadin/flow/server/frontend/NodeTasks.java b/flow-server/src/main/java/com/vaadin/flow/server/frontend/NodeTasks.java index 3c9e38a2522..9096714ec96 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/frontend/NodeTasks.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/frontend/NodeTasks.java @@ -103,13 +103,15 @@ public class NodeTasks implements FallibleCommand { * the options */ public NodeTasks(Options options) { + FrontendDependenciesScanner frontendDependencies = options + .getFrontendDependenciesScanner(); + // Lock file is created in the project root folder and not in target/ so // that Maven does not remove it lockFile = new File(options.getNpmFolder(), ".vaadin-node-tasks.lock") .toPath(); ClassFinder classFinder = options.getClassFinder(); - FrontendDependenciesScanner frontendDependencies = null; Set webComponentTags = new HashSet<>(); @@ -119,9 +121,6 @@ public NodeTasks(Options options) { if (options.isEnablePackagesUpdate() || options.isEnableImportsUpdate() || options.isEnableConfigUpdate()) { - frontendDependencies = new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(options); - if (options.isProductionMode()) { boolean needBuild = BundleValidationUtil.needsBuild(options, frontendDependencies, diff --git a/flow-server/src/main/java/com/vaadin/flow/server/frontend/Options.java b/flow-server/src/main/java/com/vaadin/flow/server/frontend/Options.java index b0074de9612..ac4f4f16cff 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/frontend/Options.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/frontend/Options.java @@ -17,6 +17,7 @@ import com.vaadin.flow.server.frontend.installer.NodeInstaller; import com.vaadin.flow.server.frontend.installer.Platform; import com.vaadin.flow.server.frontend.scanner.ClassFinder; +import com.vaadin.flow.server.frontend.scanner.FrontendDependenciesScanner; /** * Build a NodeExecutor instance. @@ -85,6 +86,8 @@ public class Options implements Serializable { private List frontendExtraFileExtensions = null; + private FrontendDependenciesScanner frontendDependenciesScanner; + /** * The node.js version to be used when node.js is installed automatically by * Vaadin, for example "v16.0.0". Defaults to @@ -1037,4 +1040,35 @@ public Options withNpmExcludeWebComponents(boolean exclude) { public boolean isFrontendIgnoreVersionChecks() { return frontendIgnoreVersionChecks; } + + /** + * Sets the frontend dependencies scanner to use. + * + * @param frontendDependenciesScanner + * frontend dependencies scanner + * @return this builder + */ + public Options withFrontendDependenciesScanner( + FrontendDependenciesScanner frontendDependenciesScanner) { + this.frontendDependenciesScanner = frontendDependenciesScanner; + return this; + } + + /** + * Gets the frontend dependencies scanner to use. If not is not pre-set, + * this initializes a new one based on the Options set. + * + * @return frontend dependencies scanner + */ + public FrontendDependenciesScanner getFrontendDependenciesScanner() { + if (frontendDependenciesScanner == null) { + boolean reactEnabled = isReactEnabled() && FrontendUtils + .isReactRouterRequired(getFrontendDirectory()); + frontendDependenciesScanner = new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() + .createScanner(!isUseByteCodeScanner(), getClassFinder(), + isGenerateEmbeddableWebComponents(), + getFeatureFlags(), reactEnabled); + } + return frontendDependenciesScanner; + } } diff --git a/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependencies.java b/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependencies.java index 1db37c82479..3f23208fb8f 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependencies.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependencies.java @@ -107,7 +107,11 @@ public class FrontendDependencies extends AbstractDependenciesScanner { * * @param finder * the class finder + * @deprecated Use + * {@link FrontendDependencies#FrontendDependencies(ClassFinder, boolean, FeatureFlags, boolean)} + * instead. */ + @Deprecated public FrontendDependencies(ClassFinder finder) { this(finder, true, null); } @@ -123,7 +127,11 @@ public FrontendDependencies(ClassFinder finder) { * {@link com.vaadin.flow.component.WebComponentExporter} classes * for dependencies. {@code true} is default for * {@link FrontendDependencies#FrontendDependencies(ClassFinder)} + * @deprecated Use + * {@link FrontendDependencies#FrontendDependencies(ClassFinder, boolean, FeatureFlags, boolean)} + * instead. */ + @Deprecated public FrontendDependencies(ClassFinder finder, boolean generateEmbeddableWebComponents) { this(finder, generateEmbeddableWebComponents, null); @@ -142,7 +150,11 @@ public FrontendDependencies(ClassFinder finder, * {@link FrontendDependencies#FrontendDependencies(ClassFinder)} * @param featureFlags * available feature flags and their status + * @deprecated Use + * {@link FrontendDependencies#FrontendDependencies(ClassFinder, boolean, FeatureFlags, boolean)} + * instead. */ + @Deprecated public FrontendDependencies(ClassFinder finder, boolean generateEmbeddableWebComponents, FeatureFlags featureFlags) { diff --git a/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesScanner.java b/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesScanner.java index ea81b686840..79bc5eb3602 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesScanner.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesScanner.java @@ -59,7 +59,11 @@ class FrontendDependenciesScannerFactory { * checks {@code WebComponentExporter} classes for * dependencies if {@code true}, doesn't check otherwise * @return a scanner implementation strategy + * @deprecated Use + * {@link FrontendDependenciesScannerFactory#createScanner(boolean, ClassFinder, boolean, FeatureFlags, boolean)} + * instead. */ + @Deprecated public FrontendDependenciesScanner createScanner( boolean allDependenciesScan, ClassFinder finder, boolean generateEmbeddableWebComponents) { @@ -84,7 +88,11 @@ public FrontendDependenciesScanner createScanner( * available feature flags and their status * @return a scanner implementation strategy * + * @deprecated Use + * {@link FrontendDependenciesScannerFactory#createScanner(boolean, ClassFinder, boolean, FeatureFlags, boolean)} + * instead. */ + @Deprecated public FrontendDependenciesScanner createScanner( boolean allDependenciesScan, ClassFinder finder, boolean generateEmbeddableWebComponents, @@ -93,6 +101,25 @@ public FrontendDependenciesScanner createScanner( generateEmbeddableWebComponents, featureFlags, true); } + /** + * Produces scanner implementation based on {@code allDependenciesScan} + * value. + *

+ * + * @param allDependenciesScan + * if {@code true} then full classpath scanning strategy is + * used, otherwise byte scanning strategy is produced + * @param finder + * a class finder + * @param generateEmbeddableWebComponents + * checks {@code WebComponentExporter} classes for + * dependencies if {@code true}, doesn't check otherwise + * @param featureFlags + * available feature flags and their status + * @param reactEnabled + * {@code true} if react is enabled, {@code true otherwise} + * @return a scanner implementation strategy + */ public FrontendDependenciesScanner createScanner( boolean allDependenciesScan, ClassFinder finder, boolean generateEmbeddableWebComponents, @@ -109,6 +136,17 @@ public FrontendDependenciesScanner createScanner( } } + /** + * Produces scanner implementation based on the given Options object. + * + * @param options + * Options to build the scanner from + * @return a scanner implementation strategy + * @deprecated Use + * {@link FrontendDependenciesScannerFactory#createScanner(boolean, ClassFinder, boolean, FeatureFlags, boolean)} + * instead. + */ + @Deprecated public FrontendDependenciesScanner createScanner(Options options) { boolean reactEnabled = options.isReactEnabled() && FrontendUtils .isReactRouterRequired(options.getFrontendDirectory()); diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/ComponentFlagsTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/ComponentFlagsTest.java index b30add6fffd..51e39174517 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/ComponentFlagsTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/ComponentFlagsTest.java @@ -79,7 +79,7 @@ public void before() throws IOException { protected FrontendDependenciesScanner getScanner(ClassFinder finder, FeatureFlags featureFlags) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, finder, true, featureFlags); + .createScanner(false, finder, true, featureFlags, true); } @Test diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithByteCodeScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithByteCodeScannerTest.java index c47e838f6cf..5e9fcc18860 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithByteCodeScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithByteCodeScannerTest.java @@ -24,6 +24,6 @@ public class NodeUpdateImportsWithByteCodeScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, finder, true); + .createScanner(false, finder, true, null, true); } } diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithFullCPScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithFullCPScannerTest.java index b5b6130721a..d48e54a64b2 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithFullCPScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdateImportsWithFullCPScannerTest.java @@ -24,6 +24,6 @@ public class NodeUpdateImportsWithFullCPScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(true, finder, true); + .createScanner(true, finder, true, null, true); } } diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithByteCodeScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithByteCodeScannerTest.java index d08ef53e74c..e347581ecf3 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithByteCodeScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithByteCodeScannerTest.java @@ -24,7 +24,7 @@ public class NodeUpdatePackagesWithByteCodeScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, finder, true); + .createScanner(false, finder, true, null, true); } } diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithFullCPCodeScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithFullCPCodeScannerTest.java index 0e1ff3d2cb0..7046ff4621c 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithFullCPCodeScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/NodeUpdatePackagesWithFullCPCodeScannerTest.java @@ -24,7 +24,7 @@ public class NodeUpdatePackagesWithFullCPCodeScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(true, finder, true); + .createScanner(true, finder, true, null, true); } } diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/TaskGenerateBootstrapTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/TaskGenerateBootstrapTest.java index 249369d2800..830624e479f 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/TaskGenerateBootstrapTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/TaskGenerateBootstrapTest.java @@ -64,7 +64,7 @@ public void setUp() throws Exception { ClassFinder.DefaultClassFinder finder = new ClassFinder.DefaultClassFinder( Collections.singleton(this.getClass())); frontDeps = new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, finder, false); + .createScanner(false, finder, false, null, true); frontendFolder = temporaryFolder.newFolder(FRONTEND); options = new MockOptions(finder, null) @@ -151,7 +151,7 @@ public void should_load_AppTheme() private FrontendDependencies getThemedDependency() throws MalformedURLException { ClassFinder finder = getClassFinder(); - return new FrontendDependencies(finder) { + return new FrontendDependencies(finder, true, null, true) { @Override public Map> getModules() { diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithByteCodeScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithByteCodeScannerTest.java index 9aac4da560f..e29f9dfd418 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithByteCodeScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithByteCodeScannerTest.java @@ -53,7 +53,7 @@ public class UpdateImportsWithByteCodeScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(false, finder, true); + .createScanner(false, finder, true, null, true); } @Test diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithFullCPScannerTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithFullCPScannerTest.java index 77f76756edf..89085fcafd9 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithFullCPScannerTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateImportsWithFullCPScannerTest.java @@ -31,7 +31,7 @@ public class UpdateImportsWithFullCPScannerTest @Override protected FrontendDependenciesScanner getScanner(ClassFinder finder) { return new FrontendDependenciesScanner.FrontendDependenciesScannerFactory() - .createScanner(true, finder, true); + .createScanner(true, finder, true, null, true); } @Test diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateThemedImportsTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateThemedImportsTest.java index 07d4b9f742d..a6804d60971 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateThemedImportsTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/UpdateThemedImportsTest.java @@ -118,7 +118,8 @@ public void setup() throws Exception { ""); ClassFinder finder = getClassFinder(); - FrontendDependencies deps = new FrontendDependencies(finder) { + FrontendDependencies deps = new FrontendDependencies(finder, true, null, + true) { @Override public Map> getModules() { diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesTest.java index db331e1825e..91c1f227622 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendDependenciesTest.java @@ -82,7 +82,7 @@ public void routedComponent_entryPointsAreCollected() { Mockito.when(classFinder.getAnnotatedClasses(Route.class)) .thenReturn(Collections.singleton(RouteComponent.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "foo.js"); DepsTests.assertImports(dependencies.getScripts(), "bar.js"); @@ -97,7 +97,7 @@ public void appShellConfigurator_collectedAsEntryPoint() .thenReturn((Class) FakeLumo.class); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); Assert.assertEquals("UI, AppShell should be found", 2, dependencies.getEntryPoints().size()); @@ -120,7 +120,7 @@ public void themeDefiningClassAndName_throwsException() IllegalStateException exception = Assert.assertThrows( IllegalStateException.class, - () -> new FrontendDependencies(classFinder, false)); + () -> new FrontendDependencies(classFinder, false, null, true)); Assert.assertEquals("Unexpected message for the thrown exception", "Theme name and theme class can not both be specified. " @@ -138,7 +138,7 @@ public void noDefaultThemeAvailable_throwsException() IllegalStateException exception = Assert.assertThrows( IllegalStateException.class, - () -> new FrontendDependencies(classFinder, false)); + () -> new FrontendDependencies(classFinder, false, null, true)); Assert.assertEquals("Thrown exception didn't contain correct message", "Lumo dependency needs to be available on the classpath when using a theme name.", @@ -151,7 +151,7 @@ public void appThemeDefined_getsLumoAsTheme() { .thenReturn(Collections.singleton(MyAppThemeShell.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); Assert.assertEquals("Faulty default theme received", FakeLumo.class, dependencies.getThemeDefinition().getTheme()); @@ -164,7 +164,7 @@ public void onlyThemeVariantDefined_getsLumoAsTheme_preserveVariant() { .thenReturn(Collections.singleton(ThemeVariantOnly.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); Assert.assertEquals("Faulty default theme received", FakeLumo.class, dependencies.getThemeDefinition().getTheme()); @@ -178,7 +178,7 @@ public void hasErrorParameterComponent_entryPointIsCollected() { Mockito.when(classFinder.getSubTypesOf(HasErrorParameter.class)) .thenReturn(Collections.singleton(ErrorComponent.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "./src/bar.js"); DepsTests.assertImports(dependencies.getScripts(), "./src/baz.js"); @@ -189,7 +189,7 @@ public void componentInsideUiInitListener_entryPointsAreCollected() { Mockito.when(classFinder.getSubTypesOf(UIInitListener.class)) .thenReturn(Collections.singleton(MyUIInitListener.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "baz.js"); DepsTests.assertImports(dependencies.getScripts(), "foobar.js"); @@ -201,7 +201,7 @@ public void componentInsideUiInitListenerInsideServiceInitListener_entryPointsAr Mockito.when(classFinder.getSubTypesOf(VaadinServiceInitListener.class)) .thenReturn(Collections.singleton(MyServiceListener.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "baz.js"); DepsTests.assertImports(dependencies.getScripts(), "foobar.js"); } @@ -211,7 +211,7 @@ public void jsScriptOrderIsPreserved() { Mockito.when(classFinder.getAnnotatedClasses(Route.class)) .thenReturn(Collections.singleton(JsOrderComponent.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImports(dependencies.getScripts(), "a.js", "b.js", "c.js"); @@ -222,7 +222,7 @@ public void jsModuleOrderIsPreserved() { Mockito.when(classFinder.getAnnotatedClasses(Route.class)).thenReturn( Collections.singleton(JsModuleOrderComponent.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "c.js", "b.js", "a.js"); @@ -235,7 +235,7 @@ public void extractsAndScansClassesFromMethodReferences() { Collections.singleton(RouteComponentWithMethodReference.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImportsExcludingUI(dependencies.getModules(), "foo.js", "baz.js", "bar.js"); @@ -249,7 +249,7 @@ public void defaultThemeIsLoadedForExporters() throws Exception { .collect(Collectors.toSet())); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, true); + classFinder, true, null, true); Assert.assertNotNull(dependencies.getTheme()); Assert.assertNotNull(dependencies.getThemeDefinition()); @@ -258,7 +258,7 @@ public void defaultThemeIsLoadedForExporters() throws Exception { @Test // #9861 public void collectEntryPoints_uiIsAlwaysCollected() { FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); Optional uiEndpointData = dependencies.getEntryPoints() .stream().filter(entryPoint -> entryPoint.getName() @@ -277,7 +277,7 @@ public void classInMultipleEntryPoints_collectEntryPointsNotOverrideInitial() { .thenReturn(Collections.singleton(TestRoute.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); DepsTests.assertImports(dependencies.getModules(), "reference.js", "@vaadin/common-frontend/ConnectionIndicator.js"); } @@ -288,7 +288,7 @@ public void layoutClasses_collectedAsEntrypoint() { .thenReturn(Collections.singleton(MainLayout.class)); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); Optional layoutEndpointData = dependencies .getEntryPoints().stream().filter(entryPoint -> entryPoint @@ -314,7 +314,7 @@ public void visitedExporter_previousEntryPointsNotOverridden() .collect(Collectors.toSet())); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, true); + classFinder, true, null, true); DepsTests.assertImports(dependencies.getModules(), "reference.js", "@vaadin/common-frontend/ConnectionIndicator.js"); @@ -324,7 +324,7 @@ public void visitedExporter_previousEntryPointsNotOverridden() public void shouldVisit_shouldNotMatchOnPartOfPackage() { FrontendDependencies dependencies = new FrontendDependencies( - classFinder, true); + classFinder, true, null, true); Assert.assertTrue( "second package should match fully not as starts with 'spring != springseason'", @@ -356,7 +356,7 @@ public void classScanningForChildAndParentEntryPoint_ordered_childrenSeeClassesF .thenReturn(hierarchy); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); hierarchy.forEach(entryPointClass -> verifyEntryPointData(dependencies, entryPointClass)); @@ -373,7 +373,7 @@ public void classScanningForChildAndParentEntryPoint_shuffled_childrenSeeClasses .thenReturn(hierarchy); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); hierarchy.forEach(entryPointClass -> verifyEntryPointData(dependencies, entryPointClass)); @@ -390,7 +390,7 @@ public void classScanningForChildAndParentEntryPoint_reversed_childrenSeeClasses .thenReturn(hierarchy); FrontendDependencies dependencies = new FrontendDependencies( - classFinder, false); + classFinder, false, null, true); hierarchy.forEach(entryPointClass -> verifyEntryPointData(dependencies, entryPointClass)); diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendScannerPwaTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendScannerPwaTest.java index 28d2f9a4e3d..3e9a6651a8c 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendScannerPwaTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/FrontendScannerPwaTest.java @@ -11,8 +11,9 @@ public class FrontendScannerPwaTest extends AbstractScannerPwaTest { protected PwaConfiguration getPwaConfiguration(Class... classes) throws Exception { FrontendDependencies frontendDependencies = new FrontendDependencies( - new DefaultClassFinder(new HashSet<>( - new ArrayList<>(Arrays.asList(classes))))); + new DefaultClassFinder( + new HashSet<>(new ArrayList<>(Arrays.asList(classes)))), + true, null, true); return frontendDependencies.getPwaConfiguration(); } } diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerDependenciesTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerDependenciesTest.java index e90535f0558..6dfd6383abc 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerDependenciesTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerDependenciesTest.java @@ -47,8 +47,9 @@ public class ScannerDependenciesTest { static FrontendDependencies getFrontendDependencies(Class... classes) { FrontendDependencies frontendDependencies = new FrontendDependencies( - new DefaultClassFinder(new HashSet<>( - new ArrayList<>(Arrays.asList(classes))))); + new DefaultClassFinder( + new HashSet<>(new ArrayList<>(Arrays.asList(classes)))), + true, null, true); return frontendDependencies; } @@ -258,7 +259,7 @@ public void should_visitMethodAnnotations() { FrontendDependencies deps = getFrontendDependencies( MethodAnnotationRoute.class); DepsTests.assertImportsExcludingUI(deps.getModules(), - "./search-layout.js", "./search-field.js"); + "./search-field.js", "./search-layout.js"); } @Route diff --git a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerThemeTest.java b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerThemeTest.java index 172dafc0889..5dfc847a506 100644 --- a/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerThemeTest.java +++ b/flow-server/src/test/java/com/vaadin/flow/server/frontend/scanner/ScannerThemeTest.java @@ -103,7 +103,8 @@ public void should_visitDefaultTheme_when_noThemeAnnotationIsGiven() // since it has @JsModule annotation which makes it easy to verify // that the Theme was actually visited and modules collected - FrontendDependencies deps = new FrontendDependencies(finder) { + FrontendDependencies deps = new FrontendDependencies(finder, true, null, + true) { @Override Class getDefaultTheme() throws IOException { @@ -137,7 +138,8 @@ public void should_defaultToLumoTheme_when_noThemeDefinedByExporter() Mockito.doReturn(Theme4.class).when(finder) .loadClass(FrontendDependencies.LUMO); - FrontendDependencies deps = new FrontendDependencies(finder); + FrontendDependencies deps = new FrontendDependencies(finder, true, null, + true); assertEquals( "Theme4 should have been returned when default theme was selected", Theme4.class, deps.getThemeDefinition().getTheme()); @@ -150,7 +152,7 @@ public void should_notAttemptToOverrideTheme_when_noExportersFound() DefaultClassFinder finder = spy(new DefaultClassFinder( Collections.singleton(RootViewWithTheme.class))); - new FrontendDependencies(finder); + new FrontendDependencies(finder, true, null, true); verify(finder, times(0)).loadClass(FrontendDependencies.LUMO); }