From ec27c8b973bad97c9632727015c16653727c0029 Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sat, 12 Jun 2021 22:21:53 -0300 Subject: [PATCH 1/8] Remove interactive flag from microfrontend ci test. --- .github/workflows/jdl.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jdl.yml b/.github/workflows/jdl.yml index a2c5c269310..c42d2a80b87 100644 --- a/.github/workflows/jdl.yml +++ b/.github/workflows/jdl.yml @@ -66,7 +66,7 @@ jobs: - jdl: blog-store-microfrontend environment: prod # Use monorepository for diff - extra-args: --workspaces --monorepository --interactive + extra-args: --workspaces --monorepository new-extra-args: --microfrontend # Backend is failing, disable it skip-backend-tests: 1 From cc5a270c129e29f5653d338524ce46f188b1c643 Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sat, 12 Jun 2021 22:34:19 -0300 Subject: [PATCH 2/8] Throw error for microfrontend with framework different from angular --- generators/client/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/generators/client/index.js b/generators/client/index.js index aac716a6f82..4adbc133c60 100644 --- a/generators/client/index.js +++ b/generators/client/index.js @@ -197,6 +197,12 @@ module.exports = class JHipsterClientGenerator extends BaseBlueprintGenerator { this.loadTranslationConfig(); }, + checkMicrofrontend() { + if (this.microfrontend && !this.clientFrameworkAngular) { + throw new Error(`Microfrontend requires ${ANGULAR} client framework.`); + } + }, + validateSkipServer() { if ( this.jhipsterConfig.skipServer && From 02795fa5f503bc89b8b88d93d50fea0280e166a4 Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sat, 12 Jun 2021 22:49:45 -0300 Subject: [PATCH 3/8] Add generator tests for microfrontend. --- test/__snapshots__/server.spec.js.snap | 531 +++++++++++++ .../client/__snapshots__/angular.spec.js.snap | 747 ++++++++++++++++++ test/client/angular.spec.js | 25 + test/client/react.spec.js | 30 + test/client/vue.spec.js | 30 + test/server.spec.js | 23 + 6 files changed, 1386 insertions(+) create mode 100644 test/__snapshots__/server.spec.js.snap create mode 100644 test/client/__snapshots__/angular.spec.js.snap create mode 100644 test/client/angular.spec.js create mode 100644 test/client/react.spec.js create mode 100644 test/client/vue.spec.js diff --git a/test/__snapshots__/server.spec.js.snap b/test/__snapshots__/server.spec.js.snap new file mode 100644 index 00000000000..07e31c6b270 --- /dev/null +++ b/test/__snapshots__/server.spec.js.snap @@ -0,0 +1,531 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`JHipster server generator microfrontend should match generated files snapshot 1`] = ` +Object { + ".editorconfig": Object { + "stateCleared": "modified", + }, + ".gitattributes": Object { + "stateCleared": "modified", + }, + ".gitignore": Object { + "stateCleared": "modified", + }, + ".huskyrc": Object { + "stateCleared": "modified", + }, + ".lintstagedrc.js": Object { + "stateCleared": "modified", + }, + ".mvn/wrapper/MavenWrapperDownloader.java": Object { + "stateCleared": "modified", + }, + ".mvn/wrapper/maven-wrapper.jar": Object { + "stateCleared": "modified", + }, + ".mvn/wrapper/maven-wrapper.properties": Object { + "stateCleared": "modified", + }, + ".prettierignore": Object { + "stateCleared": "modified", + }, + ".prettierrc": Object { + "stateCleared": "modified", + }, + ".yo-rc.json": Object { + "stateCleared": "modified", + }, + "README.md": Object { + "stateCleared": "modified", + }, + "checkstyle.xml": Object { + "stateCleared": "modified", + }, + "mvnw": Object { + "stateCleared": "modified", + }, + "mvnw.cmd": Object { + "stateCleared": "modified", + }, + "npmw": Object { + "stateCleared": "modified", + }, + "npmw.cmd": Object { + "stateCleared": "modified", + }, + "package.json": Object { + "stateCleared": "modified", + }, + "pom.xml": Object { + "stateCleared": "modified", + }, + "sonar-project.properties": Object { + "stateCleared": "modified", + }, + "src/main/docker/app.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/dashboards/JVM.json": Object { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/dashboards/dashboard.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/grafana/provisioning/datasources/datasource.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/jhipster-control-center.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/jib/entrypoint.sh": Object { + "stateCleared": "modified", + }, + "src/main/docker/monitoring.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/postgresql.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/prometheus/prometheus.yml": Object { + "stateCleared": "modified", + }, + "src/main/docker/sonar.yml": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/ApplicationWebXml.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/GeneratedByJHipster.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/JhipsterApp.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/aop/logging/LoggingAspect.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/ApplicationProperties.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/AsyncConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/CacheConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/Constants.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/DatabaseConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/DateTimeFormatConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/JacksonConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LiquibaseConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LocaleConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LoggingAspectConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/LoggingConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/SecurityConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/StaticResourcesWebConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/WebConfigurer.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/config/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/AbstractAuditingEntity.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/Authority.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/User.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/domain/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/AuthorityRepository.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/UserRepository.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/repository/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/AuthoritiesConstants.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/DomainUserDetailsService.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/SecurityUtils.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/SpringSecurityAuditorAware.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/UserNotActivatedException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/jwt/JWTConfigurer.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/jwt/JWTFilter.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/jwt/TokenProvider.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/security/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/EmailAlreadyUsedException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/InvalidPasswordException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/MailService.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/UserService.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/UsernameAlreadyUsedException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/AdminUserDTO.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/PasswordChangeDTO.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/UserDTO.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/dto/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/UserMapper.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/mapper/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/service/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/AccountResource.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/ClientForwardController.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/PublicUserResource.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/UserJWTController.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/UserResource.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/BadRequestAlertException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/EmailAlreadyUsedException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/ErrorConstants.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslator.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/FieldErrorVM.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/InvalidPasswordException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/LoginAlreadyUsedException.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/errors/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/KeyAndPasswordVM.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/LoginVM.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/ManagedUserVM.java": Object { + "stateCleared": "modified", + }, + "src/main/java/com/mycompany/myapp/web/rest/vm/package-info.java": Object { + "stateCleared": "modified", + }, + "src/main/resources/.h2.server.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/banner.txt": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/application-dev.yml": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/application-prod.yml": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/application-tls.yml": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/application.yml": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/authority.csv": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/user.csv": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/data/user_authority.csv": Object { + "stateCleared": "modified", + }, + "src/main/resources/config/liquibase/master.xml": Object { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_en.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_fr.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/logback-spring.xml": Object { + "stateCleared": "modified", + }, + "src/main/resources/templates/error.html": Object { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/activationEmail.html": Object { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/creationEmail.html": Object { + "stateCleared": "modified", + }, + "src/main/resources/templates/mail/passwordResetEmail.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/activate.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/configuration.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/error.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/global.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/health.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/home.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/login.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/logs.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/metrics.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/password.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/register.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/reset.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/sessions.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/settings.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/user-management.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/activate.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/configuration.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/error.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/global.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/health.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/home.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/login.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/logs.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/metrics.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/password.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/register.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/reset.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/sessions.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/settings.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/user-management.json": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/ArchTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/IntegrationTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/NoOpMailConfiguration.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/StaticResourcesWebConfigurerTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/WebConfigurerTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/WebConfigurerTestController.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/config/timezone/HibernateTimeZoneIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/repository/timezone/DateTimeWrapper.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/repository/timezone/DateTimeWrapperRepository.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/DomainUserDetailsServiceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/SecurityUtilsUnitTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/JWTFilterTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/security/jwt/TokenProviderTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/MailServiceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/UserServiceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/service/mapper/UserMapperTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/AccountResourceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/ClientForwardControllerTest.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/PublicUserResourceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/TestUtil.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/UserJWTControllerIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/UserResourceIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/WithUnauthenticatedMockUser.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslatorIT.java": Object { + "stateCleared": "modified", + }, + "src/test/java/com/mycompany/myapp/web/rest/errors/ExceptionTranslatorTestController.java": Object { + "stateCleared": "modified", + }, + "src/test/resources/config/application-testcontainers.yml": Object { + "stateCleared": "modified", + }, + "src/test/resources/config/application.yml": Object { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_en.properties": Object { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_fr.properties": Object { + "stateCleared": "modified", + }, + "src/test/resources/logback.xml": Object { + "stateCleared": "modified", + }, + "src/test/resources/templates/mail/testEmail.html": Object { + "stateCleared": "modified", + }, +} +`; diff --git a/test/client/__snapshots__/angular.spec.js.snap b/test/client/__snapshots__/angular.spec.js.snap new file mode 100644 index 00000000000..a78978fc16e --- /dev/null +++ b/test/client/__snapshots__/angular.spec.js.snap @@ -0,0 +1,747 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`JHipster angular generator microfrontend should match generated files snapshot 1`] = ` +Object { + ".browserslistrc": Object { + "stateCleared": "modified", + }, + ".editorconfig": Object { + "stateCleared": "modified", + }, + ".eslintignore": Object { + "stateCleared": "modified", + }, + ".eslintrc.json": Object { + "stateCleared": "modified", + }, + ".gitattributes": Object { + "stateCleared": "modified", + }, + ".gitignore": Object { + "stateCleared": "modified", + }, + ".huskyrc": Object { + "stateCleared": "modified", + }, + ".lintstagedrc.js": Object { + "stateCleared": "modified", + }, + ".npmrc": Object { + "stateCleared": "modified", + }, + ".prettierignore": Object { + "stateCleared": "modified", + }, + ".prettierrc": Object { + "stateCleared": "modified", + }, + ".yo-rc.json": Object { + "stateCleared": "modified", + }, + "README.md": Object { + "stateCleared": "modified", + }, + "angular.json": Object { + "stateCleared": "modified", + }, + "jest.conf.js": Object { + "stateCleared": "modified", + }, + "ngsw-config.json": Object { + "stateCleared": "modified", + }, + "package.json": Object { + "stateCleared": "modified", + }, + "sonar-project.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_en.properties": Object { + "stateCleared": "modified", + }, + "src/main/resources/i18n/messages_fr.properties": Object { + "stateCleared": "modified", + }, + "src/main/webapp/404.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/WEB-INF/web.xml": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/admin-routing.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/configuration/configuration.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/docs/docs.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/docs/docs.component.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/docs/docs.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/docs/docs.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/docs/docs.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/health.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/modal/health-modal.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/health/modal/health-modal.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/log.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/logs/logs.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/admin/metrics/metrics.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/app-routing.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/app.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/app.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/authority.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/datepicker-adapter.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/dayjs.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/error.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/font-awesome-icons.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/input.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/language.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/pagination.constants.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/translation.config.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/config/uib-pagination.config.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/account.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/account.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/account.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/auth-session.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/state-storage.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/auth/user-route-access.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/config/application-config.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/config/application-config.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/interceptor/auth-expired.interceptor.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/interceptor/error-handler.interceptor.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/interceptor/index.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/interceptor/notification.interceptor.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/request/request-util.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/request/request.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/alert.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/alert.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/data-util.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/data-util.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/event-manager.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/event-manager.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/operators.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/operators.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/parse-links.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/core/util/parse-links.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/entities/entity-routing.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/entities/user/user.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/entities/user/user.service.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/entities/user/user.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.component.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/home/home.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/error/error.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/error/error.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/error/error.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/footer/footer.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/footer/footer.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/main/main.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/main/main.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/main/main.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/active-menu.directive.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/navbar.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/navbar.component.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/navbar.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/navbar.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/navbar/navbar.route.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/profiles/page-ribbon.component.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/profiles/page-ribbon.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/profiles/profile-info.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/layouts/profiles/profile.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/login/login.service.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/login/logout.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert-error.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert-error.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert-error.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert-error.model.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert.component.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/alert/alert.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/auth/has-any-authority.directive.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/date/duration.pipe.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/date/format-medium-date.pipe.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/language/find-language-from-key.pipe.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/language/translate.directive.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/language/translate.directive.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/pagination/item-count.component.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/pagination/item-count.component.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/shared-libs.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/shared.module.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/sort/sort-by.directive.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/sort/sort-by.directive.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/sort/sort.directive.spec.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/app/shared/sort/sort.directive.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/bootstrap.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/css/loading.css": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_0.svg": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_0_head-192.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_0_head-256.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_0_head-384.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_0_head-512.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_1.svg": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_1_head-192.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_1_head-256.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_1_head-384.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_1_head-512.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_2.svg": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_2_head-192.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_2_head-256.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_2_head-384.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_2_head-512.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_3.svg": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_3_head-192.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_3_head-256.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_3_head-384.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/jhipster_family_member_3_head-512.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/images/logo-jhipster.png": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/scss/_bootstrap-variables.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/scss/global.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/content/scss/vendor.scss": Object { + "stateCleared": "modified", + }, + "src/main/webapp/favicon.ico": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/activate.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/configuration.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/error.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/global.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/health.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/home.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/login.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/logs.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/metrics.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/password.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/register.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/reset.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/sessions.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/settings.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/en/user-management.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/activate.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/configuration.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/error.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/global.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/health.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/home.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/login.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/logs.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/metrics.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/password.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/register.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/reset.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/sessions.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/settings.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/i18n/fr/user-management.json": Object { + "stateCleared": "modified", + }, + "src/main/webapp/index.html": Object { + "stateCleared": "modified", + }, + "src/main/webapp/main.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/manifest.webapp": Object { + "stateCleared": "modified", + }, + "src/main/webapp/polyfills.ts": Object { + "stateCleared": "modified", + }, + "src/main/webapp/robots.txt": Object { + "stateCleared": "modified", + }, + "src/main/webapp/swagger-ui/dist/images/throbber.gif": Object { + "stateCleared": "modified", + }, + "src/main/webapp/swagger-ui/index.html": Object { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_en.properties": Object { + "stateCleared": "modified", + }, + "src/test/resources/i18n/messages_fr.properties": Object { + "stateCleared": "modified", + }, + "tsconfig.app.json": Object { + "stateCleared": "modified", + }, + "tsconfig.json": Object { + "stateCleared": "modified", + }, + "tsconfig.spec.json": Object { + "stateCleared": "modified", + }, + "webpack/environment.js": Object { + "stateCleared": "modified", + }, + "webpack/logo-jhipster.png": Object { + "stateCleared": "modified", + }, + "webpack/proxy.conf.js": Object { + "stateCleared": "modified", + }, + "webpack/webpack.custom.js": Object { + "stateCleared": "modified", + }, + "webpack/webpack.microfrontend.js": Object { + "stateCleared": "modified", + }, +} +`; diff --git a/test/client/angular.spec.js b/test/client/angular.spec.js new file mode 100644 index 00000000000..7eabb57d4a1 --- /dev/null +++ b/test/client/angular.spec.js @@ -0,0 +1,25 @@ +const expect = require('expect'); +const path = require('path'); +const { skipPrettierHelpers: helpers } = require('../utils/utils'); + +describe('JHipster angular generator', () => { + describe('microfrontend', () => { + let runResult; + before(async () => { + runResult = await helpers + .create(path.join(__dirname, '../../generators/client')) + .withOptions({ + skipInstall: true, + auth: 'oauth2', + microfrontend: true, + enableTranslation: true, + nativeLanguage: 'en', + languages: ['fr', 'en'], + }) + .run(); + }); + it('should match generated files snapshot', () => { + expect(runResult.getStateSnapshot()).toMatchSnapshot(); + }); + }); +}); diff --git a/test/client/react.spec.js b/test/client/react.spec.js new file mode 100644 index 00000000000..2579ff447f9 --- /dev/null +++ b/test/client/react.spec.js @@ -0,0 +1,30 @@ +const expect = require('expect'); +const path = require('path'); +const { skipPrettierHelpers: helpers } = require('../utils/utils'); + +const { + SUPPORTED_CLIENT_FRAMEWORKS: { REACT }, +} = require('../../generators/generator-constants'); + +const commonOptions = { clientFramework: REACT }; + +describe('JHipster vue generator', () => { + describe('microfrontend', () => { + it('should not succeed', async () => { + await expect( + helpers + .create(path.join(__dirname, '../../generators/client')) + .withOptions({ + skipInstall: true, + auth: 'oauth2', + microfrontend: true, + enableTranslation: true, + nativeLanguage: 'en', + languages: ['fr', 'en'], + ...commonOptions, + }) + .run() + ).rejects.toThrow('Microfrontend requires angularX client framework.'); + }); + }); +}); diff --git a/test/client/vue.spec.js b/test/client/vue.spec.js new file mode 100644 index 00000000000..b665b6c474b --- /dev/null +++ b/test/client/vue.spec.js @@ -0,0 +1,30 @@ +const expect = require('expect'); +const path = require('path'); +const { skipPrettierHelpers: helpers } = require('../utils/utils'); + +const { + SUPPORTED_CLIENT_FRAMEWORKS: { VUE }, +} = require('../../generators/generator-constants'); + +const commonOptions = { clientFramework: VUE }; + +describe('JHipster vue generator', () => { + describe('microfrontend', () => { + it('should not succeed', async () => { + await expect( + helpers + .create(path.join(__dirname, '../../generators/client')) + .withOptions({ + skipInstall: true, + auth: 'oauth2', + microfrontend: true, + enableTranslation: true, + nativeLanguage: 'en', + languages: ['fr', 'en'], + ...commonOptions, + }) + .run() + ).rejects.toThrow('Microfrontend requires angularX client framework.'); + }); + }); +}); diff --git a/test/server.spec.js b/test/server.spec.js index dc262edd76a..bd72671fc24 100644 --- a/test/server.spec.js +++ b/test/server.spec.js @@ -1,6 +1,8 @@ +const expect = require('expect'); const path = require('path'); const assert = require('yeoman-assert'); const helpers = require('yeoman-test'); + const getFilesForOptions = require('./utils/utils').getFilesForOptions; const expectedFiles = require('./utils/expected-files'); const angularfiles = require('../generators/client/files-angular').files; @@ -105,4 +107,25 @@ describe('JHipster server generator', () => { ); }); }); + + describe('microfrontend', () => { + let runResult; + before(async () => { + runResult = await helpers + .create(path.join(__dirname, '../generators/server')) + .withOptions({ + baseName: 'jhipster', + skipInstall: true, + auth: 'oauth2', + microfrontend: true, + enableTranslation: true, + nativeLanguage: 'en', + languages: ['fr', 'en'], + }) + .run(); + }); + it('should match generated files snapshot', () => { + expect(runResult.getStateSnapshot()).toMatchSnapshot(); + }); + }); }); From 4eab0057052718f1630b1e0b7fef9b7096048ace Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sun, 13 Jun 2021 11:40:28 -0300 Subject: [PATCH 4/8] Use gateway server port at microfrontends --- cli/import-jdl.js | 24 ++++++++++++------- .../angular/webpack/proxy.conf.js.ejs | 4 ++-- generators/generator-base.js | 1 + 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cli/import-jdl.js b/cli/import-jdl.js index 94a52986a92..8800f54974e 100644 --- a/cli/import-jdl.js +++ b/cli/import-jdl.js @@ -414,22 +414,28 @@ class JDLProcessor { return Promise.resolve(); } - applicationsWithEntities.forEach((applicationWithEntities, idx) => { - applicationWithEntities.config.applicationIndex = idx; - }); + const allApplications = Object.fromEntries( + applicationsWithEntities.map((applicationWithEntities, applicationIndex) => { + applicationWithEntities.config.applicationIndex = applicationIndex; + return [applicationWithEntities.config.baseName, applicationWithEntities.config]; + }) + ); - const allApplications = applicationsWithEntities.map(applicationWithEntities => [ - applicationWithEntities.config.baseName, - { applicationIndex: applicationWithEntities.config.applicationIndex, serverPort: applicationWithEntities.config.serverPort }, - ]); applicationsWithEntities.forEach((applicationWithEntities, idx) => { - const relatedApplications = allApplications.filter( + const relatedApplications = Object.entries(allApplications).filter( ([baseName]) => applicationWithEntities.config.baseName !== baseName && applicationWithEntities.entities.find(entity => entity.microserviceName === baseName) ); + const { serverPort: gatewayServerPort } = applicationWithEntities.config; if (relatedApplications.length > 0) { - applicationWithEntities.config.applications = Object.fromEntries(relatedApplications); + applicationWithEntities.config.applications = Object.fromEntries( + relatedApplications.map(([baseName, config]) => { + config.gatewayServerPort = gatewayServerPort; + const { serverPort, applicationIndex } = config; + return [baseName, { serverPort, applicationIndex }]; + }) + ); } }); diff --git a/generators/client/templates/angular/webpack/proxy.conf.js.ejs b/generators/client/templates/angular/webpack/proxy.conf.js.ejs index 03864350695..9f09c0747e2 100644 --- a/generators/client/templates/angular/webpack/proxy.conf.js.ejs +++ b/generators/client/templates/angular/webpack/proxy.conf.js.ejs @@ -35,14 +35,14 @@ function setupProxy() { '/auth', '/health', ], - target: `http${tls ? 's' : ''}://localhost:<%= serverPort %>`, + target: `http${tls ? 's' : ''}://localhost:<%= applicationTypeMicroservice ? gatewayServerPort : serverPort %>`, secure: false, changeOrigin: tls, }, <%_ if (communicationSpringWebsocket) { _%> { context: ['/websocket'], - target: 'ws://127.0.0.1:<%= serverPort %>', + target: 'ws://127.0.0.1:<%= applicationTypeMicroservice ? gatewayServerPort : serverPort %>', ws: true, }, <%_ } _%> diff --git a/generators/generator-base.js b/generators/generator-base.js index 101f30e519a..5b2a4df484b 100644 --- a/generators/generator-base.js +++ b/generators/generator-base.js @@ -2481,6 +2481,7 @@ templates: ${JSON.stringify(existingTemplates, null, 2)}`; dest.skipJhipsterDependencies = !!config.skipJhipsterDependencies; dest.withAdminUi = config.withAdminUi; dest.microfrontend = config.microfrontend; + dest.gatewayServerPort = config.gatewayServerPort; dest.testFrameworks = config.testFrameworks || []; dest.cypressCoverage = config.cypressCoverage; From 3b87d3b7a2045508b7480867b1dc3c57adbe921c Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sun, 13 Jun 2021 16:57:37 -0300 Subject: [PATCH 5/8] Update jdl workflow. --- .github/workflows/jdl.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/jdl.yml b/.github/workflows/jdl.yml index c42d2a80b87..eb0f353c5b7 100644 --- a/.github/workflows/jdl.yml +++ b/.github/workflows/jdl.yml @@ -66,8 +66,7 @@ jobs: - jdl: blog-store-microfrontend environment: prod # Use monorepository for diff - extra-args: --workspaces --monorepository - new-extra-args: --microfrontend + extra-args: --workspaces --monorepository --microfrontend # Backend is failing, disable it skip-backend-tests: 1 skip-frontend-tests: 0 From c971415c1fc1481daa69db489e32b14ca0e44968 Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sun, 13 Jun 2021 17:35:42 -0300 Subject: [PATCH 6/8] Adjust index.html for microfrontends. --- .../src/main/resources/static/microservices_index.html.ejs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/generators/server/templates/src/main/resources/static/microservices_index.html.ejs b/generators/server/templates/src/main/resources/static/microservices_index.html.ejs index 49992eee8d1..1f1b50de68a 100644 --- a/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +++ b/generators/server/templates/src/main/resources/static/microservices_index.html.ejs @@ -77,7 +77,12 @@

