use of com.vaadin.flow.server.frontend.scanner.ClassFinder in project flow by vaadin.
the class NodeUpdateImportsTest method extraComponentsInCP_componentsAreNotDiscoveredByMainScannerWrittenByFallback_fallbackIsGenerated.
@Test
public void extraComponentsInCP_componentsAreNotDiscoveredByMainScannerWrittenByFallback_fallbackIsGenerated() throws IOException {
Stream<Class<?>> classes = Stream.concat(Stream.of(NodeTestComponents.class.getDeclaredClasses()), Stream.of(ExtraNodeTestComponents.class.getDeclaredClasses()));
ClassFinder classFinder = new DefaultClassFinder(new URLClassLoader(getClassPath()), classes.toArray(Class<?>[]::new));
JsonObject fallBackData = Json.createObject();
updater = new TaskUpdateImports(classFinder, new FrontendDependenciesScannerFactory().createScanner(false, classFinder, true), finder -> new FrontendDependenciesScannerFactory().createScanner(true, finder, true), tmpRoot, generatedPath, frontendDirectory, tokenFile, fallBackData, false, TARGET, true, false, Mockito.mock(FeatureFlags.class)) {
@Override
Logger log() {
return logger;
}
};
updater.execute();
assertTrue(importsFile.exists());
String mainContent = FileUtils.readFileToString(importsFile, Charset.defaultCharset());
// ============== check main generated imports file ============
// Contains theme lines
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("export const addCssBlock = function(block, before = false) {"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("addCssBlock('<custom-style><style include=\"lumo-color lumo-typography\"></style></custom-style>', true);"));
// Contains CSS import lines
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import $cssFromFile_0 from '@vaadin/vaadin-mixed-component/bar.css';"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("addCssBlock(`<style>${$css_0}</style>`);"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import $cssFromFile_5 from 'Frontend/foo.css';"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("registerStyles('foo-bar', $css_5, {moduleId: 'flow_css_mod'});"));
// Contains theme imports
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import '@vaadin/vaadin-lumo-styles/color.js';"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import '@vaadin/vaadin-lumo-styles/typography.js';"));
// Contains JS module imports
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import '@polymer/iron-icon/iron-icon.js';"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import '3rdparty/component.js';"));
// Contains Javascript imports
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import 'javascript/a.js';"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("import 'javascript/b.js';"));
// fallback chunk load function is generated
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("fallbacks[thisScript.getAttribute('data-app-id')].loadFallback = function loadFallback() {"));
MatcherAssert.assertThat(mainContent, CoreMatchers.containsString("return import('./generated-flow-imports-fallback.js');"));
assertTrue(fallBackImportsFile.exists());
// ============== check fallback generated imports file ============
String fallBackContent = FileUtils.readFileToString(fallBackImportsFile, Charset.defaultCharset());
// Does not Contains theme lines
MatcherAssert.assertThat(fallBackContent, CoreMatchers.not(CoreMatchers.containsString("const div = document.createElement('div');")));
// Does not contains theme imports
MatcherAssert.assertThat(fallBackContent, CoreMatchers.not(CoreMatchers.containsString("import '@vaadin/vaadin-lumo-styles/color.js';")));
// Does not contains CSS import lines
MatcherAssert.assertThat(fallBackContent, CoreMatchers.not(CoreMatchers.containsString("import $cssFromFile_0 from '@vaadin/vaadin-mixed-component/bar.css';")));
// Contain lines to import exported modules from main file
MatcherAssert.assertThat(fallBackContent, CoreMatchers.containsString("export const addCssBlock = function(block, before = false) {"));
// Contains CSS import lines from CP not discovered by byte scanner
MatcherAssert.assertThat(fallBackContent, CoreMatchers.containsString("import $cssFromFile_0 from 'Frontend/b-css.css';"));
MatcherAssert.assertThat(fallBackContent, CoreMatchers.containsString("registerStyles('extra-foo', $css_2, {include: 'extra-bar', moduleId: 'fallback_flow_css_mod'});"));
// Does not contains JS module imports
MatcherAssert.assertThat(fallBackContent, CoreMatchers.not(CoreMatchers.containsString("import '@polymer/iron-icon/iron-icon.js';")));
// Contains JS module imports
MatcherAssert.assertThat(fallBackContent, CoreMatchers.containsString("import '@polymer/a.js';"));
// Does not contain Javascript imports
MatcherAssert.assertThat(fallBackContent, CoreMatchers.not(CoreMatchers.containsString("import 'javascript/a.js';")));
// Contains Javascript imports
MatcherAssert.assertThat(fallBackContent, CoreMatchers.containsString("import 'Frontend/extra-javascript.js';"));
// ============== check token file with fallback chunk data ============
String tokenContent = FileUtils.readFileToString(tokenFile, Charset.defaultCharset());
JsonObject object = Json.parse(tokenContent);
assertTokenFileWithFallBack(object);
assertTokenFileWithFallBack(fallBackData);
// ============== check definition file ============
assertTrue(importsDefinitionFile.exists());
String definitionContent = FileUtils.readFileToString(importsDefinitionFile, Charset.defaultCharset());
MatcherAssert.assertThat(definitionContent, CoreMatchers.containsString("export declare const addCssBlock: (block: string, before?: boolean) => void;"));
}
use of com.vaadin.flow.server.frontend.scanner.ClassFinder in project flow by vaadin.
the class AbstractNodeUpdateImportsTest method setup.
@Before
public void setup() throws Exception {
File tmpRoot = temporaryFolder.getRoot();
logger = new MockLogger();
frontendDirectory = new File(tmpRoot, DEFAULT_FRONTEND_DIR);
nodeModulesPath = new File(tmpRoot, NODE_MODULES);
generatedPath = new File(tmpRoot, Paths.get(TARGET, DEFAULT_GENERATED_DIR).toString());
importsFile = new File(generatedPath, IMPORTS_NAME);
ClassFinder classFinder = getClassFinder();
updater = new TaskUpdateImports(classFinder, getScanner(classFinder), finder -> null, tmpRoot, generatedPath, frontendDirectory, null, null, false, TARGET, true, false, Mockito.mock(FeatureFlags.class)) {
@Override
Logger log() {
return logger;
}
};
assertTrue(nodeModulesPath.mkdirs());
createExpectedImports(frontendDirectory, nodeModulesPath);
assertTrue(new File(nodeModulesPath, FLOW_NPM_PACKAGE_NAME + "ExampleConnector.js").exists());
}
use of com.vaadin.flow.server.frontend.scanner.ClassFinder in project flow by vaadin.
the class NodeTasksTest method should_IncludeExperimentalComponent_WhenFeatureEnabled.
@Test
public void should_IncludeExperimentalComponent_WhenFeatureEnabled() throws Exception {
Class<?>[] classes = { FlagView.class, ExampleExperimentalComponent.class };
File propertiesDir = temporaryFolder.newFolder();
FileUtils.write(new File(propertiesDir, FeatureFlags.PROPERTIES_FILENAME), "com.vaadin.experimental.exampleFeatureFlag=true\n", StandardCharsets.UTF_8);
Lookup mockedLookup = Mockito.mock(Lookup.class);
ClassFinder finder = NodeUpdateTestUtil.getClassFinder(classes);
Mockito.doReturn(finder).when(mockedLookup).lookup(ClassFinder.class);
Builder builder = new Builder(mockedLookup, new File(userDir), TARGET).enablePackagesUpdate(false).enableImportsUpdate(true).runNpmInstall(false).withEmbeddableWebComponents(false).setJavaResourceFolder(propertiesDir);
builder.build().execute();
File importsFile = Paths.get(userDir, TARGET, DEFAULT_GENERATED_DIR, IMPORTS_NAME).toFile();
String content = FileUtils.readFileToString(importsFile, Charset.defaultCharset());
assertTrue(content.contains("@vaadin/example-flag/experimental-module-1.js"));
assertTrue(content.contains("@vaadin/example-flag/experimental-module-2.js"));
assertTrue(content.contains("experimental-Connector.js"));
}
use of com.vaadin.flow.server.frontend.scanner.ClassFinder in project flow by vaadin.
the class NodeTasksTest method should_ExcludeExperimentalComponent_WhenFeatureDisabled.
@Test
public void should_ExcludeExperimentalComponent_WhenFeatureDisabled() throws Exception {
Class<?>[] classes = { FlagView.class, ExampleExperimentalComponent.class };
Lookup mockedLookup = Mockito.mock(Lookup.class);
ClassFinder finder = NodeUpdateTestUtil.getClassFinder(classes);
Mockito.doReturn(finder).when(mockedLookup).lookup(ClassFinder.class);
Builder builder = new Builder(mockedLookup, new File(userDir), TARGET).enablePackagesUpdate(false).enableImportsUpdate(true).runNpmInstall(false).withEmbeddableWebComponents(false);
assertEquals(1, finder.getAnnotatedClasses(JsModule.class).size());
assertEquals(1, finder.getAnnotatedClasses(JavaScript.class).size());
builder.build().execute();
File importsFile = Paths.get(userDir, TARGET, DEFAULT_GENERATED_DIR, IMPORTS_NAME).toFile();
String content = FileUtils.readFileToString(importsFile, Charset.defaultCharset());
assertFalse(content.contains("@vaadin/example-flag/experimental-module-1.js"));
assertFalse(content.contains("@vaadin/example-flag/experimental-module-2.js"));
assertFalse(content.contains("experimental-Connector.js"));
}
use of com.vaadin.flow.server.frontend.scanner.ClassFinder in project flow by vaadin.
the class AbstractUpdateImportsTest method setup.
@Before
public void setup() throws Exception {
tmpRoot = temporaryFolder.getRoot();
logger = new MockLogger();
frontendDirectory = new File(tmpRoot, DEFAULT_FRONTEND_DIR);
nodeModulesPath = new File(tmpRoot, NODE_MODULES);
generatedPath = new File(tmpRoot, Paths.get(TARGET, DEFAULT_GENERATED_DIR).toString());
File tokenFile = new File(tmpRoot, TOKEN_FILE);
ClassFinder classFinder = getClassFinder();
updater = new UpdateImports(classFinder, getScanner(classFinder), tmpRoot, tokenFile, true);
assertTrue(nodeModulesPath.mkdirs());
createExpectedImports(frontendDirectory, nodeModulesPath);
assertTrue(new File(nodeModulesPath, FLOW_NPM_PACKAGE_NAME + "ExampleConnector.js").exists());
}
Aggregations