This application is a microservice, which has been generated using JHipster.

    +<%_ if (microfrontend) { %> +
  • Microfrontends packages doesn't provide a stand-alone front-end. Packaged microfrontend should be accessed through a JHipster gateway.
  • +
  • Stand-alone development server can be started by `npm start`.
  • +<%_ } else { %>
  • It does not have a front-end. The front-end should be generated on a JHipster gateway.
  • +<%_ } %>
  • It is serving REST APIs, under the '/api' URLs.
  • To manage this microservice, you will probably want to use the JHipster Registry:
      From c2a00be3ce15c674c02cc94e16ccb019e19138a6 Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Sun, 13 Jun 2021 19:40:23 -0300 Subject: [PATCH 7/8] Fix microfrontend translation load. --- .../entities/entity-management.module.ts.ejs | 61 ++++++++++++++----- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs b/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs index bb96c5977ba..5b3726603da 100644 --- a/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +++ b/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs @@ -17,7 +17,13 @@ limitations under the License. -%> import { NgModule } from '@angular/core'; +<%_ if (applicationTypeMicroservice && enableTranslation) { _%> +import { HttpClient } from '@angular/common/http'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +<%_ } _%> import { SharedModule } from 'app/shared/shared.module'; import { <%= entityAngularName %>Component } from './list/<%= entityFileName %>.component'; import { <%= entityAngularName %>DetailComponent } from './detail/<%= entityFileName %>-detail.component'; @@ -27,23 +33,50 @@ import { <%= entityAngularName %>DeleteDialogComponent } from './delete/<%= enti <%_ } _%> import { <%= entityAngularName %>RoutingModule } from './route/<%= entityFileName %>-routing.module'; +<%_ if (applicationTypeMicroservice && enableTranslation) { _%> +function translatePartialLoader(http: HttpClient, applicationConfigService: ApplicationConfigService): TranslateLoader { + const prefix = applicationConfigService.getEndpointFor('i18n/', '<%= microserviceName %>'); + return new TranslateHttpLoader(http, prefix, `.json`); +} + +<%_ } _%> @NgModule({ - imports: [ - SharedModule, - <%= entityAngularName %>RoutingModule, - ], - declarations: [ - <%= entityAngularName %>Component, - <%= entityAngularName %>DetailComponent, + imports: [ + SharedModule, + <%= entityAngularName %>RoutingModule, +<%_ if (applicationTypeMicroservice && enableTranslation) { _%> + TranslateModule.forChild({ + loader: { + provide: TranslateLoader, + useFactory: (translatePartialLoader), + deps: [HttpClient, ApplicationConfigService] + }, + isolate: false, + extend: true, + }), +<%_ } _%> + ], + declarations: [ + <%= entityAngularName %>Component, + <%= entityAngularName %>DetailComponent, <%_ if (!readOnly) { _%> - <%= entityAngularName %>UpdateComponent, - <%= entityAngularName %>DeleteDialogComponent, + <%= entityAngularName %>UpdateComponent, + <%= entityAngularName %>DeleteDialogComponent, <%_ } %> - ], + ], <%_ if (!readOnly) { _%> - entryComponents: [ - <%= entityAngularName %>DeleteDialogComponent - ] + entryComponents: [ + <%= entityAngularName %>DeleteDialogComponent + ] <%_ } _%> }) -export class <%= locals.microserviceName ? upperFirstCamelCase(locals.microserviceName) : '' %><%= entityAngularName %>Module {} +export class <%= locals.microserviceName ? upperFirstCamelCase(locals.microserviceName) : '' %><%= entityAngularName %>Module { +<%_ if (applicationTypeMicroservice && enableTranslation) { _%> + constructor(private translateService: TranslateService, private translateLoader: TranslateLoader) { + const currentLang = translateService.store.currentLang; + this.translateLoader.getTranslation(currentLang).subscribe(translation => { + this.translateService.setTranslation(currentLang, translation); + }); + } +<%_ } _%> +} From 9653efbf5f97c0d2b931fda0e910cec7d706982f Mon Sep 17 00:00:00 2001 From: Daniel Franco Date: Mon, 14 Jun 2021 09:38:50 +0100 Subject: [PATCH 8/8] Update generators/server/templates/src/main/resources/static/microservices_index.html.ejs Co-authored-by: Mathieu ABOU-AICHI --- .../src/main/resources/static/microservices_index.html.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/server/templates/src/main/resources/static/microservices_index.html.ejs b/generators/server/templates/src/main/resources/static/microservices_index.html.ejs index 1f1b50de68a..1190514dfbb 100644 --- a/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +++ b/generators/server/templates/src/main/resources/static/microservices_index.html.ejs @@ -78,7 +78,7 @@
        <%_ if (microfrontend) { %> -
      • Microfrontends packages doesn't provide a stand-alone front-end. Packaged microfrontend should be accessed through a JHipster gateway.
      • +
      • Microfrontends packages don't provide a stand-alone front-end. Packaged microfrontend should be accessed through a JHipster gateway.
      • Stand-alone development server can be started by `npm start`.
      • <%_ } else { %>
      • It does not have a front-end. The front-end should be generated on a JHipster gateway.