diff --git a/3rdparty/pom.xml b/3rdparty/pom.xml new file mode 100644 index 000000000..cc1b0cf48 --- /dev/null +++ b/3rdparty/pom.xml @@ -0,0 +1,638 @@ + + + + + 4.0.0 + + io.helidon + helidon-bom + 1.2.2-SNAPSHOT + ../bom/pom.xml + + helidon-3rdparty + pom + + Helidon 3rd Party Management + Distributed 3party dependency management + + + + 1.2.0 + 1.3.1 + 4.5.5 + 0.31.0 + 2.0 + 2.7.4 + 3.0.0 + 3.0.0 + 2.16.0 + 1.23.0 + 19.2.0 + 1.22.1 + 25.0-jre + 1.4.197 + 1.3 + 5.4.4.Final + 2.7.8 + 1 + + 2.9.9 + 2.9.9.20190807 + 0.34.0 + 2.2.2 + 2.1.1.Final + 2.3.0 + 2.3.0.1 + 2.3.2 + 2.1 + 7.6.0.Final + 2.9.0 + 2.29.1 + 1.0.1 + 1.1.2 + 1.1.2 + 5.1.0 + 1.3 + 2.0.1 + 1.1.1 + 1.1 + 2.0.1 + 1.1.2 + 2.0 + 1.3.1 + 1.3.3 + 2.23.4 + 8.0.11 + 5.9.3.Final + 4.1.39.Final + 1.5.2 + 19.3.0.0 + 0.31.0 + 0.0.12 + 2.2 + 0.6.0 + 3.5.1 + 1.0.2 + 3.1.5.RELEASE + 1.7.26 + 1.1.1 + 1.24 + 1.2 + 1.3.3 + 19.3.0.0 + 2.0.1.Final + 3.1.1.Final + 2.6.0 + 1.5.18 + 1.1.0 + 1.0.3 + + + + + + org.glassfish.jersey.core + jersey-server + ${version.lib.jersey} + + + org.glassfish.hk2.external + jakarta.inject + + + + + org.glassfish.jersey.inject + jersey-hk2 + ${version.lib.jersey} + + + org.glassfish.hk2.external + jakarta.inject + + + + + + com.fasterxml.jackson.core + jackson-annotations + ${version.lib.jackson} + + + io.jaegertracing + jaeger-client + ${version.lib.jaegertracing} + + + io.projectreactor + reactor-core + ${version.lib.reactor} + + + io.opentracing + opentracing-util + ${version.lib.opentracing} + + + io.opentracing + opentracing-api + ${version.lib.opentracing} + + + io.opentracing + opentracing-noop + ${version.lib.opentracing} + + + javax.xml.bind + jaxb-api + ${version.lib.jaxb-api} + + + com.sun.xml.bind + jaxb-core + ${version.lib.jaxb-core} + + + com.sun.xml.bind + jaxb-impl + ${version.lib.jaxb-impl} + + + javax.ws.rs + javax.ws.rs-api + ${version.lib.jaxrs-api} + + + javax.enterprise + cdi-api + ${version.lib.cdi-api} + + + javax.el + javax.el-api + ${version.lib.el-api} + + + javax.annotation + javax.annotation-api + ${version.lib.annotation-api} + + + javax.inject + javax.inject + ${version.lib.inject} + + + javax.json + javax.json-api + ${version.lib.jsonp-api} + + + jakarta.json.bind + jakarta.json.bind-api + ${version.lib.jsonb-api} + + + org.glassfish + javax.json + ${version.lib.jsonp-impl} + + + + org.glassfish + javax.el + ${version.lib.el-impl} + + + io.netty + netty-handler + ${version.lib.netty} + + + io.netty + netty-codec-dns + ${version.lib.netty} + + + io.netty + netty-resolver-dns + ${version.lib.netty} + + + io.netty + netty-codec-http + ${version.lib.netty} + + + io.netty + netty-codec-http2 + ${version.lib.netty} + + + org.eclipse + yasson + ${version.lib.yasson} + + + + + com.typesafe + config + ${version.lib.typesafe-config} + + + org.yaml + snakeyaml + ${version.lib.snakeyaml} + + + org.mousio + etcd4j + ${version.lib.etcd4j} + + + io.grpc + grpc-core + ${version.lib.grpc} + + + com.google.code.findbugs + jsr305 + + + + + io.grpc + grpc-context + ${version.lib.grpc} + + + io.grpc + grpc-protobuf + ${version.lib.grpc} + + + io.grpc + grpc-stub + ${version.lib.grpc} + + + io.grpc + grpc-services + ${version.lib.grpc} + + + io.grpc + grpc-netty + ${version.lib.grpc} + + + io.opentracing.contrib + opentracing-grpc + ${version.lib.opentracing.grpc} + + + com.google.protobuf + protobuf-java + ${version.lib.protobuf.java} + + + + + io.zipkin.reporter2 + zipkin-sender-urlconnection + ${version.lib.zipkin} + + + com.google.guava + guava + ${version.lib.guava} + + + io.prometheus + simpleclient + ${version.lib.prometheus} + + + io.opentracing.brave + brave-opentracing + ${version.lib.brave-opentracing} + + + org.reactivestreams + reactive-streams + ${version.lib.reactivestreams} + + + + + + org.apache.httpcomponents + httpclient + ${version.lib.apache-httpclient} + + + + com.google.api-client + google-api-client + ${version.lib.google-api-client} + + + + org.apache.httpcomponents + httpclient + + + + com.google.guava + guava-jdk5 + + + + com.fasterxml.jackson.core + jackson-core + + + + com.google.code.findbugs + jsr305 + + + + + + + org.jboss.weld.se + weld-se-core + ${version.lib.weld} + + + org.codehaus.groovy + groovy-all + + + + + org.jboss.weld + weld-core-bom + ${version.lib.weld} + pom + import + + + org.eclipse.microprofile.config + microprofile-config-api + ${version.lib.microprofile-config} + + + org.eclipse.microprofile.health + microprofile-health-api + ${version.lib.microprofile-health} + + + org.eclipse.microprofile.jwt + microprofile-jwt-auth-api + ${version.lib.microprofile-jwt} + + + org.eclipse.microprofile.fault-tolerance + microprofile-fault-tolerance-api + ${version.lib.microprofile-fault-tolerance-api} + + + org.eclipse.microprofile.opentracing + microprofile-opentracing-api + ${version.lib.microprofile-tracing} + + + org.eclipse.microprofile.rest.client + microprofile-rest-client-api + ${version.lib.microprofile-rest-client} + + + com.netflix.hystrix + hystrix-core + ${version.lib.hystrix} + + + net.jodah + failsafe + ${version.lib.failsafe} + + + org.jboss + jandex + ${version.lib.jandex} + + + + org.slf4j + slf4j-api + ${version.lib.slf4j} + + + org.slf4j + slf4j-jdk14 + ${version.lib.slf4j} + + + org.slf4j + slf4j-simple + ${version.lib.slf4j} + + + + io.smallrye + smallrye-open-api + ${version.lib.smallrye-openapi} + + + org.eclipse.microprofile.openapi + microprofile-openapi-api + ${version.lib.microprofile-openapi-api} + + + + + jakarta.persistence + jakarta.persistence-api + ${version.lib.jakarta-persistence-api} + + + javax.persistence + javax.persistence-api + ${version.lib.persistence-api} + + + javax.transaction + javax.transaction-api + ${version.lib.transaction-api} + + + javax.validation + validation-api + ${version.lib.validation-api} + + + com.h2database + h2 + ${version.lib.h2} + + + com.oracle.jdbc + ojdbc8 + ${version.lib.ojdbc8} + + + com.oracle.jdbc + ucp + ${version.lib.ucp} + + + mysql + mysql-connector-java + ${version.lib.mysql-connector-java} + + + com.oracle.oci.sdk + oci-java-sdk-objectstorage + ${version.lib.oci-java-sdk-objectstorage} + pom + + + org.glassfish.hk2.external + javax.inject + + + + + com.zaxxer + HikariCP + ${version.lib.hikaricp} + + + redis.clients + jedis + ${version.lib.jedis} + + + org.eclipse.persistence + org.eclipse.persistence.jpa + ${version.lib.eclipselink} + + + org.hibernate + hibernate-core + ${version.lib.hibernate} + + + org.jboss.narayana.jta + cdi + ${version.lib.narayana} + + + org.jboss.spec.javax.resource + jboss-connector-api_1.7_spec + + + sun.jdk + jconsole + + + + + org.jboss + jboss-transaction-spi + ${version.lib.jboss-transaction-spi} + + + org.jboss.spec.javax.resource + jboss-connector-api_1.7_spec + + + + + org.graalvm.sdk + graal-sdk + ${version.lib.graalvm} + + + com.oracle.substratevm + svm + ${version.lib.graalvm} + + + + + org.mockito + mockito-core + ${version.lib.mockito} + + + org.junit.jupiter + junit-jupiter-api + ${version.lib.junit} + + + org.junit.jupiter + junit-jupiter-params + ${version.lib.junit} + + + org.junit.jupiter + junit-jupiter-engine + ${version.lib.junit} + + + org.hamcrest + hamcrest-all + ${version.lib.hamcrest} + + + org.hamcrest + hamcrest-core + ${version.lib.hamcrest} + + + javax.activation + javax.activation-api + ${version.lib.activation-api} + + + + org.glassfish.jersey + jersey-bom + ${version.lib.jersey} + pom + import + + + com.fasterxml.jackson + jackson-bom + ${version.lib.jackson-bom} + pom + import + + + + diff --git a/applications/mp/pom.xml b/applications/mp/pom.xml new file mode 100644 index 000000000..b2588d65a --- /dev/null +++ b/applications/mp/pom.xml @@ -0,0 +1,76 @@ + + + + + 4.0.0 + + io.helidon.applications + helidon-applications-project + 1.2.2-SNAPSHOT + + helidon-mp + pom + Helidon MP applications parent pom + Parent pom for Helidon MP applications + + + 1.0.6 + 2.7.1.1 + io.helidon.microprofile.server.Main + + + + + + + org.jboss.jandex + jandex-maven-plugin + ${version.plugin.jandex} + + + make-index + + jandex + + process-classes + + + + + com.ethlo.persistence.tools + eclipselink-maven-plugin + ${version.plugin.eclipselink} + + + javax.annotation + javax.annotation-api + ${version.lib.annotation-api} + + + javax.xml.bind + jaxb-api + ${version.lib.jaxb-api} + + + + + + + diff --git a/applications/pom.xml b/applications/pom.xml new file mode 100644 index 000000000..78c2fd482 --- /dev/null +++ b/applications/pom.xml @@ -0,0 +1,185 @@ + + + + + 4.0.0 + + io.helidon + helidon-3rdparty + 1.2.2-SNAPSHOT + ../3rdparty/pom.xml + + io.helidon.applications + helidon-applications-project + pom + Helidon Applications Project + Maven boilerplate for Helidon applications + + + se + mp + + + + UTF-8 + UTF-8 + 8 + ${maven.compiler.source} + 3.8.1 + 3.0.0 + 1.6.0 + 2.19.1 + 1.0.10 + 3.0.2 + 1.5.0.Final + 0.5.1 + 2.7 + 1.0.3 + 2.19.1 + + + + ${project.artifactId} + + + kr.motd.maven + os-maven-plugin + ${version.plugin.os} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${version.plugin.compiler} + + + org.apache.maven.plugins + maven-surefire-plugin + ${version.plugin.surefire} + + + org.junit.platform + junit-platform-surefire-provider + ${version.plugin.surefire.provider.junit} + + + org.junit.jupiter + junit-jupiter-engine + ${version.lib.junit} + + + + + ${project.build.outputDirectory}/logging.properties + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${version.plugin.failsafe} + + true + + + + org.junit.platform + junit-platform-surefire-provider + ${version.plugin.surefire.provider.junit} + + + org.junit.jupiter + junit-jupiter-engine + ${version.lib.junit} + + + + + org.apache.maven.plugins + maven-dependency-plugin + ${version.plugin.dependency} + + + copy-libs + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + false + false + true + true + runtime + test + + + + + + org.apache.maven.plugins + maven-resources-plugin + ${version.plugin.resources} + + + org.apache.maven.plugins + maven-jar-plugin + ${version.plugin.jar} + + + + true + libs + ${mainClass} + true + + + + + + org.codehaus.mojo + exec-maven-plugin + ${version.plugin.exec} + + ${mainClass} + + + + io.helidon.build-tools + helidon-maven-plugin + ${version.plugin.helidon} + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${version.plugin.protobuf} + + com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${version.lib.grpc}:exe:${os.detected.classifier} + + + + + + diff --git a/applications/se/pom.xml b/applications/se/pom.xml new file mode 100644 index 000000000..f09ed2b9a --- /dev/null +++ b/applications/se/pom.xml @@ -0,0 +1,59 @@ + + + + + 4.0.0 + + io.helidon.applications + helidon-applications-project + 1.2.2-SNAPSHOT + + helidon-se + pom + Helidon SE applications parent pom + Parent pom for Helidon SE applications + + + + native-image + + + + io.helidon.build-tools + helidon-maven-plugin + + + + native-image + + + + + + + + + io.helidon.integrations.graal + helidon-graal-native-image-extension + + + + + diff --git a/archetypes/mp/src/main/resources/archetype-resources/pom.xml b/archetypes/mp/src/main/resources/archetype-resources/pom.xml index 7eaf3548d..92b095023 100644 --- a/archetypes/mp/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/mp/src/main/resources/archetype-resources/pom.xml @@ -4,165 +4,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + io.helidon.applications + helidon-mp + @project.version@ + + ${groupId} ${artifactId} ${version} - jar ${artifactId} - @project.version@ #if( $mainClass.matches("y|yes|true") ) ${package}.Main -#else - io.helidon.microprofile.server.Main -#end - ${symbol_dollar}{mainClass} - 8 - ${symbol_dollar}{maven.compiler.source} - libs - ${symbol_dollar}{project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 -#if( $unitTest.matches("y|yes|true") ) - -Dfile.encoding=UTF-8 #end - - ${symbol_dollar}{project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - org.jboss.jandex - jandex-maven-plugin - 1.0.6 - -#if( $unitTest.matches("y|yes|true") ) - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.junit.platform - junit-platform-surefire-provider - 1.1.0 - - - -#end - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${symbol_dollar}{libs.classpath.prefix} - ${symbol_dollar}{mainClass} - false - - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${symbol_dollar}{copied.libs.dir} - false - false - true - true - runtime - test - - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - process-classes - - - - - - - - - - io.helidon - helidon-bom - ${symbol_dollar}{helidon.version} - pom - import - - - org.jboss - jandex - 2.1.1.Final - - - javax.activation - javax.activation-api - 1.2.0 - -#if( $unitTest.matches("y|yes|true") ) - - org.junit.jupiter - junit-jupiter-api - 5.0.1 - - - org.junit.jupiter - junit-jupiter-engine - 5.0.1 - - - org.hamcrest - hamcrest-all - 1.3 - -#end - - - io.helidon.microprofile.bundles @@ -185,11 +43,30 @@ junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - #end + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/archetypes/pom.xml b/archetypes/pom.xml index c218caefe..688b12be3 100644 --- a/archetypes/pom.xml +++ b/archetypes/pom.xml @@ -71,4 +71,22 @@ + + + + + io.helidon.applications + helidon-se + ${project.version} + pom + true + + + io.helidon.applications + helidon-mp + ${project.version} + pom + true + + diff --git a/archetypes/se/src/main/resources/archetype-resources/pom.xml b/archetypes/se/src/main/resources/archetype-resources/pom.xml index 049e4097f..6c6cd9452 100644 --- a/archetypes/se/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/se/src/main/resources/archetype-resources/pom.xml @@ -4,127 +4,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + io.helidon.applications + helidon-se + @project.version@ + + ${groupId} ${artifactId} ${version} - jar ${artifactId} - @project.version@ -#if( $nativeImageSupport.matches("y|yes|true") ) - 1.0.10 -#end ${package}.Main - ${symbol_dollar}{mainClass} - 8 - ${symbol_dollar}{maven.compiler.source} - libs - ${symbol_dollar}{project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 -#if( $unitTest.matches("y|yes|true") ) - -Dfile.encoding=UTF-8 -#end - - - ${symbol_dollar}{project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - -#if( $unitTest.matches("y|yes|true") ) - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.junit.platform - junit-platform-surefire-provider - 1.1.0 - - - -#end - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${symbol_dollar}{libs.classpath.prefix} - ${symbol_dollar}{mainClass} - false - - - - -#if( $nativeImageSupport.matches("y|yes|true") ) - - io.helidon.build-tools - helidon-maven-plugin - ${symbol_dollar}{helidon.plugin.version} - -#end - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${symbol_dollar}{copied.libs.dir} - false - false - true - true - runtime - test - - - - - - - - - - - io.helidon - helidon-bom - ${symbol_dollar}{helidon.version} - pom - import - - - - io.helidon.webserver @@ -164,40 +58,20 @@ junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - #end -#if( $nativeImageSupport.matches("y|yes|true") ) - - - native-image - - - - io.helidon.build-tools - helidon-maven-plugin - - - - native-image - - - - - - - - - io.helidon.integrations.graal - helidon-graal-native-image-extension - - - - -#end + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/bom/pom.xml b/bom/pom.xml index a772e04c0..87bf85a40 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -22,403 +22,475 @@ 4.0.0 io.helidon - helidon-project + helidon-parent 1.2.2-SNAPSHOT + ../parent/pom.xml + io.helidon helidon-bom pom Helidon BOM POM + + 1.2.2-SNAPSHOT + + io.helidon.webserver helidon-webserver - ${project.version} + ${helidon.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} + ${helidon.version} io.helidon.webserver helidon-webserver-access-log - ${project.version} + ${helidon.version} io.helidon.metrics helidon-metrics-prometheus - ${project.version} + ${helidon.version} io.helidon.webserver helidon-webserver-test-support - ${project.version} + ${helidon.version} + + + + io.helidon.jersey + helidon-jersey-common + ${helidon.version} + + + io.helidon.jersey + helidon-jersey-server + ${helidon.version} + + + io.helidon.jersey + helidon-jersey-client + ${helidon.version} + + + io.helidon.jersey + helidon-jersey-media-jsonp + ${helidon.version} io.helidon.webclient helidon-webclient-jaxrs - ${project.version} + ${helidon.version} - + io.helidon.grpc helidon-grpc-client - ${project.version} + ${helidon.version} + + + io.helidon.grpc + io.grpc + ${helidon.version} + + + io.helidon.grpc + helidon-grpc-core + ${helidon.version} io.helidon.grpc helidon-grpc-server - ${project.version} + ${helidon.version} + + + io.helidon.grpc + helidon-grpc-metrics + ${helidon.version} io.helidon.media helidon-media-common - ${project.version} + ${helidon.version} io.helidon.media.jackson helidon-media-jackson-common - ${project.version} + ${helidon.version} io.helidon.media.jackson helidon-media-jackson-server - ${project.version} + ${helidon.version} io.helidon.media.jsonb helidon-media-jsonb-common - ${project.version} + ${helidon.version} io.helidon.media.jsonb helidon-media-jsonb-server - ${project.version} + ${helidon.version} io.helidon.media.jsonp helidon-media-jsonp-common - ${project.version} + ${helidon.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} + ${helidon.version} io.helidon.config helidon-config - ${project.version} + ${helidon.version} io.helidon.config helidon-config-yaml - ${project.version} + ${helidon.version} io.helidon.config helidon-config-git - ${project.version} + ${helidon.version} io.helidon.config helidon-config-hocon - ${project.version} + ${helidon.version} io.helidon.config helidon-config-etcd - ${project.version} + ${helidon.version} io.helidon.config helidon-config-testing - ${project.version} + ${helidon.version} io.helidon.config helidon-config-encryption - ${project.version} + ${helidon.version} io.helidon.config helidon-config-object-mapping - ${project.version} + ${helidon.version} io.helidon.security helidon-security - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} + ${helidon.version} + + + io.helidon.security.providers + helidon-security-providers-header + ${helidon.version} io.helidon.security.providers helidon-security-providers-google-login - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-oidc - ${project.version} + ${helidon.version} + + + io.helidon.security.providers + helidon-security-providers-oidc-common + ${helidon.version} io.helidon.security.providers helidon-security-providers-jwt - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-idcs-mapper - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-http-sign - ${project.version} + ${helidon.version} io.helidon.security.integration helidon-security-integration-common - ${project.version} + ${helidon.version} io.helidon.security.integration helidon-security-integration-grpc - ${project.version} + ${helidon.version} io.helidon.security.integration helidon-security-integration-jersey - ${project.version} + ${helidon.version} io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} + ${helidon.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} + ${helidon.version} io.helidon.security helidon-security-annotations - ${project.version} + ${helidon.version} io.helidon.security.providers helidon-security-providers-abac - ${project.version} + ${helidon.version} io.helidon.security.abac helidon-security-abac-time - ${project.version} + ${helidon.version} io.helidon.security.abac helidon-security-abac-role - ${project.version} + ${helidon.version} io.helidon.security.abac helidon-security-abac-scope - ${project.version} + ${helidon.version} io.helidon.security.abac helidon-security-abac-policy - ${project.version} + ${helidon.version} io.helidon.security.abac helidon-security-abac-policy-el - ${project.version} + ${helidon.version} io.helidon.security helidon-security-jwt - ${project.version} + ${helidon.version} + + + io.helidon.security + helidon-security-util + ${helidon.version} io.helidon.bundles helidon-bundles-config - ${project.version} + ${helidon.version} io.helidon.bundles helidon-bundles-webserver - ${project.version} + ${helidon.version} io.helidon.bundles helidon-bundles-jersey - ${project.version} + ${helidon.version} io.helidon.bundles helidon-bundles-security - ${project.version} + ${helidon.version} io.helidon.microprofile.bundles helidon-microprofile-1.1 - ${project.version} + ${helidon.version} io.helidon.microprofile.bundles helidon-microprofile-1.2 - ${project.version} + ${helidon.version} io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} + ${helidon.version} io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} + ${helidon.version} + + + io.helidon.microprofile.bundles + internal-test-libs + ${helidon.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} + ${helidon.version} io.helidon.microprofile helidon-microprofile-oidc - ${project.version} + ${helidon.version} io.helidon.microprofile.metrics helidon-microprofile-metrics - ${project.version} + ${helidon.version} io.helidon.microprofile.metrics helidon-microprofile-metrics2 - ${project.version} + ${helidon.version} io.helidon.microprofile.config helidon-microprofile-config - ${project.version} + ${helidon.version} io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} + ${helidon.version} io.helidon.microprofile helidon-microprofile-fault-tolerance - ${project.version} + ${helidon.version} io.helidon.microprofile.health helidon-microprofile-health - ${project.version} + ${helidon.version} io.helidon.microprofile.server helidon-microprofile-server - ${project.version} + ${helidon.version} io.helidon.microprofile helidon-microprofile-access-log - ${project.version} + ${helidon.version} io.helidon.metrics helidon-metrics - ${project.version} + ${helidon.version} io.helidon.metrics helidon-metrics2 - ${project.version} + ${helidon.version} io.helidon.health helidon-health - ${project.version} + ${helidon.version} io.helidon.health helidon-health-checks - ${project.version} + ${helidon.version} io.helidon.microprofile.jwt helidon-microprofile-jwt-auth - ${project.version} + ${helidon.version} io.helidon.microprofile.jwt helidon-microprofile-jwt-auth-cdi - ${project.version} + ${helidon.version} io.helidon.common helidon-common - ${project.version} + ${helidon.version} + + + io.helidon.common + helidon-common-http + ${helidon.version} io.helidon.common helidon-common-reactive - ${project.version} + ${helidon.version} io.helidon.common helidon-common-mapper - ${project.version} + ${helidon.version} io.helidon.common helidon-common-configurable - ${project.version} + ${helidon.version} io.helidon.common helidon-common-key-util - ${project.version} + ${helidon.version} io.helidon.common helidon-common-service-loader - ${project.version} + ${helidon.version} io.helidon.common helidon-common-context - ${project.version} + ${helidon.version} + + + io.helidon.common + helidon-common-metrics + ${helidon.version} @@ -426,183 +498,183 @@ io.helidon.tracing helidon-tracing - ${project.version} + ${helidon.version} io.helidon.tracing helidon-tracing-config - ${project.version} + ${helidon.version} io.helidon.tracing helidon-tracing-zipkin - ${project.version} + ${helidon.version} io.helidon.tracing helidon-tracing-jaeger - ${project.version} + ${helidon.version} io.helidon.tracing helidon-tracing-jersey-client - ${project.version} + ${helidon.version} io.helidon.tracing helidon-tracing-jersey - ${project.version} + ${helidon.version} io.helidon.microprofile.tracing helidon-microprofile-tracing - ${project.version} + ${helidon.version} io.helidon.microprofile.rest-client helidon-microprofile-rest-client - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-api - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-config-source - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp-accs - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp-localhost - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-system-kubernetes - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-system-oracle-accs - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp-accs - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp-localhost - ${project.version} + ${helidon.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp - ${project.version} + ${helidon.version} io.helidon.integrations.cdi - helidon-integrations-cdi-common-delegates - ${project.version} + helidon-integrations-cdi-delegates + ${helidon.version} io.helidon.integrations.cdi - helidon-integrations-cdi-common-reference-counted-context - ${project.version} + helidon-integrations-cdi-reference-counted-context + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource-ucp - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-eclipselink - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-hibernate - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-jedis - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-jpa - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-jpa-weld - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-jta - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-jta-weld - ${project.version} + ${helidon.version} io.helidon.integrations.cdi helidon-integrations-cdi-oci-objectstorage - ${project.version} + ${helidon.version} io.helidon.integrations.graal helidon-graal-native-image-extension - ${project.version} + ${helidon.version} io.helidon.openapi helidon-openapi - ${project.version} + ${helidon.version} io.helidon.microprofile.openapi helidon-microprofile-openapi - ${project.version} + ${helidon.version} diff --git a/bundles/config/pom.xml b/bundles/config/pom.xml index 9d47fac60..8f8e89647 100644 --- a/bundles/config/pom.xml +++ b/bundles/config/pom.xml @@ -42,22 +42,18 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} javax.annotation diff --git a/bundles/jersey/pom.xml b/bundles/jersey/pom.xml index 3be9fe760..f207ae6cb 100644 --- a/bundles/jersey/pom.xml +++ b/bundles/jersey/pom.xml @@ -42,12 +42,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} @@ -89,4 +87,4 @@ - \ No newline at end of file + diff --git a/bundles/security/pom.xml b/bundles/security/pom.xml index 5ec0e5798..9634df090 100644 --- a/bundles/security/pom.xml +++ b/bundles/security/pom.xml @@ -44,67 +44,54 @@ io.helidon.security helidon-security-annotations - ${project.version} io.helidon.security helidon-security - ${project.version} io.helidon.config helidon-config-encryption - ${project.version} io.helidon.security.providers helidon-security-providers-header - ${project.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} io.helidon.security.providers helidon-security-providers-http-sign - ${project.version} io.helidon.security.providers helidon-security-providers-jwt - ${project.version} io.helidon.security.providers helidon-security-providers-abac - ${project.version} io.helidon.security.providers helidon-security-providers-oidc - ${project.version} io.helidon.security.abac helidon-security-abac-time - ${project.version} io.helidon.security.abac helidon-security-abac-role - ${project.version} io.helidon.security.abac helidon-security-abac-scope - ${project.version} io.helidon.security.abac helidon-security-abac-policy - ${project.version} @@ -146,4 +133,4 @@ - \ No newline at end of file + diff --git a/bundles/webserver/pom.xml b/bundles/webserver/pom.xml index 1406aea78..1f63a47a5 100644 --- a/bundles/webserver/pom.xml +++ b/bundles/webserver/pom.xml @@ -42,12 +42,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} @@ -89,4 +87,4 @@ - \ No newline at end of file + diff --git a/common/configurable/pom.xml b/common/configurable/pom.xml index b7624478a..d0d0e0a20 100644 --- a/common/configurable/pom.xml +++ b/common/configurable/pom.xml @@ -33,27 +33,22 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-context - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common-service-loader - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} test diff --git a/common/context/pom.xml b/common/context/pom.xml index 66d962f08..5d8afe9e0 100644 --- a/common/context/pom.xml +++ b/common/context/pom.xml @@ -31,7 +31,6 @@ io.helidon.common helidon-common - ${project.version} org.junit.jupiter @@ -44,4 +43,4 @@ test - \ No newline at end of file + diff --git a/common/http/pom.xml b/common/http/pom.xml index e80a9d5c2..c546353a5 100644 --- a/common/http/pom.xml +++ b/common/http/pom.xml @@ -32,17 +32,14 @@ io.helidon.common helidon-common-reactive - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-context - ${project.version} org.junit.jupiter diff --git a/common/key-util/pom.xml b/common/key-util/pom.xml index d58159236..495675320 100644 --- a/common/key-util/pom.xml +++ b/common/key-util/pom.xml @@ -33,12 +33,10 @@ io.helidon.common helidon-common-configurable - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} test diff --git a/common/mapper/pom.xml b/common/mapper/pom.xml index ee8748591..018ab91fd 100644 --- a/common/mapper/pom.xml +++ b/common/mapper/pom.xml @@ -36,12 +36,10 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-service-loader - ${project.version} org.junit.jupiter @@ -54,4 +52,4 @@ test - \ No newline at end of file + diff --git a/common/metrics/pom.xml b/common/metrics/pom.xml index cad7d9c18..488771ed5 100644 --- a/common/metrics/pom.xml +++ b/common/metrics/pom.xml @@ -1,20 +1,21 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> 4.0.0 @@ -29,17 +30,16 @@ Helidon Metrics common definitions - + io.helidon.config helidon-config - ${project.version} org.eclipse.microprofile.metrics microprofile-metrics-api - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} provided diff --git a/common/reactive/pom.xml b/common/reactive/pom.xml index c1335b1a5..a311f35c3 100644 --- a/common/reactive/pom.xml +++ b/common/reactive/pom.xml @@ -65,12 +65,10 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-mapper - ${project.version} io.projectreactor diff --git a/common/service-loader/pom.xml b/common/service-loader/pom.xml index 09080ca09..c1baabec1 100644 --- a/common/service-loader/pom.xml +++ b/common/service-loader/pom.xml @@ -37,7 +37,6 @@ io.helidon.common helidon-common - ${project.version} javax.annotation @@ -59,4 +58,4 @@ test - \ No newline at end of file + diff --git a/config/config/pom.xml b/config/config/pom.xml index d814016f8..71829d17f 100644 --- a/config/config/pom.xml +++ b/config/config/pom.xml @@ -45,12 +45,10 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.projectreactor diff --git a/config/encryption/pom.xml b/config/encryption/pom.xml index b55145958..6689fb672 100644 --- a/config/encryption/pom.xml +++ b/config/encryption/pom.xml @@ -38,17 +38,14 @@ io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common-key-util - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} test diff --git a/config/etcd/pom.xml b/config/etcd/pom.xml index 1e5ffcfdd..7e3adeeee 100644 --- a/config/etcd/pom.xml +++ b/config/etcd/pom.xml @@ -40,12 +40,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common - ${project.version} @@ -57,7 +55,6 @@ io.helidon.grpc io.grpc - ${project.version} io.grpc @@ -83,19 +80,16 @@ --> io.helidon.config helidon-config-object-mapping - ${project.version} test io.helidon.config helidon-config-testing - ${project.version} test io.helidon.config helidon-config-hocon - ${project.version} test diff --git a/config/git/pom.xml b/config/git/pom.xml index 223d38e97..3b5545a29 100644 --- a/config/git/pom.xml +++ b/config/git/pom.xml @@ -41,12 +41,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common - ${project.version} org.eclipse.jgit @@ -59,13 +57,11 @@ Unless you need this feature, test scope is sufficient --> io.helidon.config helidon-config-object-mapping - ${project.version} test io.helidon.config helidon-config-testing - ${project.version} test diff --git a/config/hocon/pom.xml b/config/hocon/pom.xml index e7da478f9..269697352 100644 --- a/config/hocon/pom.xml +++ b/config/hocon/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common - ${project.version} com.typesafe @@ -55,7 +53,6 @@ io.helidon.config helidon-config-testing - ${project.version} test diff --git a/config/object-mapping/pom.xml b/config/object-mapping/pom.xml index a2e41f399..4f3cb5d47 100644 --- a/config/object-mapping/pom.xml +++ b/config/object-mapping/pom.xml @@ -36,7 +36,6 @@ io.helidon.config helidon-config - ${project.version} org.junit.jupiter diff --git a/config/testing/pom.xml b/config/testing/pom.xml index d81224db0..ce430e02f 100644 --- a/config/testing/pom.xml +++ b/config/testing/pom.xml @@ -37,7 +37,6 @@ io.helidon.config helidon-config - ${project.version} org.junit.jupiter diff --git a/config/tests/integration-tests/pom.xml b/config/tests/integration-tests/pom.xml index ca98cf8a1..5e8bbe844 100644 --- a/config/tests/integration-tests/pom.xml +++ b/config/tests/integration-tests/pom.xml @@ -33,22 +33,18 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} io.helidon.config helidon-config-testing - ${project.version} test diff --git a/config/tests/module-mappers-1-base/pom.xml b/config/tests/module-mappers-1-base/pom.xml index caf1a83d9..aeff903a8 100644 --- a/config/tests/module-mappers-1-base/pom.xml +++ b/config/tests/module-mappers-1-base/pom.xml @@ -37,7 +37,6 @@ io.helidon.config helidon-config - ${project.version} javax.annotation diff --git a/config/tests/module-mappers-2-override/pom.xml b/config/tests/module-mappers-2-override/pom.xml index 6cd58e2bb..728abd4c9 100644 --- a/config/tests/module-mappers-2-override/pom.xml +++ b/config/tests/module-mappers-2-override/pom.xml @@ -38,7 +38,6 @@ io.helidon.config helidon-config - ${project.version} javax.annotation diff --git a/config/tests/module-meta-source-1/pom.xml b/config/tests/module-meta-source-1/pom.xml index 4a39f9999..652830979 100644 --- a/config/tests/module-meta-source-1/pom.xml +++ b/config/tests/module-meta-source-1/pom.xml @@ -37,13 +37,11 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} diff --git a/config/tests/module-meta-source-2/pom.xml b/config/tests/module-meta-source-2/pom.xml index b3cc9d380..90634cb55 100644 --- a/config/tests/module-meta-source-2/pom.xml +++ b/config/tests/module-meta-source-2/pom.xml @@ -38,12 +38,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} diff --git a/config/tests/module-parsers-1-override/pom.xml b/config/tests/module-parsers-1-override/pom.xml index 8c7014b58..191e40537 100644 --- a/config/tests/module-parsers-1-override/pom.xml +++ b/config/tests/module-parsers-1-override/pom.xml @@ -38,7 +38,6 @@ io.helidon.config helidon-config - ${project.version} javax.annotation diff --git a/config/tests/test-bundle/pom.xml b/config/tests/test-bundle/pom.xml index e5bade2fb..e52035e0f 100644 --- a/config/tests/test-bundle/pom.xml +++ b/config/tests/test-bundle/pom.xml @@ -37,7 +37,6 @@ io.helidon.bundles helidon-bundles-config - ${project.version} javax.annotation diff --git a/config/tests/test-default_config-1-properties/pom.xml b/config/tests/test-default_config-1-properties/pom.xml index d95d189d5..ab47374db 100644 --- a/config/tests/test-default_config-1-properties/pom.xml +++ b/config/tests/test-default_config-1-properties/pom.xml @@ -37,7 +37,6 @@ io.helidon.config helidon-config - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-2-hocon-json/pom.xml b/config/tests/test-default_config-2-hocon-json/pom.xml index 7b4e050bf..14071a59c 100644 --- a/config/tests/test-default_config-2-hocon-json/pom.xml +++ b/config/tests/test-default_config-2-hocon-json/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-3-hocon/pom.xml b/config/tests/test-default_config-3-hocon/pom.xml index 25ba8dd02..1fd489440 100644 --- a/config/tests/test-default_config-3-hocon/pom.xml +++ b/config/tests/test-default_config-3-hocon/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-4-yaml/pom.xml b/config/tests/test-default_config-4-yaml/pom.xml index 2a21382ac..65be68b96 100644 --- a/config/tests/test-default_config-4-yaml/pom.xml +++ b/config/tests/test-default_config-4-yaml/pom.xml @@ -37,17 +37,14 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.hamcrest diff --git a/config/tests/test-default_config-5-env_vars/pom.xml b/config/tests/test-default_config-5-env_vars/pom.xml index 15dd7c264..0c0315493 100644 --- a/config/tests/test-default_config-5-env_vars/pom.xml +++ b/config/tests/test-default_config-5-env_vars/pom.xml @@ -37,17 +37,14 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-6-meta-properties/pom.xml b/config/tests/test-default_config-6-meta-properties/pom.xml index a0bc7e8ef..2fc6087ea 100644 --- a/config/tests/test-default_config-6-meta-properties/pom.xml +++ b/config/tests/test-default_config-6-meta-properties/pom.xml @@ -37,7 +37,6 @@ io.helidon.config helidon-config - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-7-meta-hocon-json/pom.xml b/config/tests/test-default_config-7-meta-hocon-json/pom.xml index bd4d34ecc..74cff1b88 100644 --- a/config/tests/test-default_config-7-meta-hocon-json/pom.xml +++ b/config/tests/test-default_config-7-meta-hocon-json/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-8-meta-hocon/pom.xml b/config/tests/test-default_config-8-meta-hocon/pom.xml index d5c412f2a..0d7b5f51d 100644 --- a/config/tests/test-default_config-8-meta-hocon/pom.xml +++ b/config/tests/test-default_config-8-meta-hocon/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} org.junit.jupiter diff --git a/config/tests/test-default_config-9-meta-yaml/pom.xml b/config/tests/test-default_config-9-meta-yaml/pom.xml index fa3fbf981..ba0cf6457 100644 --- a/config/tests/test-default_config-9-meta-yaml/pom.xml +++ b/config/tests/test-default_config-9-meta-yaml/pom.xml @@ -37,17 +37,14 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.junit.jupiter diff --git a/config/tests/test-mappers-1-common/pom.xml b/config/tests/test-mappers-1-common/pom.xml index 430327bb8..129677089 100644 --- a/config/tests/test-mappers-1-common/pom.xml +++ b/config/tests/test-mappers-1-common/pom.xml @@ -37,7 +37,6 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config.tests diff --git a/config/tests/test-mappers-2-complex/pom.xml b/config/tests/test-mappers-2-complex/pom.xml index c660d09ef..9ef508823 100644 --- a/config/tests/test-mappers-2-complex/pom.xml +++ b/config/tests/test-mappers-2-complex/pom.xml @@ -38,7 +38,6 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config.tests diff --git a/config/tests/test-meta-source/pom.xml b/config/tests/test-meta-source/pom.xml index a45b4d365..db50802e4 100644 --- a/config/tests/test-meta-source/pom.xml +++ b/config/tests/test-meta-source/pom.xml @@ -38,7 +38,6 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config.tests diff --git a/config/tests/test-parsers-1-complex/pom.xml b/config/tests/test-parsers-1-complex/pom.xml index d040c74b2..136b37298 100644 --- a/config/tests/test-parsers-1-complex/pom.xml +++ b/config/tests/test-parsers-1-complex/pom.xml @@ -38,7 +38,6 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config.tests diff --git a/config/yaml/pom.xml b/config/yaml/pom.xml index 67f23e90a..a16d33dd0 100644 --- a/config/yaml/pom.xml +++ b/config/yaml/pom.xml @@ -37,12 +37,10 @@ io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common - ${project.version} org.yaml @@ -55,7 +53,6 @@ io.helidon.config helidon-config-testing - ${project.version} test diff --git a/docs-internal/dockerbuild-local-snapshots.md b/docs-internal/dockerbuild-local-snapshots.md index c9632d409..71238b20b 100644 --- a/docs-internal/dockerbuild-local-snapshots.md +++ b/docs-internal/dockerbuild-local-snapshots.md @@ -91,15 +91,13 @@ Update the `Dockerfile` and add the following lines: # A build time argument that can be used to configure an extra Maven repository. # E.g. --build-arg X_REPO=my-repo-url ARG X_REPO -ADD settings.xml / +ADD settings.xml /usr/share/maven/conf/ ``` -Then add `-s /settings.xml` to all Maven commands. - ## Build your image Replace `DOCKER_HOST` with a host name or IP address that can be used to reach - the nexus server from inside a container. (E.g. docker.for.mac.localhost). + the nexus server from inside a container. (E.g. `docker.for.mac.localhost`). ```bash docker build \ diff --git a/etc/copyright-exclude.txt b/etc/copyright-exclude.txt index 6e1c91afe..0001707b1 100644 --- a/etc/copyright-exclude.txt +++ b/etc/copyright-exclude.txt @@ -39,5 +39,6 @@ etc/javadoc/ conf/secrets/ .dockerignore empty_file -src/main/resources/WEB/node +frontend/node +node_modules archetype-resources/pom.xml diff --git a/examples/config/basics/README.md b/examples/config/basics/README.md index f13d146e5..6a033cc01 100644 --- a/examples/config/basics/README.md +++ b/examples/config/basics/README.md @@ -1,4 +1,3 @@ - # Helidon Config Basic Example This example shows the basics of using Helidon SE Config. The @@ -9,14 +8,10 @@ This example shows the basics of using Helidon SE Config. The containing config in HOCON (Human-Optimized Config Object Notation) format * getting configuration values of various types -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` +java -jar target/helidon-examples-config-basics.jar +``` \ No newline at end of file diff --git a/examples/config/basics/pom.xml b/examples/config/basics/pom.xml index ac111c877..77167087e 100644 --- a/examples/config/basics/pom.xml +++ b/examples/config/basics/pom.xml @@ -21,10 +21,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-basics Helidon Config Examples Basics @@ -40,12 +42,24 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/config/changes/README.md b/examples/config/changes/README.md index 7b060093c..74ec71696 100644 --- a/examples/config/changes/README.md +++ b/examples/config/changes/README.md @@ -1,10 +1,10 @@ - # Helidon Config Changes Example This example shows how an application can deal with changes to configuration. ## Change notification + The example highlights two approaches to change notification: 1. [`ChangesSubscriberExample.java`](./src/main/java/io/helidon/config/examples/changes/ChangesSubscriberExample.java): @@ -17,6 +17,7 @@ would also work) which the config system invokes when the config source changes ) ## Latest-value supplier + A third example illustrates a different solution. Recall that once your application obtains a `Config` instance, its config values do not change. The @@ -27,14 +28,10 @@ application obtained the `Config` object. Although this approach does not notify your application _when_ changes occur, it _does_ permit your code to always use the most up-to-date value. Sometimes that is all you need. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` +java -jar target/helidon-examples-config-changes.jar +``` \ No newline at end of file diff --git a/examples/config/changes/pom.xml b/examples/config/changes/pom.xml index 9c8d804db..d19bb6b73 100644 --- a/examples/config/changes/pom.xml +++ b/examples/config/changes/pom.xml @@ -20,12 +20,13 @@ 4.0.0 - - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-changes Helidon Config Examples Changes @@ -41,17 +42,28 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/config/git/README.md b/examples/config/git/README.md index 1dbb448b3..c7c3e2f1a 100644 --- a/examples/config/git/README.md +++ b/examples/config/git/README.md @@ -1,10 +1,10 @@ - # Helidon Config Git Example This example shows how to load configuration from a Git repository and switch which branch to load from at runtime. ## Prerequisites + The example assumes that the GitHub repository has a branch named `test` that contains `application.conf` which sets the key `greeting` to value `hello`. (The Helidon team has created and populated this @@ -19,15 +19,11 @@ The example application constructs a `Config` instance from that file in the GitHub repository and branch, prints out the value for key `greeting`, and checks to make sure the value is the expected `hello`. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` export ENVIRONMENT_NAME=test -mvn exec:java +java -jar target/helidon-examples-config-git.jar ``` diff --git a/examples/config/git/pom.xml b/examples/config/git/pom.xml index aa3a21dda..9da432607 100644 --- a/examples/config/git/pom.xml +++ b/examples/config/git/pom.xml @@ -21,12 +21,15 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-git Helidon Config Examples Git + The example shows how to use GitConfigSource. @@ -39,17 +42,14 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-git - ${project.version} @@ -64,6 +64,15 @@ + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + diff --git a/examples/config/mapping/README.md b/examples/config/mapping/README.md index a9cc14d98..7cdc82a69 100644 --- a/examples/config/mapping/README.md +++ b/examples/config/mapping/README.md @@ -1,4 +1,3 @@ - # Helidon Config Mapping Example This example shows how to implement mappers that convert configuration @@ -16,15 +15,10 @@ setter methods. illustrates how you can add a static factory method `create` to a POJO to tell the config system how to construct a POJO instance. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` - +java -jar target/helidon-examples-config-mapping.jar +``` \ No newline at end of file diff --git a/examples/config/mapping/pom.xml b/examples/config/mapping/pom.xml index 211df7470..974071e40 100644 --- a/examples/config/mapping/pom.xml +++ b/examples/config/mapping/pom.xml @@ -21,10 +21,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-mapping Helidon Config Examples Mapping @@ -40,17 +42,28 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/config/overrides/README.md b/examples/config/overrides/README.md index 0c1b73a4b..23be00dc5 100644 --- a/examples/config/overrides/README.md +++ b/examples/config/overrides/README.md @@ -1,4 +1,3 @@ - # Helidon Config Overrides Example This example shows how to load configuration from multiple @@ -20,16 +19,10 @@ _override_ config source. This file contains key _expressions_ (including wildcards) and values which take precedence over the settings in the original config sources. +## Build and run -## Build - -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` - +java -jar target/helidon-examples-config-overrides.jar +``` \ No newline at end of file diff --git a/examples/config/overrides/pom.xml b/examples/config/overrides/pom.xml index 261a6e137..e3a3c2ff1 100644 --- a/examples/config/overrides/pom.xml +++ b/examples/config/overrides/pom.xml @@ -21,10 +21,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-overrides Helidon Config Examples Overrides @@ -40,7 +42,20 @@ io.helidon.bundles helidon-bundles-config - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/config/sources/README.md b/examples/config/sources/README.md index cecdb334f..cc6c36e8a 100644 --- a/examples/config/sources/README.md +++ b/examples/config/sources/README.md @@ -1,4 +1,3 @@ - # Helidon Config Sources Example This example shows how to load configuration from multiple @@ -16,14 +15,10 @@ applies a filter to modify config values whose keys match a certain pattern. combines multiple config sources into a single configuration instance (and adds a filter. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-config-sources.jar ``` diff --git a/examples/config/sources/pom.xml b/examples/config/sources/pom.xml index 88367dfc2..ae9d933b6 100644 --- a/examples/config/sources/pom.xml +++ b/examples/config/sources/pom.xml @@ -21,10 +21,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.config - helidon-examples-config-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.config helidon-examples-config-sources Helidon Config Examples Sources @@ -40,12 +42,24 @@ io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/employee-app/README.md b/examples/employee-app/README.md index 1d50fbfb0..b4d1c6860 100644 --- a/examples/employee-app/README.md +++ b/examples/employee-app/README.md @@ -1,31 +1,19 @@ - # Helidon Quickstart SE - Employee Directory Example -This project implements an employee directory REST service using Helidon SE. The application is composed of a Helidon REST Microservice backend along with an HTML/JavaScript front end. The source for both application is included with the Maven project. +This project implements an employee directory REST service using Helidon SE. + The application is composed of a Helidon REST Microservice backend along with + an HTML/JavaScript front end. The source for both application is included with + the Maven project. -By default the service uses a ArrayList backend with sample data. You can connect the backend application to an Oracle database by changing the values in the `resources/DbCreds.properties` file. - -## Prerequisites - -1. Maven 3.5 or newer -2. Java SE 8 or newer -3. Docker 17 or newer to build and run docker images -4. Kubernetes minikube v0.24 or newer to deploy to Kubernetes (or access to a K8s 1.7.4 or newer cluster) -5. Kubectl 1.7.4 or newer to deploy to Kubernetes - -Verify prerequisites - -```sh -java -version -mvn --version -docker --version -minikube version -kubectl version --short -``` +By default the service uses a ArrayList backend with sample data. You can connect + the backend application to an Oracle database by changing the values in the + `resources/DbCreds.properties` file. ## Using Oracle DB -This application supports two storage implementations one using an array and other using an Oracle database to persist the data. To compile and package the application you need the JDBC driver. The JDBC driver for the Oracle DB is only available from the +This application supports two storage implementations one using an array and + other using an Oracle database to persist the data. To compile and package the + application you need the JDBC driver. The JDBC driver for the Oracle DB is only available from the https://www.oracle.com/webfolder/application/maven/index.html[Oracle Maven Repository]. This means that you have to configure the repository in order to add the driver @@ -39,22 +27,14 @@ Follow these steps: - Update your settings.xml as documented https://docs.oracle.com/middleware/1213/core/MAVEN/config_maven_repo.htm#MAVEN9016[here] -## Build +## Build and run -```sh +With JDK8+ +```bash mvn package +java -jar target/employee-app.jar ``` -## Start the application - -```sh -cd target -java -jar employee-app.jar -``` - -**Note:** For the static elements of the application to work, you must start the application from the target directory. - - ## Exercise the application Get all employees. ```sh @@ -63,7 +43,18 @@ curl -X GET curl -X GET http://localhost:8080/employees Only 1 output record is shown for brevity: ```json -[{"birthDate":"1970-11-28T08:28:48.078Z","department":"Mobility","email":"Hugh.Jast@example.com","firstName":"Hugh","id":"48cf06ad-6ed4-47e6-ac44-3ea9c67cbe2d","lastName":"Jast","phone":"730-715-4446","title":"National Data Strategist"}] +[ + { + "birthDate": "1970-11-28T08:28:48.078Z", + "department": "Mobility", + "email": "Hugh.Jast@example.com", + "firstName": "Hugh", + "id": "48cf06ad-6ed4-47e6-ac44-3ea9c67cbe2d", + "lastName": "Jast", + "phone": "730-715-4446", + "title": "National Data Strategist" + } +] ``` @@ -74,7 +65,18 @@ curl -X GET http://localhost:8080/employees/lastname/S Only 1 output record is shown for brevity: ```json -[{"birthDate":"1978-03-18T17:00:12.938Z","department":"Security","email":"Zora.Sawayn@example.com","firstName":"Zora","id":"d7b583a2-f068-40d9-aec0-6f87899c5d8a","lastName":"Sawayn","phone":"923-814-0502","title":"Dynamic Marketing Designer"}] +[ + { + "birthDate": "1978-03-18T17:00:12.938Z", + "department": "Security", + "email": "Zora.Sawayn@example.com", + "firstName": "Zora", + "id": "d7b583a2-f068-40d9-aec0-6f87899c5d8a", + "lastName": "Sawayn", + "phone": "923-814-0502", + "title": "Dynamic Marketing Designer" + } +] ``` Get an individual record. @@ -83,7 +85,18 @@ curl -X GET http://localhost:8080/employees/48cf06ad-6ed4-47e6-ac44-3ea9c67cbe2d ``` Output: ```json -[{"birthDate":"1970-11-28T08:28:48.078Z","department":"Mobility","email":"Hugh.Jast@example.com","firstName":"Hugh","id":"48cf06ad-6ed4-47e6-ac44-3ea9c67cbe2d","lastName":"Jast","phone":"730-715-4446","title":"National Data Strategist"}] +[ + { + "birthDate": "1970-11-28T08:28:48.078Z", + "department": "Mobility", + "email": "Hugh.Jast@example.com", + "firstName": "Hugh", + "id": "48cf06ad-6ed4-47e6-ac44-3ea9c67cbe2d", + "lastName": "Jast", + "phone": "730-715-4446", + "title": "National Data Strategist" + } +] ``` Connect with a web brower at: @@ -99,7 +112,39 @@ curl -s -X GET http://localhost:8080/health ``` ```json -{"outcome":"UP","checks":[{"name":"deadlock","state":"UP"},{"name":"diskSpace","state":"UP","data":{"free":"306.61 GB","freeBytes":329225338880,"percentFree":"65.84%","total":"465.72 GB","totalBytes":500068036608}},{"name":"heapMemory","state":"UP","data":{"free":"239.35 MB","freeBytes":250980656,"max":"4.00 GB","maxBytes":4294967296,"percentFree":"99.59%","total":"256.00 MB","totalBytes":268435456}}]} +{ + "outcome": "UP", + "checks": [ + { + "name": "deadlock", + "state": "UP" + }, + { + "name": "diskSpace", + "state": "UP", + "data": { + "free": "306.61 GB", + "freeBytes": 329225338880, + "percentFree": "65.84%", + "total": "465.72 GB", + "totalBytes": 500068036608 + } + }, + { + "name": "heapMemory", + "state": "UP", + "data": { + "free": "239.35 MB", + "freeBytes": 250980656, + "max": "4.00 GB", + "maxBytes": 4294967296, + "percentFree": "99.59%", + "total": "256.00 MB", + "totalBytes": 268435456 + } + } + ] +} ``` ### Prometheus Format @@ -122,7 +167,44 @@ curl -H 'Accept: application/json' -X GET http://localhost:8080/metrics Output: ```json -{"base":{"classloader.currentLoadedClass.count":4011,"classloader.totalLoadedClass.count":4011,"classloader.totalUnloadedClass.count":0,"cpu.availableProcessors":8,"cpu.systemLoadAverage":1.65283203125,"gc.G1 Old Generation.count":0,"gc.G1 Old Generation.time":0,"gc.G1 Young Generation.count":2,"gc.G1 Young Generation.time":8,"jvm.uptime":478733,"memory.committedHeap":268435456,"memory.maxHeap":4294967296,"memory.usedHeap":18874368,"thread.count":11,"thread.daemon.count":4,"thread.max.count":11},"vendor":{"grpc.requests.count":0,"grpc.requests.meter":{"count":0,"meanRate":0.0,"oneMinRate":0.0,"fiveMinRate":0.0,"fifteenMinRate":0.0},"requests.count":5,"requests.meter":{"count":5,"meanRate":0.01046407983617782,"oneMinRate":0.0023897243038835964,"fiveMinRate":0.003944597070306631,"fifteenMinRate":0.0023808575122958794}}} +{ + "base": { + "classloader.currentLoadedClass.count": 4011, + "classloader.totalLoadedClass.count": 4011, + "classloader.totalUnloadedClass.count": 0, + "cpu.availableProcessors": 8, + "cpu.systemLoadAverage": 1.65283203125, + "gc.G1 Old Generation.count": 0, + "gc.G1 Old Generation.time": 0, + "gc.G1 Young Generation.count": 2, + "gc.G1 Young Generation.time": 8, + "jvm.uptime": 478733, + "memory.committedHeap": 268435456, + "memory.maxHeap": 4294967296, + "memory.usedHeap": 18874368, + "thread.count": 11, + "thread.daemon.count": 4, + "thread.max.count": 11 + }, + "vendor": { + "grpc.requests.count": 0, + "grpc.requests.meter": { + "count": 0, + "meanRate": 0, + "oneMinRate": 0, + "fiveMinRate": 0, + "fifteenMinRate": 0 + }, + "requests.count": 5, + "requests.meter": { + "count": 5, + "meanRate": 0.01046407983617782, + "oneMinRate": 0.0023897243038835964, + "fiveMinRate": 0.003944597070306631, + "fifteenMinRate": 0.0023808575122958794 + } + } +} ``` ## Build the Docker Image @@ -150,7 +232,11 @@ kubectl get service employee-app # Get service info ### Oracle DB Credentials -You can connect to two different datastores for the back end application. Just fill in the application.yaml files. To use an ArrayList as the data store, simply set `drivertype` to `Array`. To connect to an Oracle database, you must set all the values: `user`, `password`, `hosturl`, and `drivertype`. For Oracle, the `drivertype` should be set to `Oracle`. +You can connect to two different datastores for the back end application. + Just fill in the application.yaml files. To use an ArrayList as the data store, + simply set `drivertype` to `Array`. To connect to an Oracle database, you must + set all the values: `user`, `password`, `hosturl`, and `drivertype`. + For Oracle, the `drivertype` should be set to `Oracle`. **Sample `application.yaml`** ```yaml @@ -166,39 +252,41 @@ app: ``` ## Create the database objects -1. Create a connection to your Oracle Database using sqlplus or SQL Developer. See https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/connectingDB.htm. + +1. Create a connection to your Oracle Database using sqlplus or SQL Developer. + See https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/connectingDB.htm. 2. Create the database objects: - ```sql - CREATE TABLE EMPLOYEE ( - ID INTEGER NOT NULL, - FIRSTNAME VARCHAR(100), - LASTNAME VARCHAR(100), - EMAIL VARCHAR(100), - PHONE VARCHAR(100), - BIRTHDATE VARCHAR(10), - TITLE VARCHAR(100), - DEPARTMENT VARCHAR(100), - PRIMARY KEY (ID) - ); - ``` +```sql +CREATE TABLE EMPLOYEE ( + ID INTEGER NOT NULL, + FIRSTNAME VARCHAR(100), + LASTNAME VARCHAR(100), + EMAIL VARCHAR(100), + PHONE VARCHAR(100), + BIRTHDATE VARCHAR(10), + TITLE VARCHAR(100), + DEPARTMENT VARCHAR(100), + PRIMARY KEY (ID) + ); +``` - ```sql - CREATE SEQUENCE EMPLOYEE_SEQ - START WITH 100 - INCREMENT BY 1; - ``` +```sql +CREATE SEQUENCE EMPLOYEE_SEQ + START WITH 100 + INCREMENT BY 1; +``` - ```sql - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Hugh', 'Jast', 'Hugh.Jast@example.com', '730-555-0100', '1970-11-28', 'National Data Strategist', 'Mobility'); +```sql +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Hugh', 'Jast', 'Hugh.Jast@example.com', '730-555-0100', '1970-11-28', 'National Data Strategist', 'Mobility'); - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Toy', 'Herzog', 'Toy.Herzog@example.com', '769-555-0102', '1961-08-08', 'Dynamic Operations Manager', 'Paradigm'); +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Toy', 'Herzog', 'Toy.Herzog@example.com', '769-555-0102', '1961-08-08', 'Dynamic Operations Manager', 'Paradigm'); - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Reed', 'Hahn', 'Reed.Hahn@example.com', '429-555-0153', '1977-02-05', 'Future Directives Facilitator', 'Quality'); +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Reed', 'Hahn', 'Reed.Hahn@example.com', '429-555-0153', '1977-02-05', 'Future Directives Facilitator', 'Quality'); - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Novella', 'Bahringer', 'Novella.Bahringer@example.com', '293-596-3547', '1961-07-25', 'Principal Factors Architect', 'Division'); +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Novella', 'Bahringer', 'Novella.Bahringer@example.com', '293-596-3547', '1961-07-25', 'Principal Factors Architect', 'Division'); - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Zora', 'Sawayn', 'Zora.Sawayn@example.com', '923-555-0161', '1978-03-18', 'Dynamic Marketing Designer', 'Security'); +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Zora', 'Sawayn', 'Zora.Sawayn@example.com', '923-555-0161', '1978-03-18', 'Dynamic Marketing Designer', 'Security'); - INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Cordia', 'Willms', 'Cordia.Willms@example.com', '778-555-0187', '1989-03-31', 'Human Division Representative', 'Optimization'); - ``` \ No newline at end of file +INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, EMAIL, PHONE, BIRTHDATE, TITLE, DEPARTMENT) VALUES (EMPLOYEE_SEQ.nextVal, 'Cordia', 'Willms', 'Cordia.Willms@example.com', '778-555-0187', '1989-03-31', 'Human Division Representative', 'Optimization'); +``` \ No newline at end of file diff --git a/examples/employee-app/pom.xml b/examples/employee-app/pom.xml index f0ebbec9f..aa64869c4 100644 --- a/examples/employee-app/pom.xml +++ b/examples/employee-app/pom.xml @@ -21,71 +21,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - - io.helidon - helidon-project - 1.2.2-SNAPSHOT - ../../pom.xml - - 4.0.0 + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../applications/se/pom.xml + io.helidon.service.employee employee-app Employee App Example io.helidon.service.employee.Main - libs - ${project.build.directory}/${libs.classpath.prefix} - 2.0.1 - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ${libs.classpath.prefix} - ${mainClass} - - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - - - - - - - com.oracle.jdbc @@ -94,41 +44,44 @@ io.helidon.bundles helidon-bundles-webserver - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} io.helidon.health helidon-health-checks - ${project.version} io.helidon.metrics helidon-metrics2 - ${project.version} + + + io.helidon.media.jsonb + helidon-media-jsonb-server org.junit.jupiter junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - - - io.helidon.media.jsonb - helidon-media-jsonb-server - ${project.version} - - + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + + diff --git a/examples/grpc/.dockerignore b/examples/grpc/.dockerignore new file mode 100644 index 000000000..901b6e6f9 --- /dev/null +++ b/examples/grpc/.dockerignore @@ -0,0 +1 @@ +*/target/ diff --git a/examples/grpc/README.md b/examples/grpc/README.md index 879c1c7d6..6094f8cb9 100644 --- a/examples/grpc/README.md +++ b/examples/grpc/README.md @@ -1,4 +1 @@ - # Helidon SE gRPC Server Examples - - diff --git a/examples/grpc/basics/README.md b/examples/grpc/basics/README.md index ef8ae7ee9..01844c3c7 100644 --- a/examples/grpc/basics/README.md +++ b/examples/grpc/basics/README.md @@ -1,16 +1,17 @@ - # Helidon gRPC Example A basic example gRPC server. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package +java -jar target/helidon-examples-grpc-basics.jar ``` -## Run - -``` -mvn exec:java -``` +Exercise the example: +```bash +java -cp target/helidon-examples-grpc-basics.jar \ + io.helidon.grpc.examples.basics.HealthClient +``` \ No newline at end of file diff --git a/examples/grpc/basics/pom.xml b/examples/grpc/basics/pom.xml index 6a8dea7e9..ebd3b039d 100644 --- a/examples/grpc/basics/pom.xml +++ b/examples/grpc/basics/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-basics Helidon gRPC Server Examples Basics @@ -44,24 +47,32 @@ io.helidon.grpc helidon-grpc-server - ${project.version} - io.helidon.grpc helidon-grpc-client - ${project.version} - io.helidon.health helidon-health-checks - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/grpc/common/pom.xml b/examples/grpc/common/pom.xml index 5a01f4f3c..0afab613e 100644 --- a/examples/grpc/common/pom.xml +++ b/examples/grpc/common/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-common Helidon gRPC Server Examples ProtoBuf Services @@ -39,56 +42,49 @@ io.helidon.grpc helidon-grpc-server - ${project.version} - io.helidon.grpc helidon-grpc-client - ${project.version} - - - - io.grpc - grpc-netty - io.grpc - grpc-services + io.grpc + grpc-netty - io.grpc - grpc-protobuf + io.grpc + grpc-services - - io.helidon.common - helidon-common - ${project.version} + io.grpc + grpc-protobuf + + + io.helidon.common + helidon-common - - - kr.motd.maven - os-maven-plugin - ${version.plugin.os} - + + + kr.motd.maven + os-maven-plugin + - - org.xolstice.maven.plugins - protobuf-maven-plugin - - - - compile - compile-custom - - - - + + org.xolstice.maven.plugins + protobuf-maven-plugin + + + + compile + compile-custom + + + + diff --git a/examples/grpc/metrics/README.md b/examples/grpc/metrics/README.md new file mode 100644 index 000000000..6beb4fa09 --- /dev/null +++ b/examples/grpc/metrics/README.md @@ -0,0 +1,17 @@ +# Helidon gRPC Metrics Example + +A basic example using metrics with gRPC server. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-grpc-metrics.jar +``` + +Exercise the example: +```bash +java -cp target/helidon-examples-grpc-metrics.jar \ + io.helidon.grpc.examples.metrics.SecureStringClient +``` \ No newline at end of file diff --git a/examples/grpc/metrics/pom.xml b/examples/grpc/metrics/pom.xml index 65de302bc..5f0027f6d 100644 --- a/examples/grpc/metrics/pom.xml +++ b/examples/grpc/metrics/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-metrics Helidon gRPC Server Examples Metrics @@ -44,27 +47,36 @@ io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.grpc helidon-grpc-metrics - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} io.helidon.metrics helidon-metrics2 - ${project.version} io.helidon.grpc helidon-grpc-client - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/grpc/opentracing/Dockerfile b/examples/grpc/opentracing/Dockerfile new file mode 100644 index 000000000..dd4102460 --- /dev/null +++ b/examples/grpc/opentracing/Dockerfile @@ -0,0 +1,51 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first set of layers to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +RUN mkdir common +ADD common/pom.xml common/pom.xml +RUN mvn -f common/pom.xml install -DskipTests +RUN mkdir opentracing +ADD opentracing/pom.xml opentracing/pom.xml +RUN mvn -f opentracing/pom.xml package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD common/src ./common/src +RUN mvn -f common/pom.xml install -DskipTests +ADD opentracing/src ./opentracing/src +RUN mvn -f opentracing/pom.xml package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/opentracing/target/helidon-examples-grpc-opentracing.jar ./ +COPY --from=build /helidon/opentracing/target/libs ./libs + +ENV tracing.host="zipkin" +CMD [ "java", "-jar", "helidon-examples-grpc-opentracing.jar" ] + +EXPOSE 1408 \ No newline at end of file diff --git a/examples/grpc/opentracing/README.md b/examples/grpc/opentracing/README.md index a1a37ce9f..0d11237da 100644 --- a/examples/grpc/opentracing/README.md +++ b/examples/grpc/opentracing/README.md @@ -1,86 +1,44 @@ -Opentracing gRPC Server Example Application -=========================================== +# Opentracing gRPC Server Example Application -Running locally ---------------- -Prerequisites: -1. Requirements: JDK9, Maven, Docker (optional) -2. Add following lines to `/etc/hosts` - ``` - 127.0.0.1 zipkin - ``` -3. Run Zipkin:
- In Docker: - ``` - docker run -d -p 9411:9411 openzipkin/zipkin - ``` - or with Java 8+: - ``` - curl -sSL https://zipkin.io/quickstart.sh | bash -s - java -jar zipkin.jar - ``` - -Build and run: -``` -mvn clean install -pl examples/grpc/opentracing -mvn exec:java -pl examples/grpc/opentracing -curl "http://localhost:8080/test" -``` -Check out the traces at: ```http://zipkin:9411``` - - -Running in Minikube -------------------- - -### Preparing the infrastructure ### -Starting Minikube - -``` -% minikube start - -% kubectl version -Client Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.2", GitCommit:"477efc3cbe6a7effca06bd1452fa356e2201e1ee", GitTreeState:"clean", BuildDate:"2017-04-19T22:51:36Z", GoVersion:"go1.8.1", Compiler:"gc", Platform:"darwin/amd64"} -Server Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.0", GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37", GitTreeState:"dirty", BuildDate:"2017-04-07T20:46:46Z", GoVersion:"go1.7.3", Compiler:"gc", Platform:"linux/amd64"} - -% minikube dashboard - Waiting, endpoint for service is not ready yet... - Opening kubernetes dashboard in default browser... +## Start Zipkin +With Docker: +```bash +docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin ``` -Running Zipkin in K8S -``` -% kubectl run zipkin --image=openzipkin/zipkin --port=9411 -deployment "zipkin" created - -% kubectl expose deployment zipkin --type=NodePort -service "zipkin" exposed - -% kubectl get pod -NAME READY STATUS RESTARTS AGE -zipkin-2596933303-bccnw 0/1 ContainerCreating 0 14s - -% kubectl get pod -NAME READY STATUS RESTARTS AGE -zipkin-2596933303-bccnw 1/1 Running 0 16s - -% minikube service zipkin -Opening kubernetes service default/zipkin in default browser... +With Java 8+: +```bash +curl -sSL https://zipkin.io/quickstart.sh | bash -s +java -jar zipkin.jar ``` -Running opentracing app -``` -% eval $(minikube docker-env) -% mvn clean install -pl examples/grpc/opentracing docker:build +## Build and run -% kubectl run helidon-grpc-opentracing-example --image=mic.docker.oraclecorp.com/helidon-grpc-opentracing-example:1.0.1-SNAPSHOT --port=1408 --image-pull-policy=Never -deployment "helidon-grpc-opentracing-example" created - -% kubectl expose deployment helidon-grpc-opentracing-example --type=NodePort -service "helidon-grpc-opentracing-example" exposed - -% curl $(minikube service helidon-webserver-opentracing-example --url)/test -Hello World!% +With Docker: +```bash +docker build -t helidon-examples-grpc-opentracing -f ./Dockerfile .. +docker run --rm -d -p 1408:1408 \ + --link zipkin \ + --name helidon-examples-grpc-opentracing \ + helidon-examples-grpc-opentracing:latest ``` +With Java 8+: +```bash +mvn -f ../pom.xml -pl common/security package +java -jar target/helidon-examples-grpc-opentracing.jar +``` +Try the endpoint: +```bash +java -cp target/helidon-examples-grpc-opentracing.jar io.helidon.grpc.examples.common.GreetClient +java -cp target/helidon-examples-grpc-opentracing.jar io.helidon.grpc.examples.common.StringClient +``` + +Then check out the traces at http://localhost:9411. + +Stop the docker containers: +```bash +docker stop zipkin helidon-examples-grpc-opentracing +``` \ No newline at end of file diff --git a/examples/grpc/opentracing/pom.xml b/examples/grpc/opentracing/pom.xml index 10f6edc07..93cb0325d 100644 --- a/examples/grpc/opentracing/pom.xml +++ b/examples/grpc/opentracing/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-opentracing Helidon gRPC Server Examples OpenTracing @@ -33,14 +36,6 @@ io.helidon.grpc.examples.opentracing.ZipkinExampleMain - - ${docker.registry}/helidon-grpc-opentracing-example:${project.version} - - mic-docker-registry-automation - mic.docker.oraclecorp.com - https://${docker.registry}/v1/ - 0.3.3 - @@ -52,24 +47,18 @@ io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} - io.helidon.grpc helidon-grpc-client - ${project.version} - io.helidon.tracing helidon-tracing-zipkin - ${project.version} @@ -77,47 +66,13 @@ org.apache.maven.plugins - maven-resources-plugin + maven-dependency-plugin - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory}/distribution/container - - - src/main/docker - true - - - + copy-libs - - com.spotify - docker-maven-plugin - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory}/distribution/container - - ${docker.image.version} - latest - - - - / - ${project.build.directory} - ${project.build.finalName}-fat.jar - - - - diff --git a/examples/grpc/opentracing/src/main/resources/application.yaml b/examples/grpc/opentracing/src/main/resources/application.yaml index 633ac6e36..5ab986d38 100644 --- a/examples/grpc/opentracing/src/main/resources/application.yaml +++ b/examples/grpc/opentracing/src/main/resources/application.yaml @@ -26,4 +26,5 @@ webserver: bind-address: "0.0.0.0" tracing: + host: "localhost" service: "grpc-server" \ No newline at end of file diff --git a/examples/grpc/pom.xml b/examples/grpc/pom.xml index 0702c5b5b..da69eaca5 100644 --- a/examples/grpc/pom.xml +++ b/examples/grpc/pom.xml @@ -1,19 +1,21 @@ + + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> helidon-examples-project 1.2.2-SNAPSHOT - io.helidon.examples.grpc helidon-examples-grpc-project - Helidon gRPC Examples pom + Helidon gRPC Examples common @@ -39,5 +40,4 @@ security-abac security-outbound - diff --git a/examples/grpc/security-abac/README.md b/examples/grpc/security-abac/README.md index 6c240ed43..050948ad3 100644 --- a/examples/grpc/security-abac/README.md +++ b/examples/grpc/security-abac/README.md @@ -1,16 +1,16 @@ - # Helidon gRPC Security ABAC Example An example gRPC server for attribute based access control. -## Build +## Build and run -``` -mvn package +With JDK8+ +```bash +mvn -f ../pom.xml -pl common/security-abac package +java -jar target/helidon-examples-grpc-security-abac.jar ``` -## Run - -``` -mvn exec:java -``` +Take a look at the metrics: +```bash +curl http://localhost:8080/metrics +``` \ No newline at end of file diff --git a/examples/grpc/security-abac/pom.xml b/examples/grpc/security-abac/pom.xml index 150f8ee6a..21cd93559 100644 --- a/examples/grpc/security-abac/pom.xml +++ b/examples/grpc/security-abac/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-security-abac Helidon gRPC Server Examples ABAC Security @@ -41,59 +44,63 @@ helidon-examples-grpc-common ${project.version}
- io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.security.integration helidon-security-integration-grpc - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} - - - io.helidon.bundles - helidon-bundles-security - ${project.version} - +
+ + io.helidon.bundles + helidon-bundles-security + io.helidon.security.abac helidon-security-abac-policy-el - ${project.version} - - - org.glassfish - javax.el - - +
+ + org.glassfish + javax.el + io.helidon.grpc helidon-grpc-client - ${project.version} - - - - io.grpc - grpc-netty - io.grpc - grpc-services + io.grpc + grpc-netty - io.grpc - grpc-protobuf + io.grpc + grpc-services + + + io.grpc + grpc-protobuf + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/grpc/security-outbound/README.md b/examples/grpc/security-outbound/README.md index 51b5613ad..4b4662ae7 100644 --- a/examples/grpc/security-outbound/README.md +++ b/examples/grpc/security-outbound/README.md @@ -1,17 +1,17 @@ - # Helidon gRPC Security ABAC Example An example gRPC outbound security -## Build +## Build and run -``` -mvn package +With JDK8+ +```bash +mvn -f ../pom.xml -pl common/security-outbound package +java -jar target/helidon-examples-grpc-security-outbound.jar ``` -## Run - -To start the server run: -``` -mvn exec:java -``` +Exercise the example: +```bash +java -cp target/helidon-examples-grpc-security-outbound.jar \ + io.helidon.grpc.examples.security.outbound.SecureGreetClient +``` \ No newline at end of file diff --git a/examples/grpc/security-outbound/pom.xml b/examples/grpc/security-outbound/pom.xml index a70acbeef..969bd899b 100644 --- a/examples/grpc/security-outbound/pom.xml +++ b/examples/grpc/security-outbound/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-security-outbound Helidon gRPC Server Examples Outbound Security @@ -41,31 +44,25 @@ helidon-examples-grpc-common ${project.version}
- io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.security.integration helidon-security-integration-grpc - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} io.helidon.bundles helidon-bundles-webserver - ${project.version} org.glassfish.jersey.core @@ -78,18 +75,28 @@ io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} io.helidon.bundles helidon-bundles-security - ${project.version} - io.helidon.grpc helidon-grpc-client - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/grpc/security/README.md b/examples/grpc/security/README.md index 96fea0216..2e38c72d8 100644 --- a/examples/grpc/security/README.md +++ b/examples/grpc/security/README.md @@ -1,16 +1,19 @@ - # Helidon gRPC Security Example An example gRPC server using basic auth security. -## Build +## Build and run -``` -mvn package +With JDK8+ +```bash +mvn -f ../pom.xml -pl common/security package +java -jar target/helidon-examples-grpc-security.jar ``` -## Run - -``` -mvn exec:java -``` +Exercise the example: +```bash +java -cp target/helidon-examples-grpc-security.jar \ + io.helidon.grpc.examples.security.SecureGreetClient +java -cp target/helidon-examples-grpc-security.jar \ + io.helidon.grpc.examples.security.SecureStringClient +``` \ No newline at end of file diff --git a/examples/grpc/security/pom.xml b/examples/grpc/security/pom.xml index bc4aac5c1..8daeb2544 100644 --- a/examples/grpc/security/pom.xml +++ b/examples/grpc/security/pom.xml @@ -1,29 +1,32 @@ + Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.grpc - helidon-examples-grpc-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.grpc helidon-examples-grpc-security Helidon gRPC Server Examples Security @@ -41,50 +44,55 @@ helidon-examples-grpc-common ${project.version} - io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} - +
io.helidon.security.integration helidon-security-integration-grpc - ${project.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} - io.helidon.grpc helidon-grpc-client - ${project.version} - - - - io.grpc - grpc-netty - io.grpc - grpc-services + io.grpc + grpc-netty - io.grpc - grpc-protobuf + io.grpc + grpc-services + + + io.grpc + grpc-protobuf + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/guides/se-restful-webservice/README.adoc b/examples/guides/se-restful-webservice/README.adoc deleted file mode 100644 index ee184febf..000000000 --- a/examples/guides/se-restful-webservice/README.adoc +++ /dev/null @@ -1,869 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// - - Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -/////////////////////////////////////////////////////////////////////////////// -:java-base: src/main/java/io/helidon/guides/se/restfulwebservice -:greet-service: {java-base}/GreetService.java -:main-class: {java-base}/Main.java -:pom: pom.xml -:src-main-resources: src/main/resources -:base-example-getting-started: ../../../docs/src/main/docs/getting-started/02_base-example.adoc -:artifact-id: se-restful-webservice - - -= The RESTful Web Service Guide -:description: Helidon guide restful web service -:keywords: helidon, guide, example -:toc: preamble -:toclevels: 2 - -Create and build a RESTful web service as your first Helidon SE application. - -== What you will learn -You'll learn how to use Helidon quickly to create a RESTful web service that accepts these HTTP requests: - -[width=75%] -|=== -|Method and URL | Result - -|`GET localhost:8080/greet` |Returns a generic but friendly greeting -|`GET localhost:8080/greet/Joe` |Returns a personalized greeting for the specified person -|`PUT -H "Content-Type: application/json" -d '{"greeting" : "Hola"}' -localhost:8080/greet/greeting` |Changes the greeting used in subsequent responses -|=== - -You'll create the app in three main steps: - -. Use the Helidon Maven archetype to create a basic Helidon SE app that responds -to the HTTP requests. - -. Add code to perform a simple app-specific health check. - -. Add code to record a simple app-specific metric. - -As you develop the app, this guide helps you understand what each part of the -code does. If you prefer to download the finished code for this example, follow the -instructions at <>. - -== What you need - -[width=50%] -|=== -|About 15 minutes -|An IDE or text editor -|JDK 1.8 or later -|Maven 3.5 or later -|=== - -//Optional: -//|=== -//|Docker 18.02 (use the Edge channel to run Kubernetes on your desktop) -//|`kubectl` 1.7.4 -//|=== - -== Develop your application - -=== Generate the Maven project using the Helidon archetype -Helidon provides a Maven archetype you can use to create a new Helidon project that -includes sample code. - -1. `cd` to a directory that is not already a Maven project. -2. Run this command: -+ --- -[source,bash,subs="attributes+"] -.Creating a new Helidon SE project ----- -mvn archetype:generate -DinteractiveMode=false \ - -DarchetypeGroupId=io.helidon.archetypes \ - -DarchetypeArtifactId=helidon-quickstart-se \ - -DarchetypeVersion={helidon-version} \ - -DgroupId=io.helidon.guides \ - -DartifactId={artifact-id} \ - -Dpackage=io.helidon.guides.se.restfulwebservice ----- - -Running the archetype this way creates a subdirectory `{artifact-id}` -(using the `artifactId` setting from the archetype invocation) that contains a new -Maven project for a Helidon service. --- - -=== Browse the generated source - -==== `pom.xml` -The input you provided to the archetype determines the project's Maven -coordinates: -[source,xml,indent=0] -// _include::0-0:{pom}[tag=coordinates] ----- - se-restful-webservice ----- - -In the section, note the dependency on the `helidon-bom` -POM: -[source,xml,subs="verbatim,attributes"] -// _include::0-6:{pom}[tag=bom,indent=0] ----- - - io.helidon - helidon-bom - ${helidon.version} - pom - import - ----- - -Later, in the `` section, you will see declarations for various -Helidon components: - -* web server -* config support for YAML -* health check -* metrics - -The `helidon-bom` dependency adds `` declarations for all the Helidon components. -You can add Helidon dependencies to your project without having to specify the -version. For example, see the declaration for config YAML support: -[source,xml] -// _include::0-3:{pom}[tag=configYamlDependency,indent=0] ----- - - io.helidon.config - helidon-config-yaml - ----- - -==== `src/main/resources/application.yaml`: a config resource file for the application -Your app uses Helidon config to initialize the greeting and set up the HTTP -listener. - -.`src/main/resources/application.yaml` -[source,yaml] -// _include::0-5:{src-main-resources}/application.yaml[tag=configContent] ----- -app: - greeting: "Hello" # <1> - -server: # <2> - port: 8080 - host: 0.0.0.0 ----- -<1> Sets the initial greeting text for responses from the service -<2> Sets how the service will listen for requests - -==== `src/main/resources/logging.properties` -This file controls logging. -.`src/main/resources/logging.properties` -[source] -// _include::0-10:{src-main-resources}/logging.properties[tag=loggingProps] ----- -# Send messages to the console -handlers=java.util.logging.ConsoleHandler - -# Global default logging level. Can be overriden by specific handlers and loggers -.level=INFO - -# Helidon Web Server has a custom log formatter that extends SimpleFormatter. -# It replaces "!thread!" with the current thread name -java.util.logging.ConsoleHandler.level=INFO -java.util.logging.ConsoleHandler.formatter=io.helidon.webserver.WebServerLogFormatter -java.util.logging.SimpleFormatter.format=%1$tY.%1$tm.%1$td %1$tH:%1$tM:%1$tS %4$s %3$s !thread!: %5$s%6$s%n ----- - -==== `GreetService.java`: the greeting service for the app -In general, your application can implement multiple services, each tied to its own -URL path. The example includes just one service: the greeting service in -`src/main/java/io/helidon/guides/se/restfulwebservice/GreetService.java`. - -. Note these `import` statements. -+ --- -[source,java] -// _include::0-9:{greet-service}[tags=importsStart;importsWebServer] ----- -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; - -import io.helidon.common.http.Http; -import io.helidon.config.Config; -import io.helidon.webserver.Routing; -import io.helidon.webserver.ServerRequest; -import io.helidon.webserver.ServerResponse; -import io.helidon.webserver.Service; ----- -These imports are necessary for JSON and config support and for the key parts of -the web server. --- -. The `GreetService` class implements `io.helidon.webserver.Service`. -. Its constructor accepts a `Config` object to control its behavior: -+ --- -[source,java] -// _include::0-2:{greet-service}[tag=ctor,indent=0] ----- -GreetService(Config config) { - this.greeting = config.get("app.greeting").asString().orElse("Ciao"); //<1> -} ----- -Here the code looks up the initial greeting from the configuration object -and saves it. --- -. The `update` method updates the routing rules in the web server to link -the service's methods with the corresponding URL paths: -+ --- -[source,java] -// _include::0-6:{greet-service}[tags=update;!updateForCounter,indent=0] ----- -@Override -public void update(Routing.Rules rules) { - rules - .get("/", this::getDefaultMessageHandler) //<1> - .get("/{name}", this::getMessageHandler) //<2> - .put("/greeting", this::updateGreetingHandler); //<3> -} ----- -<1> Handle `GET` requests that contain no extra path using `getDefaultMessage`. -<2> Handle `GET` requests that contain a name using `getMessage`, which personalizes the response -using the name provided as the path suffix. -<3> Handle `PUT` requests to the `greeting` path using `updateGreeting`, -interpreting the `greeting` value in the JSON payload as the new greeting string. --- -. The following methods respond to the three types of request. -.. Returning the default greeting: -+ --- -[source,java] -// _include::0-3:{greet-service}[tag=getDefaultMessage,indent=0] ----- -private void getDefaultMessageHandler(ServerRequest request, - ServerResponse response) { - sendResponse(response, "World"); //<1> -} ----- -<1> The default message ends with "World!" -- that is, without personalizing the -message with the user's name. --- -.. Returning a personalized greeting: -+ --- -[source,java] -// _include::0-4:{greet-service}[tag=getMessage,indent=0] ----- -private void getMessageHandler(ServerRequest request, - ServerResponse response) { - String name = request.path().param("name"); //<1> - sendResponse(response, name); //<2> -} ----- -<1> Gets the name from the URL path in the request. -<2> Includes the user's name in building the response. --- -.. Updating the greeting: -+ --- -[source,java] -// _include::0-4:{greet-service}[tag=updateGreeting,indent=0] ----- -private void updateGreetingHandler(ServerRequest request, - ServerResponse response) { - request.content().as(JsonObject.class) // <1> - .thenAccept(jo -> updateGreetingFromJson(jo, response)); -} ----- -<1> Compose the JSON response to confirm the new setting for `greeting`. - -This method delegates to `updateGreetingFromJson`: -[source,java] -// _include::0-15:{greet-service}[tag=updateGreetingFromJson] ----- - private void updateGreetingFromJson(JsonObject jo, ServerResponse response) { - - if (!jo.containsKey("greeting")) { // <1> - JsonObject jsonErrorObject = JSON.createObjectBuilder() - .add("error", "No greeting provided") - .build(); - response.status(Http.Status.BAD_REQUEST_400) - .send(jsonErrorObject); - return; - } - - greeting = jo.getString("greeting"); // <2> - - response.status(Http.Status.NO_CONTENT_204) // <3> - .send(); - } ----- -<1> Rejects the request if the JSON payload does not include the `greeting` setting. -<2> Extracts the new greeting from the JSON object and saves it. -<3> Sends the "no content" response, acknowledging that the new greeting has been set. --- - -==== `Main.java` -The job of `Main` is to create and start the web server. It uses the configuration -in the config file to initialize the server, registering the greeting service with it. -The `startServer` method does most of the work. - -. Create and configure the server. -+ --- -[source,java] -// _include::0-7:{main-class}[tag=setUpServer,indent=0] ----- -// By default this will pick up application.yaml from the classpath -Config config = Config.create(); //<1> - -// Get webserver config from the "server" section of application.yaml -ServerConfiguration serverConfig = //<2> - ServerConfiguration.create(config.get("server")); - -WebServer server = WebServer.create(serverConfig, createRouting(config)); //<3> ----- -<1> Loads configuration from `application.yaml`. -<2> Creates the `ServerConfiguration` object from the relevant part of the `Config` -object just loaded. -<3> Creates the server using the config and the updated routing rules (see below). --- -. Start the server. -+ --- -[source,java] -// _include::0-15:{main-class}[tag=startServer,indent=0] ----- -// Try to start the server. If successful, print some info and arrange to -// print a message at shutdown. If unsuccessful, print the exception. -server.start() //<1> - .thenAccept(ws -> { //<2> - System.out.println( - "WEB server is up! http://localhost:" + ws.port() + "/greet"); - ws.whenShutdown().thenRun(() //<3> - -> System.out.println("WEB server is DOWN. Good bye!")); - }) - .exceptionally(t -> { //<4> - System.err.println("Startup failed: " + t.getMessage()); - t.printStackTrace(System.err); - return null; - }); - -// Server threads are not daemon. No need to block. Just react. ----- -<1> Starts the server. -<2> When the startup completes successfully, prints a message. -<3> Prints a message when the server is shut down. The `CompletionStage` returned from `server.whenShutdown()` completes when -some other code invokes `server.shutdown()`. -The current example does not -invoke that method (except from a test), so in this example server the -`CompletionStage` will never complete and so the -message will not be printed. This code _does_ show how easy it is to detect and -respond to an orderly shutdown if you trigger one from your app. -<4> Report a failed startup. --- -. Create routing rules for the app. -+ --- -[source,java] -// _include::0-13:{main-class}[tags=createRouting;!addCustomHealthCheck,indent=0] ----- -private static Routing createRouting(Config config) { - - MetricsSupport metrics = MetricsSupport.create(); - GreetService greetService = new GreetService(config); - HealthSupport health = HealthSupport.builder() - .add(HealthChecks.healthChecks()) // Adds a convenient set of checks - .build(); //<1> - return Routing.builder() //<2> - .register(JsonSupport.create()) - .register(health) // Health at "/health" - .register(metrics) // Metrics at "/metrics" - .register("/greet", greetService) - .build(); -} ----- -<1> Sets up several built-in health checks (deadlock, disk space, heap memory) for -the server. -<2> Builds the `Routing` instance by registering the JSON, health, metrics, and the -app's own greeting service. - -Later steps in this guide show how to add your own, app-specific health check and -metric. --- - -== Build and run -// tag::buildAndRun[] -You can use your IDE's features to build and run the project directly. - -Or, to use Maven outside the IDE, build your app this way: -[source,bash] -mvn package - -and run it like this: -[source,bash,subs="attributes+"] -java -jar target/{artifact-id}.jar - -Once you have started your app, from another command window run these commands -to access its functions: -[[curl-command-table]] -|==== -|Command |Result |Function - -a|[source,bash] -curl -X GET http://localhost:8080/greet -a|[listing] -{"message":"Hello World!"} -|Returns a greeting with no personalization - -a|[source,bash] -curl -X GET http://localhost:8080/greet/Joe -a|[listing] -{"message":"Hello Joe!"} -|Returns the personalized greeting - -a|[source,bash] -curl -X PUT -H "Content-Type: application/json" -d '{"greeting" : "Hola"}' http://localhost:8080/greet/greeting -a| -(no response payload) -|Changes the greeting - -a|[source,bash] -curl -X GET http://localhost:8080/greet/Jose -a|[listing] -{"message":"Hola Jose!"} -|Shows that the greeting change took effect -|==== -// end::buildAndRun[] - -== Add an app-specific health check -// tag::addHealthChecksIntro[] -A well-behaved microservice reports on its own health. -Two common approaches for checking health, often used together, are: - -- readiness - a simple verification that the service has been started, has initialized itself, -and is ready to respond to requests; and -- liveness - often a more thorough assessment of whether -and how well the service can do its job. - -For example, Kubernetes can ping your service's -readiness endpoint after it starts the pod containing the service to determine -when the service is ready to accept requests, withholding traffic until the readiness -endpoint reports success. Kubernetes can use the liveness endpoint to find out if -the service considers itself able to function, attempting a pod restart if the -endpoint reports a problem. - -In general a liveness check might assess: - -- service health - whether the service itself can do its job correctly -- host health - if the host has sufficient resources (for example, disk space) -for the service to operate -- health of other, dependent services - if other services on which this service -depends are themselves OK. - -We will add an app-specific liveness check. -Our greeting service does not depend on any -host resources (like disk space) or any other services. So for this -example we define our service as "alive" in a very trivial way: -if the greeting text has been assigned -_and is not empty_ when trimmed of leading or trailing white space. Otherwise we -consider the service to be unhealthy, in which case the service will -still respond but its answers might not be what we want. - -Normally we would -write our service to make -sure that a newly-assigned greeting is non-empty _before_ -accepting it. But omitting that validation lets us create an easy health check -that we can use by simply setting the greeting to blank from -a `curl` command. -// end::addHealthChecksIntro[] - -=== Revise `GreetService.java` -. Add health-related imports. -+ --- -[source,java] -// _include::0-1:{greet-service}[tag=importsHealth] ----- -import org.eclipse.microprofile.health.HealthCheckResponse; -import org.eclipse.microprofile.health.HealthCheckResponseBuilder; ----- --- -. Add a liveness check method. -+ --- -The new method returns a `HealthCheckResponse`. This will make it -very easy to add our custom health check to the built-in ones already in the code. - -[source,java] -// _include::0-10:{greet-service}[tag=checkAlive] ----- - HealthCheckResponse checkAlive() { - HealthCheckResponseBuilder builder = HealthCheckResponse.builder() - .name("greetingAlive"); //<1> - if (greeting == null || greeting.trim().length() == 0) { //<2> - builder.down() //<3> - .withData("greeting", "not set or is empty"); - } else { - builder.up(); //<4> - } - return builder.build(); //<5> - } ----- -<1> Use a builder to assemble the response, giving the health check a human-readable -name. -<2> Enforce that the greeting be non-empty and non-null in order for the -greeting service to be considered alive. -<3> For a null or empty greeting the response indicates that the service -is _down_, in this case adding an explanation. -<4> For a valid greeting the response says the service is _up_. -<5> Either way, have the builder build the response. --- - -=== Revise `Main.java` -We need to modify the `createRouting` method slightly to add our custom health check to the `HealthSupportBuilder`. -[source,java] -// _include::0-0:{main-class}[tag=addCustomHealthCheck] ----- - .add(greetService::checkAlive) ----- - -Here's the revised method after this change: - -[source,java] -// _include::0-14:{main-class}[tag=createRouting,indent=0] ----- -private static Routing createRouting(Config config) { - - MetricsSupport metrics = MetricsSupport.create(); - GreetService greetService = new GreetService(config); - HealthSupport health = HealthSupport.builder() - .add(HealthChecks.healthChecks()) // Adds a convenient set of checks - .add(greetService::checkAlive) - .build(); //<1> - return Routing.builder() //<2> - .register(JsonSupport.create()) - .register(health) // Health at "/health" - .register(metrics) // Metrics at "/metrics" - .register("/greet", greetService) - .build(); -} ----- -<1> The `health` instance now includes the greet service liveness check. -<2> The returned routing refers to the previously-instantiated and saved `GreetService` -instance. - -// tag::rebuildAndRerunService[] -=== Stop, rebuild and rerun your service - -. Stop any running instance of your app. -. Rebuild the app and then run it. - -// end::rebuildAndRerunService[] - -// tag::tryReadiness[] - -=== Check the server's health -Run this command: -[source,bash] -curl -X GET http://localhost:8080/health | json_pp - -You should see output as shown in this example: -[listing,subs=+quotes] ----- -{ - "checks": [ - { - "name": "deadlock", - "state": "UP" - }, - { - "data": { - "free": "179.37 GB", - "freeBytes": 192597303296, - "percentFree": "38.51%", - "total": "465.72 GB", - "totalBytes": 500068036608 - }, - "name": "diskSpace", - "state": "UP" - }, - *{ - "name": "greetingAlive", - "state": "UP" - }*, - { - "data": { - "free": "255.99 MB", - "freeBytes": 268422144, - "max": "4.00 GB", - "maxBytes": 4294967296, - "percentFree": "98.73%", - "total": "308.00 MB", - "totalBytes": 322961408 - }, - "name": "heapMemory", - "state": "UP" - } - ], - "outcome": "UP" -} ----- -// tag::se-HealthChecks-notes[] -The JSON output conveys various health indicators because the generated code -included `HealthChecks.healthChecks()` in the `HealthSupport.builder`. -// end::se-HealthChecks-notes[] -The item labeled `outcome` describes the overall health of the -server based on all the other indicators. The state of all the indicators is UP. -So the `outcome` field shows UP. You should also see our app-specific liveness check in the output -(bolded above). - -=== Arrange for an unhealthy report -Recall that our simple rule for liveness is that the greeting be non-null and -non-empty. We can easily force our server to report an unhealthy state. - -. Set the greeting to a blank. -+ --- -[source,bash] -curl -X PUT -H "Content-Type: application/json" -d '{"greeting" : " "}' http://localhost:8080/greet/greeting - -Our code to update the greeting accepts this and saves it as the new greeting. --- - -. Ping the health check endpoint again with the same command as before. -+ --- -[source,bash] -curl -X GET http://localhost:8080/health | python -m json.tool - -This time you should see these two parts of the output indicating that something is -wrong: -[listing] ----- - { - "data": { - "greeting": "not set or is empty" - }, - "name": "greetingAlive", - "state": "DOWN" - } -... - "outcome": "DOWN" ----- -If you add `-i` to the `curl` command and remove the pipe, the output includes the status 503 "Service Unavailable" report: -[source,bash] -curl -i -X GET http://localhost:8080/health - -[listing] ----- -HTTP/1.1 503 Service Unavailable -Content-Type: application/json -Date: Tue, 5 Feb 2019 08:09:22 -0600 -transfer-encoding: chunked -connection: keep-alive -... ----- --- - -. Set the greeting back to "Hello", so that the service is healthy again. -+ --- -[source,bash] -curl -X PUT -H "Content-Type: application/json" -d '{"greeting" : "Hello"}' http://localhost:8080/greet/greeting --- - -. Check the health again. -+ --- -[source,bash] -curl -X GET http://localhost:8080/health | python -m json.tool - -This time the `outcome` and `greetingAlive` values will be back to `UP`. --- - -// end::tryReadiness[] - -== Add metrics support -// tag::metricsIntro[] -As a simple illustration of using metrics, we revise our greeting service to count how many times -a client sends a request to the app. -// end::metricsIntro[] - -=== Review default metrics -The generated `Main` class already instantiates and registers `MetricsSupport` in -the `createRouting` method. As a result, the system automatically collects and -reports a number of measurements related to CPU, threads, memory, and request traffic. -Use `curl -X GET http://localhost:8080/metrics` to get the metrics data. - -=== Revise `GreetService.java` to add an app-specific metric -. Add metrics-related imports. -+ --- -[source,java] -// _include::0-2:{greet-service}[tags=importsHelidonMetrics;importsMPMetrics,indent=0] ----- -import io.helidon.metrics.RegistryFactory; -import org.eclipse.microprofile.metrics.Counter; -import org.eclipse.microprofile.metrics.MetricRegistry; ----- --- -. Register a metric in `GreetService.java`. -+ --- -Add these declarations as private fields: -[source,java] -// _include::0-2:{greet-service}[tags=metricsRegistration;counterRegistration] ----- - private final MetricRegistry registry = RegistryFactory.getInstance() - .getRegistry(MetricRegistry.Type.APPLICATION); // <1> - private final Counter greetCounter = registry.counter("accessctr"); // <2> ----- -<1> Refers to the application-scoped metrics registry. -<2> Declares a metric of type `counter` with name `accessctr`. --- - -. Create a method to display which method is handling a request. -+ --- -Add this method: - -[source,java] -// _include::0-3:{greet-service}[tag=displayThread] ----- - private void displayThread() { - String methodName = Thread.currentThread().getStackTrace()[2].getMethodName(); - System.out.println("Method=" + methodName + " " + "Thread=" + Thread.currentThread().getName()); - } ----- --- - -. Create a request handler to update the counter. -+ --- -Add this method: - -[source,java] -// _include::0-5:{greet-service}[tag=counterFilter] ----- - private void counterFilter(final ServerRequest request, - final ServerResponse response) { - displayThread(); // <1> - greetCounter.inc(); // <2> - request.next(); // <3> - } ----- -<1> Shows which method is handling the request. -<2> Updates the counter metric. -<3> Lets the next handler process the same request. --- - -. Register the filter to count requests. -+ --- -To the `update` method add this line immediately before the -existing `get` invocations. - -[source,java] -// _include::0-0:{greet-service}[tag=updateForCounter,indent=0] ----- -.any(this::counterFilter) // <1> ----- -<1> Invokes `counterFilter` for _any_ incoming request. --- - -=== Rebuild and rerun your application -Follow the same steps as before, remembering to stop any instance -of your application that is still running. - -=== Send some requests -Use the same `curl` commands from the beginning to send requests to the server: - -|==== -|Command |Server Output - -a|[source,bash] -curl -X GET http://localhost:8080/greet -a|[listing] -Method=counterFilter Thread=nioEventLoopGroup-3-1 - -a|[source,bash] -curl -X GET http://localhost:8080/greet/Joe -a|[listing] -Method=counterFilter Thread=nioEventLoopGroup-3-2 - -a|[source,bash] -curl -X PUT -H "Content-Type: application/json" -d '{"greeting" : "Hola"}' http://localhost:8080/greet/greeting -a|[listing] -Method=counterFilter Thread=nioEventLoopGroup-3-3 - -a|[source,bash] -curl -X GET http://localhost:8080/greet/Jose -a|[listing] -Method=counterFilter Thread=nioEventLoopGroup-3-4 -|==== - -=== Retrieve metrics -Run this `curl` command to retrieve the collected metrics: -[source,bash] ----- -curl -X GET http://localhost:8080/metrics ----- - -You should see a long response. Note two items: -|==== -|Output |Meaning - -a|[listing] - application:accessctr 4 - -|The counter we added to the app - -a|[listing] -vendor:requests_count 7 - -|The total number of HTTP requests that the Helidon web server received -|==== -The requests count is higher because the access to `/metrics` to retrieve the -monitoring data is _not_ handled by our app's rules and filters but by the -metrics infrastructure. - -[[downloading,Download the example source]] -== (Optional) Download the example source -// tag::downloading[] -Instead of generating and then enhancing the application as described in this guide, -you can download it. - -. Clone the Helidon repository: -+ --- -[source,bash] -.Using ssh -git clone git@github.com:oracle/helidon.git - -or -[source,bash] -.Using HTTPS -git clone https://github.com/oracle/helidon.git --- -. `cd` to the `helidon/examples/guides/{artifact-id}` directory. -. Run: -+ --- -[source,bash,subs="attributes+"] ----- -mvn package -java -jar target/{artifact-id}.jar ----- --- -// end::downloading[] diff --git a/examples/guides/se-restful-webservice/src/main/java/io/helidon/guides/se/restfulwebservice/GreetService.java b/examples/guides/se-restful-webservice/src/main/java/io/helidon/guides/se/restfulwebservice/GreetService.java deleted file mode 100644 index 1e044b3c4..000000000 --- a/examples/guides/se-restful-webservice/src/main/java/io/helidon/guides/se/restfulwebservice/GreetService.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.guides.se.restfulwebservice; - -import java.util.Collections; - -//tag::importsStart[] -import javax.json.Json; -import javax.json.JsonBuilderFactory; -import javax.json.JsonObject; - -import io.helidon.common.http.Http; -import io.helidon.config.Config; -//end::importsStart[] -//tag::importsHelidonMetrics[] -import io.helidon.metrics.RegistryFactory; -//end::importsHelidonMetrics[] -//tag::importsWebServer[] -import io.helidon.webserver.Routing; -import io.helidon.webserver.ServerRequest; -import io.helidon.webserver.ServerResponse; -import io.helidon.webserver.Service; -// end::importsWebServer[] -// tag::importsHealth[] -import org.eclipse.microprofile.health.HealthCheckResponse; -import org.eclipse.microprofile.health.HealthCheckResponseBuilder; -// end::importsHealth[] -// tag::importsMPMetrics[] -import org.eclipse.microprofile.metrics.Counter; -import org.eclipse.microprofile.metrics.MetricRegistry; -// end::importsMPMetrics[] - -/** - * A simple service to greet you. Examples: - * - * Get default greeting message: - * curl -X GET http://localhost:8080/greet - * - * Get greeting message for Joe: - * curl -X GET http://localhost:8080/greet/Joe - * - * Change greeting - * curl -X PUT -H "Content-Type: application/json" -d '{"greeting" : "Howdy"}' http://localhost:8080/greet/greeting - * - * The message is returned as a JSON object - */ - -//tag::classDef[] -public class GreetService implements Service { -//end::classDef[] - /** - * The config value for the key {@code greeting}. - */ - private String greeting; - - private static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap()); - - /** - * Create metric registry. - */ - // tag::metricsRegistration[] - private final MetricRegistry registry = RegistryFactory.getInstance() - .getRegistry(MetricRegistry.Type.APPLICATION); // <1> - // end::metricsRegistration[] - - /** - * Counter for all requests to this service. - */ - // tag::counterRegistration[] - private final Counter greetCounter = registry.counter("accessctr"); // <2> - // end::counterRegistration[] - - //tag::ctor[] - GreetService(Config config) { - this.greeting = config.get("app.greeting").asString().orElse("Ciao"); //<1> - } - //end::ctor[] - - /** - * A service registers itself by updating the routine rules. - * @param rules the routing rules. - */ - // tag::update[] - @Override - public void update(Routing.Rules rules) { - rules - // tag::updateForCounter[] - .any(this::counterFilter) // <1> - // end::updateForCounter[] - .get("/", this::getDefaultMessageHandler) //<1> - .get("/{name}", this::getMessageHandler) //<2> - .put("/greeting", this::updateGreetingHandler); //<3> - } - // end::update[] - - /** - * Return a worldly greeting message. - * @param request the server request - * @param response the server response - */ - // tag::getDefaultMessage[] - private void getDefaultMessageHandler(ServerRequest request, - ServerResponse response) { - sendResponse(response, "World"); //<1> - } - //end::getDefaultMessage[] - - /** - * Return a greeting message using the name that was provided. - * @param request the server request - * @param response the server response - */ - // tag::getMessage[] - private void getMessageHandler(ServerRequest request, - ServerResponse response) { - String name = request.path().param("name"); //<1> - sendResponse(response, name); //<2> - } - // end::getMessage[] - - private void sendResponse(ServerResponse response, String name) { - String msg = String.format("%s %s!", greeting, name); - - JsonObject returnObject = JSON.createObjectBuilder() - .add("message", msg) - .build(); - response.send(returnObject); - } - - // tag::updateGreetingFromJson[] - private void updateGreetingFromJson(JsonObject jo, ServerResponse response) { - - if (!jo.containsKey("greeting")) { // <1> - JsonObject jsonErrorObject = JSON.createObjectBuilder() - .add("error", "No greeting provided") - .build(); - response.status(Http.Status.BAD_REQUEST_400) - .send(jsonErrorObject); - return; - } - - greeting = jo.getString("greeting"); // <2> - - response.status(Http.Status.NO_CONTENT_204) // <3> - .send(); - } - // end::updateGreetingFromJson[] - - /** - * Set the greeting to use in future messages. - * @param request the server request - * @param response the server response - */ - // tag::updateGreeting[] - private void updateGreetingHandler(ServerRequest request, - ServerResponse response) { - request.content().as(JsonObject.class) // <1> - .thenAccept(jo -> updateGreetingFromJson(jo, response)); - } - // end::updateGreeting[] - - // tag::checkAlive[] - HealthCheckResponse checkAlive() { - HealthCheckResponseBuilder builder = HealthCheckResponse.builder() - .name("greetingAlive"); //<1> - if (greeting == null || greeting.trim().length() == 0) { //<2> - builder.down() //<3> - .withData("greeting", "not set or is empty"); - } else { - builder.up(); //<4> - } - return builder.build(); //<5> - } - // end::checkAlive[] - - /** - * Increments a simple counter. - * Calls request.next() to ensure other handlers are called. - * @param request - * @param response - */ - // tag::counterFilter[] - private void counterFilter(final ServerRequest request, - final ServerResponse response) { - displayThread(); // <1> - greetCounter.inc(); // <2> - request.next(); // <3> - } - // end::counterFilter[] - - // tag::displayThread[] - private void displayThread() { - String methodName = Thread.currentThread().getStackTrace()[2].getMethodName(); - System.out.println("Method=" + methodName + " " + "Thread=" + Thread.currentThread().getName()); - } - // end::displayThread[] -} diff --git a/examples/health/basics/README.md b/examples/health/basics/README.md index 0154c0bd2..40e46e3fc 100644 --- a/examples/health/basics/README.md +++ b/examples/health/basics/README.md @@ -1,18 +1,13 @@ - # Helidon Health Basic Example This example shows the basics of using Helidon SE Health. It uses the set of built-in health checks that Helidon provides plus defines a custom health check. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-health-basics.jar ``` diff --git a/examples/health/basics/pom.xml b/examples/health/basics/pom.xml index 7dc599c0f..dbeb894fb 100644 --- a/examples/health/basics/pom.xml +++ b/examples/health/basics/pom.xml @@ -18,13 +18,14 @@ - - helidon-examples-health-project - io.helidon.examples.health - 1.2.2-SNAPSHOT - 4.0.0 - + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + + io.helidon.examples.health helidon-examples-health-basics Helidon Health Examples Basics @@ -40,17 +41,14 @@ io.helidon.health helidon-health - ${project.version} io.helidon.health helidon-health-checks - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} org.junit.jupiter diff --git a/examples/health/pom.xml b/examples/health/pom.xml index 0aee79920..31447f2d5 100644 --- a/examples/health/pom.xml +++ b/examples/health/pom.xml @@ -18,21 +18,18 @@ + 4.0.0 helidon-examples-project io.helidon.examples 1.2.2-SNAPSHOT - 4.0.0 + io.helidon.examples.health + helidon-examples-health-project + pom Helidon Health Examples - pom basics - - io.helidon.examples.health - helidon-examples-health-project - - diff --git a/examples/integrations/README.md b/examples/integrations/README.md new file mode 100644 index 000000000..05fd10c9d --- /dev/null +++ b/examples/integrations/README.md @@ -0,0 +1 @@ +# Helidon Integrations Examples diff --git a/examples/integrations/cdi/README.md b/examples/integrations/cdi/README.md new file mode 100644 index 000000000..64fad7955 --- /dev/null +++ b/examples/integrations/cdi/README.md @@ -0,0 +1 @@ +# Helidon Integrations CDI Examples diff --git a/examples/integrations/cdi/datasource-hikaricp-h2/README.adoc b/examples/integrations/cdi/datasource-hikaricp-h2/README.adoc deleted file mode 100644 index 7351fd10f..000000000 --- a/examples/integrations/cdi/datasource-hikaricp-h2/README.adoc +++ /dev/null @@ -1,30 +0,0 @@ -= H2 Integration Example - -== Overview - -This example shows a trivial Helidon MicroProfile application that -uses the Hikari connection pool CDI integration and an H2 in-memory -database. - -== Notes - -To compile and package the sample application: - -[source,sh] ----- -$ mvn clean package ----- - -To run the sample application: - -[source,sh] ----- -$ java -jar target/helidon-integrations-examples-datasource-hikaricp-h2-*.jar ----- - -To see the results of running the sample application: - -[source,sh] ----- -$ curl http://localhost:8080/tables ----- diff --git a/examples/integrations/cdi/datasource-hikaricp-h2/README.md b/examples/integrations/cdi/datasource-hikaricp-h2/README.md new file mode 100644 index 000000000..647241763 --- /dev/null +++ b/examples/integrations/cdi/datasource-hikaricp-h2/README.md @@ -0,0 +1,20 @@ +# H2 Integration Example + +## Overview + +This example shows a trivial Helidon MicroProfile application that +uses the Hikari connection pool CDI integration and an H2 in-memory +database. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-integrations-examples-datasource-hikaricp-h2.jar +``` + +Try the endpoint: +```bash +curl http://localhost:8080/tables +``` diff --git a/examples/integrations/cdi/datasource-hikaricp-h2/pom.xml b/examples/integrations/cdi/datasource-hikaricp-h2/pom.xml index e95ae4e2c..d11c95a7f 100644 --- a/examples/integrations/cdi/datasource-hikaricp-h2/pom.xml +++ b/examples/integrations/cdi/datasource-hikaricp-h2/pom.xml @@ -22,62 +22,15 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project - 1.2.2-SNAPSHOT + io.helidon.applications + helidon-mp + 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml + io.helidon.examples.integrations.cdi helidon-integrations-examples-datasource-hikaricp-h2 Helidon CDI Extensions Examples DataSource/HikariCP H2 - - libs - ${project.artifactId} - ${project.basedir}/src/main/spotbugs/exclusions.xml - - - - - - src/main/resources - true - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - @@ -120,30 +73,22 @@ io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} runtime org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -151,17 +96,28 @@ javax.activation-api runtime - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/integrations/cdi/datasource-hikaricp-h2/src/main/spotbugs/exclusions.xml b/examples/integrations/cdi/datasource-hikaricp-h2/src/main/spotbugs/exclusions.xml deleted file mode 100644 index 632ae3bb6..000000000 --- a/examples/integrations/cdi/datasource-hikaricp-h2/src/main/spotbugs/exclusions.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/examples/integrations/cdi/datasource-hikaricp-mysql/README.adoc b/examples/integrations/cdi/datasource-hikaricp-mysql/README.md similarity index 66% rename from examples/integrations/cdi/datasource-hikaricp-mysql/README.adoc rename to examples/integrations/cdi/datasource-hikaricp-mysql/README.md index 220937e15..1a538401c 100644 --- a/examples/integrations/cdi/datasource-hikaricp-mysql/README.adoc +++ b/examples/integrations/cdi/datasource-hikaricp-mysql/README.md @@ -1,12 +1,12 @@ -= MySQL Integration Example +# MySQL Integration Example -== Overview +## Overview This example shows a trivial Helidon MicroProfile application that uses the MySQL CDI integration. It also shows how to run MySQL in a Docker container and connect to it using the application. -== Notes +## Notes To run MySQL's `mysql:8` Docker image in a Docker container named `mysql` that publishes its port 3306 to the host machine's port 3306 @@ -14,7 +14,10 @@ and uses `tiger` as the MySQL root password and that will automatically be removed when it is stopped: ```sh -$ docker container run --rm --name mysql --detach --env MYSQL_ROOT_PASSWORD=tiger --publish 3306:3306 mysql:8 +docker container run --rm -d -p 3306:3306 \ + --env MYSQL_ROOT_PASSWORD=tiger \ + --name mysql \ + mysql:8 ``` (Note that in the `3306:3306` option value above the first port number @@ -34,32 +37,25 @@ javax.sql.DataSource.example.dataSource.user = root javax.sql.DataSource.example.dataSource.password = tiger ``` -To compile and package the sample application: -```sh -$ mvn clean package +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-integrations-examples-datasource-hikaricp-mysql.jar ``` -To run the sample application: - +Try the endpoint: ```sh -$ java -jar target/helidon-integrations-examples-datasource-hikaricp-mysql-*.jar +curl http://localhost:8080/tables ``` -To see the results of running the sample application: - -```sh -$ curl http://localhost:8080/tables +Stop the docker container: +```bash +docker stop mysql ``` -To stop and remove the `mysql` Docker container: +## References -```sh -$ docker container stop mysql -``` - -== References - -MySQL Docker documentation: - -https://hub.docker.com/_/mysql?tab=description +- [MySQL Docker documentation](https://hub.docker.com/_/mysql?tab=description) diff --git a/examples/integrations/cdi/datasource-hikaricp-mysql/pom.xml b/examples/integrations/cdi/datasource-hikaricp-mysql/pom.xml index 935bb9638..3ec10403f 100644 --- a/examples/integrations/cdi/datasource-hikaricp-mysql/pom.xml +++ b/examples/integrations/cdi/datasource-hikaricp-mysql/pom.xml @@ -22,62 +22,15 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project - 1.2.2-SNAPSHOT + io.helidon.applications + helidon-mp + 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml + io.helidon.examples.integrations.cdi helidon-integrations-examples-datasource-hikaricp-mysql Helidon CDI Extensions Examples DataSource/HikariCP MySQL - - libs - ${project.artifactId} - ${project.basedir}/src/main/spotbugs/exclusions.xml - - - - - - src/main/resources - true - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - @@ -121,30 +74,22 @@ io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} runtime org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -152,17 +97,28 @@ javax.activation-api runtime - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/integrations/cdi/datasource-hikaricp-mysql/src/main/spotbugs/exclusions.xml b/examples/integrations/cdi/datasource-hikaricp-mysql/src/main/spotbugs/exclusions.xml deleted file mode 100644 index 632ae3bb6..000000000 --- a/examples/integrations/cdi/datasource-hikaricp-mysql/src/main/spotbugs/exclusions.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/examples/integrations/cdi/datasource-hikaricp/.dockerignore b/examples/integrations/cdi/datasource-hikaricp/.dockerignore new file mode 100644 index 000000000..2f7896d1d --- /dev/null +++ b/examples/integrations/cdi/datasource-hikaricp/.dockerignore @@ -0,0 +1 @@ +target/ diff --git a/examples/integrations/cdi/datasource-hikaricp/Dockerfile b/examples/integrations/cdi/datasource-hikaricp/Dockerfile new file mode 100644 index 000000000..e86f4cc48 --- /dev/null +++ b/examples/integrations/cdi/datasource-hikaricp/Dockerfile @@ -0,0 +1,44 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-integrations-datasource-hikaricp.jar ./ +COPY --from=build /helidon/target/libs ./libs + +CMD [ "java", "-jar", "helidon-examples-integrations-datasource-hikaricp.jar" ] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/integrations/cdi/datasource-hikaricp/README.adoc b/examples/integrations/cdi/datasource-hikaricp/README.md similarity index 52% rename from examples/integrations/cdi/datasource-hikaricp/README.adoc rename to examples/integrations/cdi/datasource-hikaricp/README.md index 16dbe6d66..a544ba881 100644 --- a/examples/integrations/cdi/datasource-hikaricp/README.adoc +++ b/examples/integrations/cdi/datasource-hikaricp/README.md @@ -1,86 +1,84 @@ -= Hikari Connection Pool Integration Example +# Hikari Connection Pool Integration Example -== Overview +## Overview This example shows a trivial Helidon MicroProfile application that uses the Hikari connection pool CDI integration. It also shows how to run the Oracle database in a Docker container and connect the application to it. -== Prerequisites +## Prerequisites You'll need an Oracle account in order to log in to the Oracle Container Registry. The Oracle Container Registry is where the Docker image housing the Oracle database is located. To set up an Oracle account if you don't already have one, see -https://profile.oracle.com/myprofile/account/create-account.jspx[the -Oracle account creation website]. +[the Oracle account creation website](https://profile.oracle.com/myprofile/account/create-account.jspx). -== Notes +## Notes To log in to the Oracle Container Registry (which you will need to do in order to download Oracle database Docker images from it): -```sh -$ docker login -u youroracleaccountusername -p youroracleaccountpassword container-registry.oracle.com +```bash +docker login -u username -p password container-registry.oracle.com ``` For more information on the Oracle Container Registry, please visit -https://container-registry.oracle.com[its website]. +its [website](https://container-registry.oracle.com/). To run Oracle's `database/standard` Docker image in a Docker container named `oracle` that publishes ports 1521 and 5500 to the host while relying on the defaults for all other settings: -```sh -$ docker container run --name oracle --detach -it --publish 1521:1521 --publish 5500:5500 --shm-size=3g container-registry.oracle.com/database/standard:latest +```bash +docker container run -d -it -p 1521:1521 -p 5500:5500 --shm-size=3g \ + --name oracle \ + container-registry.oracle.com/database/standard:latest ``` It will take about ten minutes before the database is ready. For more information on the Oracle database image used by this -example, you can -https://container-registry.oracle.com/pls/apex/f?p=113:4:3827722129447::NO:4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:8,8,Oracle%20Database%20Standard%20Edition%202,Oracle%20Database%20Standard%20Edition%202,1,0&cs=3nIcgJHiB_JVq-TKtUGpXhgubcpYkxbkLuLVaSJiNUK0IvSbCvuInbyzUFw9Ynh95xG4QGEYYpBbKKOVKpCnzAw[visit -the relevant section of the Oracle Container Registry website]. +example, you can visit the relevant section of the + [Oracle Container Registry website](https://container-registry.oracle.com/). To ensure that the sample application is configured to talk to the Oracle database running in this Docker container, verify that the following lines (among others) are present in `src/main/resources/META-INF/microprofile-config.properties`: -``` +```properties javax.sql.DataSource.example.dataSourceClassName=oracle.jdbc.pool.OracleDataSource javax.sql.DataSource.example.dataSource.url = jdbc:oracle:thin:@localhost:1521:ORCL javax.sql.DataSource.example.dataSource.user = sys as sysoper javax.sql.DataSource.example.dataSource.password = Oracle ``` -To compile and package the sample application: +## Build and run -```sh -$ mvn clean package +With Docker: +```bash +docker build -t helidon-examples-integrations-datasource-hikaricp . +docker run --rm -d \ + --link oracle \ + -e javax_sql_DataSource_example_dataSource_url="jdbc:oracle:thin:@oracle:1521:ORCL" \ + --name helidon-examples-integrations-datasource-hikaricp \ + -p 8080:8080 helidon-examples-integrations-datasource-hikaricp:latest ``` -To run the application: - -```sh -$ java -jar target/helidon-examples-integrations-datasource-hikaricp-*.jar +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-integrations-datasource-hikaricp.jar ``` -To see the results of running the sample application: - -```sh -$ curl http://localhost:8080/tables +Try the endpoint: +```bash +curl http://localhost:8080/tables ``` -To stop the `oracle` Docker container: - -```sh -$ docker container stop oracle -``` - -To remove the `oracle` Docker container: - -```sh -$ docker container rm oracle -``` +Stop the docker containers: +```bash +docker stop oracle helidon-examples-integrations-datasource-hikaricp +``` \ No newline at end of file diff --git a/examples/integrations/cdi/datasource-hikaricp/pom.xml b/examples/integrations/cdi/datasource-hikaricp/pom.xml index ee27c5503..a3d32c037 100644 --- a/examples/integrations/cdi/datasource-hikaricp/pom.xml +++ b/examples/integrations/cdi/datasource-hikaricp/pom.xml @@ -22,102 +22,15 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml + io.helidon.examples.integrations.cdi helidon-examples-integrations-datasource-hikaricp Helidon CDI Extensions Examples DataSource/HikariCP - - libs - ${project.artifactId} - ${project.basedir}/src/main/spotbugs/exclusions.xml - - - - - - src/main/resources - true - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - maven-resources-plugin - - - copy-resources - process-resources - - copy-resources - - - ${project.build.directory} - - - src/main/docker - true - - Dockerfile - - - - true - src/main/k8s - - datasource.secrets.template - app.yaml - - - - - - - - - maven-surefire-plugin - - - - - - - - @@ -165,30 +78,22 @@ io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} runtime org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -196,17 +101,40 @@ javax.activation-api runtime - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + + + + + + maven.oracle.com + https://maven.oracle.com + default + + true + + + diff --git a/examples/integrations/cdi/datasource-hikaricp/src/main/docker/Dockerfile b/examples/integrations/cdi/datasource-hikaricp/src/main/docker/Dockerfile deleted file mode 100644 index 168bc122e..000000000 --- a/examples/integrations/cdi/datasource-hikaricp/src/main/docker/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -FROM openjdk:8-jre-alpine -EXPOSE 8080 -RUN mkdir /app -COPY ${project.build.finalName}.jar /app -COPY ${dependenciesDirectory} /app/${dependenciesDirectory} -CMD [ \ -"sh", "-c", \ -"exec java \ --XX:+UnlockExperimentalVMOptions \ --XX:+UseCGroupMemoryLimitForHeap \ --jar /app/${project.build.finalName}.jar" \ -] diff --git a/examples/integrations/cdi/datasource-hikaricp/src/main/spotbugs/exclusions.xml b/examples/integrations/cdi/datasource-hikaricp/src/main/spotbugs/exclusions.xml deleted file mode 100644 index 0e98aa554..000000000 --- a/examples/integrations/cdi/datasource-hikaricp/src/main/spotbugs/exclusions.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/examples/integrations/cdi/jedis/.dockerignore b/examples/integrations/cdi/jedis/.dockerignore new file mode 100644 index 000000000..2f7896d1d --- /dev/null +++ b/examples/integrations/cdi/jedis/.dockerignore @@ -0,0 +1 @@ +target/ diff --git a/examples/integrations/cdi/jedis/Dockerfile b/examples/integrations/cdi/jedis/Dockerfile new file mode 100644 index 000000000..fb1b9e644 --- /dev/null +++ b/examples/integrations/cdi/jedis/Dockerfile @@ -0,0 +1,44 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-integrations-cdi-jedis.jar ./ +COPY --from=build /helidon/target/libs ./libs + +CMD [ "java", "-jar", "helidon-examples-integrations-cdi-jedis.jar" ] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/integrations/cdi/jedis/README.md b/examples/integrations/cdi/jedis/README.md new file mode 100644 index 000000000..88fb47b76 --- /dev/null +++ b/examples/integrations/cdi/jedis/README.md @@ -0,0 +1,53 @@ +# Jedis Integration Example + +## Start Redis + +```bash +docker run --rm --name redis -d -p 6379:6379 redis +``` + +## Build and run + +With Docker: +```bash +docker build -t helidon-examples-integrations-cdi-jedis . +docker run --rm -d \ + --link redis + --name helidon-examples-integrations-cdi-jedis \ + -p 8080:8080 helidon-examples-integrations-cdi-jedis:latest +``` + +With Java 8+: +```bash +mvn package +java -jar target/helidon-examples-integrations-cdi-jedis.jar +``` + +Try the endpoint: +```bash +curl -X PUT -H "Content-Type: text/plain" http://localhost:8080/jedis/foo -d 'bar' +curl http://localhost:8080/jedis/foo +``` + +## Run with Kubernetes (docker for desktop) + +```bash +docker build -t helidon-examples-integrations-cdi-jedis . +kubectl apply -f ../../k8s/ingress.yaml -f app.yaml +``` + +Try the endpoint: +```bash +curl -X PUT -H "Content-Type: text/plain" http://localhost/helidon-cdi-jedis/jedis/foo -d 'bar' +curl http://localhost/helidon-cdi-jedis/jedis/foo +``` + +Stop the docker containers: +```bash +docker stop redis helidon-examples-integrations-cdi-jedis +``` + +Delete the Kubernetes resources: +```bash +kubectl delete -f ../../k8s/ingress.yaml -f app.yaml +``` \ No newline at end of file diff --git a/examples/integrations/cdi/jedis/app.yaml b/examples/integrations/cdi/jedis/app.yaml new file mode 100644 index 000000000..5a3c2b510 --- /dev/null +++ b/examples/integrations/cdi/jedis/app.yaml @@ -0,0 +1,69 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +--- +kind: Deployment +apiVersion: extensions/v1beta1 +metadata: + name: helidon-examples-integrations-cdi-jedis +spec: + replicas: 1 + template: + metadata: + labels: + app: helidon-examples-integrations-cdi-jedis + version: v1 + spec: + containers: + - name: helidon-examples-integrations-cdi-jedis + image: helidon-examples-integrations-cdi-jedis + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + env: + - name: redis_clients_jedis_JedisPool_default_host + value: redis +--- +kind: Service +apiVersion: v1 +metadata: + name: helidon-examples-integrations-cdi-jedis + labels: + app: helidon-examples-integrations-cdi-jedis +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + selector: + app: helidon-examples-integrations-cdi-jedis + sessionAffinity: None +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: helidon-examples-integrations-cdi-jedis + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 +spec: + rules: + - host: localhost + http: + paths: + - path: /helidon-cdi-jedis/(.*) + backend: + serviceName: helidon-examples-integrations-cdi-jedis + servicePort: 8080 \ No newline at end of file diff --git a/examples/integrations/cdi/jedis/pom.xml b/examples/integrations/cdi/jedis/pom.xml index 8dc5103b1..a47bed3ad 100644 --- a/examples/integrations/cdi/jedis/pom.xml +++ b/examples/integrations/cdi/jedis/pom.xml @@ -21,102 +21,15 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml - helidon-examples-integrations-jedis + io.helidon.examples.integrations.cdi + helidon-examples-integrations-cdi-jedis Helidon CDI Extensions Examples Jedis - - libs - ${project.artifactId} - ${project.basedir}/src/main/spotbugs/exclusions.xml - - - - - - src/main/resources - true - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - maven-resources-plugin - - - copy-resources - process-resources - - copy-resources - - - ${project.build.directory} - - - src/main/docker - true - - Dockerfile - - - - true - src/main/k8s - - jedis.secrets.template - app.yaml - - - - - - - - - maven-surefire-plugin - - - - - - - - @@ -159,30 +72,22 @@ io.helidon.integrations.cdi helidon-integrations-cdi-jedis - ${project.version} runtime org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -190,17 +95,28 @@ javax.activation-api runtime - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/integrations/cdi/jedis/src/main/k8s/app.yaml b/examples/integrations/cdi/jedis/redis.yaml similarity index 66% rename from examples/integrations/cdi/jedis/src/main/k8s/app.yaml rename to examples/integrations/cdi/jedis/redis.yaml index 29a1257ac..d1f32711e 100644 --- a/examples/integrations/cdi/jedis/src/main/k8s/app.yaml +++ b/examples/integrations/cdi/jedis/redis.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,34 +17,32 @@ kind: Service apiVersion: v1 metadata: - name: ${project.artifactId} - labels: - app: ${project.artifactId} + name: redis spec: - type: NodePort + type: ClusterIP selector: - app: ${project.artifactId} + app: redis ports: - - port: 8080 - targetPort: 8080 - name: http + - name: tcp + port: 6379 + targetPort: 6379 + --- -kind: Deployment + apiVersion: extensions/v1beta1 +kind: Deployment metadata: - name: ${project.artifactId} + name: redis spec: replicas: 1 template: metadata: labels: - app: ${project.artifactId} - version: v1 + app: redis spec: containers: - - name: ${project.artifactId} - image: ${project.artifactId} + - name: redis + image: redis:5 imagePullPolicy: IfNotPresent ports: - - containerPort: 8080 ---- + - containerPort: 6379 diff --git a/examples/integrations/cdi/jedis/src/main/docker/Dockerfile b/examples/integrations/cdi/jedis/src/main/docker/Dockerfile deleted file mode 100644 index 168bc122e..000000000 --- a/examples/integrations/cdi/jedis/src/main/docker/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -FROM openjdk:8-jre-alpine -EXPOSE 8080 -RUN mkdir /app -COPY ${project.build.finalName}.jar /app -COPY ${dependenciesDirectory} /app/${dependenciesDirectory} -CMD [ \ -"sh", "-c", \ -"exec java \ --XX:+UnlockExperimentalVMOptions \ --XX:+UseCGroupMemoryLimitForHeap \ --jar /app/${project.build.finalName}.jar" \ -] diff --git a/examples/integrations/cdi/jedis/src/main/spotbugs/exclusions.xml b/examples/integrations/cdi/jedis/src/main/spotbugs/exclusions.xml deleted file mode 100644 index f5b4e7380..000000000 --- a/examples/integrations/cdi/jedis/src/main/spotbugs/exclusions.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - diff --git a/examples/integrations/cdi/jpa/README.md b/examples/integrations/cdi/jpa/README.md new file mode 100644 index 000000000..6bb4115fa --- /dev/null +++ b/examples/integrations/cdi/jpa/README.md @@ -0,0 +1,13 @@ +# JPA Integration Example + +With Java 8+: +```bash +mvn package +java -jar target/helidon-integrations-examples-jpa.jar +``` + +Try the endpoint: +```bash +curl -X POST -H "Content-Type: text/plain" http://localhost:8080/foo -d 'bar' +curl http://localhost:8080/foo +``` diff --git a/examples/integrations/cdi/jpa/pom.xml b/examples/integrations/cdi/jpa/pom.xml index 7c2c6c89f..67ce98932 100644 --- a/examples/integrations/cdi/jpa/pom.xml +++ b/examples/integrations/cdi/jpa/pom.xml @@ -22,105 +22,15 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml + io.helidon.examples.integrations.cdi helidon-integrations-examples-jpa Helidon CDI Extensions Examples JPA - - libs - - - - - - src/main/resources - true - - - - - com.ethlo.persistence.tools - eclipselink-maven-plugin - 2.7.1.1 - - - javax.annotation - javax.annotation-api - ${version.lib.annotation-api} - - - javax.xml.bind - jaxb-api - ${version.lib.jaxb-api} - - - - - weave - process-classes - - weave - - - - modelgen - generate-sources - - modelgen - - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - @@ -158,48 +68,37 @@ io.helidon.integrations.cdi helidon-integrations-cdi-eclipselink - ${project.version} runtime io.helidon.integrations.cdi helidon-integrations-cdi-jta-weld - ${project.version} runtime io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} runtime io.helidon.integrations.cdi helidon-integrations-cdi-jpa - ${project.version} runtime org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -242,4 +141,47 @@ compile + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + com.ethlo.persistence.tools + eclipselink-maven-plugin + + + weave + process-classes + + weave + + + + modelgen + generate-sources + + modelgen + + + + + + diff --git a/examples/integrations/cdi/jpa/src/main/resources/META-INF/microprofile-config.properties b/examples/integrations/cdi/jpa/src/main/resources/META-INF/microprofile-config.properties index 09f0967ec..ea617351a 100644 --- a/examples/integrations/cdi/jpa/src/main/resources/META-INF/microprofile-config.properties +++ b/examples/integrations/cdi/jpa/src/main/resources/META-INF/microprofile-config.properties @@ -17,3 +17,7 @@ javax.sql.DataSource.test.dataSourceClassName=org.h2.jdbcx.JdbcDataSource javax.sql.DataSource.test.dataSource.url=jdbc:h2:mem:test;INIT=CREATE TABLE GREETING (FIRSTPART VARCHAR NOT NULL, SECONDPART VARCHAR NOT NULL, PRIMARY KEY (FIRSTPART))\\;INSERT INTO GREETING (FIRSTPART, SECONDPART) VALUES ('hello', 'world') javax.sql.DataSource.test.username=sa javax.sql.DataSource.test.password= + +# Microprofile server properties +server.port=8080 +server.host=0.0.0.0 diff --git a/examples/integrations/cdi/oci-objectstorage/.dockerignore b/examples/integrations/cdi/oci-objectstorage/.dockerignore new file mode 100644 index 000000000..2f7896d1d --- /dev/null +++ b/examples/integrations/cdi/oci-objectstorage/.dockerignore @@ -0,0 +1 @@ +target/ diff --git a/examples/integrations/cdi/oci-objectstorage/.gitignore b/examples/integrations/cdi/oci-objectstorage/.gitignore new file mode 100644 index 000000000..9eeba9e08 --- /dev/null +++ b/examples/integrations/cdi/oci-objectstorage/.gitignore @@ -0,0 +1 @@ +oci-env diff --git a/examples/integrations/cdi/oci-objectstorage/Dockerfile b/examples/integrations/cdi/oci-objectstorage/Dockerfile new file mode 100644 index 000000000..e6f3c4b5d --- /dev/null +++ b/examples/integrations/cdi/oci-objectstorage/Dockerfile @@ -0,0 +1,52 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-integrations-cdi-oci-objectstorage.jar ./ +COPY --from=build /helidon/target/libs ./libs + +CMD [ "sh", "-c", "exec java \ + -Doci.auth.fingerprint=\"${OCI_AUTH_FINGERPRINT}\" \ + -Doci.auth.passphraseCharacters=\"${OCI_AUTH_PASSPHRASE}\" \ + -Doci.auth.privateKey=\"${OCI_AUTH_PRIVATEKEY}\" \ + -Doci.auth.tenancy=\"${OCI_AUTH_TENANCY}\" \ + -Doci.auth.user=\"${OCI_AUTH_USER}\" \ + -Doci.objectstorage.compartmentId=\"${OCI_OBJECTSTORAGE_COMPARTMENT}\" \ + -Doci.objectstorage.region=\"${OCI_OBJECTSTORAGE_REGION}\" \ + -jar helidon-examples-integrations-cdi-oci-objectstorage.jar" ] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/integrations/cdi/oci-objectstorage/README.adoc b/examples/integrations/cdi/oci-objectstorage/README.adoc deleted file mode 100644 index 8f6278666..000000000 --- a/examples/integrations/cdi/oci-objectstorage/README.adoc +++ /dev/null @@ -1,24 +0,0 @@ -= OCI Object Storage CDI Integration Example - -== Build - ----- -mvn clean install ----- - -== Deploy to Kubernetes - -First you need to create Kubernetes secrets to store sensitive OCI -information. - -To start, make a copy of the Bash script located (after building the -project) in `target/oci.secrets.template` and name it whatever you -like. This guide will refer to it as, simply, `oci.secrets`. - -Now edit `oci.secrets` to contain the information you'll need to -connect to OCI services. - -Once you have properly customized the variables in `oci.secrets`, you -can execute it. `kubectl`, invoked by the script, will create a -Kubernetes secret that will contain all the OCI connectivity -information. diff --git a/examples/integrations/cdi/oci-objectstorage/README.md b/examples/integrations/cdi/oci-objectstorage/README.md new file mode 100644 index 000000000..6383ef77c --- /dev/null +++ b/examples/integrations/cdi/oci-objectstorage/README.md @@ -0,0 +1,73 @@ +# OCI Object Storage CDI Integration Example + +## OCI setup + +Setup your OCI SDK [configuration](https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm) + if you haven't done so already, and then run the following command: +```bash +./oci-setup.sh && source oci-env +``` + +This example requires an Object Storage, you can create one using the + [OCI console](https://console.us-phoenix-1.oraclecloud.com). Once created, + upload a file in order to exercise the example. + +## Build and run + +With Docker: +```bash +docker build -t helidon-examples-integrations-cdi-oci-objectstorage . +docker run --rm -d -p 8080:8080 \ + -e OCI_AUTH_PRIVATEKEY \ + -e OCI_AUTH_FINGERPRINT \ + -e OCI_AUTH_PASSPHRASE \ + -e OCI_AUTH_TENANCY \ + -e OCI_AUTH_USER \ + -e OCI_OBJECTSTORAGE_COMPARTMENT \ + -e OCI_OBJECTSTORAGE_REGION \ + --name helidon-examples-integrations-cdi-oci-objectstorage \ + helidon-examples-integrations-cdi-oci-objectstorage:latest +``` + +With Java 8+: +```bash +mvn package +java -Doci.auth.fingerprint="${OCI_AUTH_FINGERPRINT}" \ + -Doci.auth.passphraseCharacters="${OCI_AUTH_PASSPHRASE}" \ + -Doci.auth.privateKey="${OCI_AUTH_PRIVATEKEY}" \ + -Doci.auth.tenancy="${OCI_AUTH_TENANCY}" \ + -Doci.auth.user="${OCI_AUTH_USER}" \ + -Doci.objectstorage.compartmentId="${OCI_OBJECTSTORAGE_COMPARTMENT}" \ + -Doci.objectstorage.region="${OCI_OBJECTSTORAGE_REGION}" \ + -jar target/helidon-examples-integrations-cdi-oci-objectstorage.jar +``` + +Try the endpoint: + +```bash +curl http://localhost:8080/logo/{namespaceName}/{bucketName}/{objectName} +``` + +## Run With Kubernetes (docker for desktop) + +```bash +docker build -t helidon-examples-integrations-cdi-oci-objectstorage . +./oci-setup.sh -k8s +kubectl apply -f ../../../k8s/ingress.yaml -f app.yaml +``` + +Try the endpoint: + +```bash +curl http://localhost/oci-objectstorage/logo/{namespaceName}/{bucketName}/{objectName} +``` + +Stop the docker containers: +```bash +docker stop helidon-examples-integrations-cdi-oci-objectstorage +``` + +Delete the Kubernetes resources: +```bash +kubectl delete -f ../../../k8s/ingress.yaml -f app.yaml +``` \ No newline at end of file diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/k8s/app.yaml b/examples/integrations/cdi/oci-objectstorage/app.yaml similarity index 57% rename from examples/integrations/cdi/oci-objectstorage/src/main/k8s/app.yaml rename to examples/integrations/cdi/oci-objectstorage/app.yaml index 45e60c911..45cca1b51 100644 --- a/examples/integrations/cdi/oci-objectstorage/src/main/k8s/app.yaml +++ b/examples/integrations/cdi/oci-objectstorage/app.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,36 +14,21 @@ # limitations under the License. # -kind: Service -apiVersion: v1 -metadata: - name: ${project.artifactId} - labels: - app: ${project.artifactId} -spec: - type: NodePort - selector: - app: ${project.artifactId} - ports: - - port: 8080 - targetPort: 8080 - name: http ---- kind: Deployment apiVersion: extensions/v1beta1 metadata: - name: ${project.artifactId} + name: helidon-examples-integrations-cdi-oci-objectstorage spec: replicas: 1 template: metadata: labels: - app: ${project.artifactId} + app: helidon-examples-integrations-cdi-oci-objectstorage version: v1 spec: containers: - - name: ${project.artifactId} - image: ${project.artifactId} + - name: helidon-examples-integrations-cdi-oci-objectstorage + image: helidon-examples-integrations-cdi-oci-objectstorage imagePullPolicy: IfNotPresent ports: - containerPort: 8080 @@ -51,36 +36,67 @@ spec: - name: OCI_AUTH_FINGERPRINT valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_AUTH_FINGERPRINT - name: OCI_AUTH_PASSPHRASE valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_AUTH_PASSPHRASE - name: OCI_AUTH_PRIVATEKEY valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_AUTH_PRIVATEKEY - name: OCI_AUTH_TENANCY valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_AUTH_TENANCY - name: OCI_AUTH_USER valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_AUTH_USER - name: OCI_OBJECTSTORAGE_COMPARTMENT valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_OBJECTSTORAGE_COMPARTMENT - name: OCI_OBJECTSTORAGE_REGION valueFrom: secretKeyRef: - name: ${kubernetesSecretName} + name: oci-objectstorage-secret key: OCI_OBJECTSTORAGE_REGION --- +kind: Service +apiVersion: v1 +metadata: + name: helidon-examples-integrations-cdi-oci-objectstorage + labels: + app: helidon-examples-integrations-cdi-oci-objectstorage +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + selector: + app: helidon-examples-integrations-cdi-oci-objectstorage + sessionAffinity: None +--- + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: helidon-examples-integrations-cdi-oci-objectstorage + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 +spec: + rules: + - host: localhost + http: + paths: + - path: /oci-objectstorage/(.*) + backend: + serviceName: helidon-examples-integrations-cdi-oci-objectstorage + servicePort: 8080 \ No newline at end of file diff --git a/examples/integrations/cdi/oci-objectstorage/oci-setup.sh b/examples/integrations/cdi/oci-objectstorage/oci-setup.sh new file mode 100755 index 000000000..0e7298fa3 --- /dev/null +++ b/examples/integrations/cdi/oci-objectstorage/oci-setup.sh @@ -0,0 +1,97 @@ +#!/bin/sh +# +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +readonly OCI_SECRET_FILE=$(dirname ${0})/oci-env + +if [ ! -f ${OCI_SECRET_FILE} ] ; then + if [ -f ${HOME}/.oci/config ] ; then + echo "Found ${HOME}/.oci/config" + eval $(cat ~/.oci/config | sed -n '/\[ADMIN_USER\]/q;p' | sed '1d' | sed -E s@'^(.*)=(.*)$'@'oci_\1=\2'@g) + fi + + if [ -z "${oci_user}" ] ; then + read -p "User OCID: " oci_user + fi + if [ -z "${oci_user}" ] ; then + echo "ERROR: user OCID is empty" + fi + + if [ -z "${oci_key_file}" ] ; then + read -p "Private key location: " oci_key_file + fi + if [ -z "${oci_key_file}" ] || [ ! -f ${oci_key_file} ] ; then + echo "ERROR: Private key is not a valid file" + fi + + if [ -z "${oci_pass_phrase}" ] ; then + read -p "Private key passphrase: " oci_pass_phrase + fi + + if [ -z "${oci_fingerprint}" ] ; then + read -p "Public key fingerprint: " oci_fingerprint + fi + if [ -z "${oci_fingerprint}" ] ; then + echo "ERROR: Public key is empty" + fi + + if [ -z "${oci_tenancy}" ] ; then + read -p "Tenancy OCID: " oci_tenancy + fi + if [ -z "${oci_tenancy}" ] ; then + echo "ERROR: Tenancy OCID is empty" + fi + + if [ -z "${oci_region}" ] ; then + read -p "Region: " oci_region + fi + if [ -z "${oci_region}" ] ; then + echo "ERROR: Region is empty" + fi + + if [ -z "${oci_compartment}" ] ; then + read -p "Compartment OCID: " oci_compartment + fi + if [ -z "${oci_compartment}" ] ; then + echo "ERROR: Compartment OCID is empty" + fi + + readonly OCI_AUTH_PRIVATEKEY="$(cat ~/.oci/oci_api_key.pem)" + readonly OCI_AUTH_FINGERPRINT="${oci_fingerprint}" + readonly OCI_AUTH_PASSPHRASE="${oci_passphrase}" + readonly OCI_AUTH_TENANCY="${oci_tenancy}" + readonly OCI_AUTH_USER="${oci_user}" + readonly OCI_OBJECTSTORAGE_COMPARTMENT="${oci_compartment}" + readonly OCI_OBJECTSTORAGE_REGION="${oci_region}" + + echo "export OCI_AUTH_PRIVATEKEY=\"${OCI_AUTH_PRIVATEKEY}\"" > ${OCI_SECRET_FILE} + echo "export OCI_AUTH_FINGERPRINT=\"${OCI_AUTH_FINGERPRINT}\"" >> ${OCI_SECRET_FILE} + echo "export OCI_AUTH_PASSPHRASE=\"${OCI_AUTH_PASSPHRASE}\"" >> ${OCI_SECRET_FILE} + echo "export OCI_AUTH_TENANCY=\"${OCI_AUTH_TENANCY}\"" >> ${OCI_SECRET_FILE} + echo "export OCI_AUTH_USER=\"${OCI_AUTH_USER}\"" >> ${OCI_SECRET_FILE} + echo "export OCI_OBJECTSTORAGE_COMPARTMENT=\"${OCI_OBJECTSTORAGE_COMPARTMENT}\"" >> ${OCI_SECRET_FILE} + echo "export OCI_OBJECTSTORAGE_REGION=\"${OCI_OBJECTSTORAGE_REGION}\"" >> ${OCI_SECRET_FILE} +fi + +if [ "${1}" = "-k8s" ] ; then + kubectl create secret generic oci-objectstorage-secret \ + --from-literal=OCI_AUTH_FINGERPRINT="${OCI_AUTH_FINGERPRINT}" \ + --from-literal=OCI_AUTH_PASSPHRASE="${OCI_AUTH_PASSPHRASE}" \ + --from-literal=OCI_AUTH_PRIVATEKEY="${OCI_AUTH_PRIVATEKEY}" \ + --from-literal=OCI_AUTH_TENANCY="${OCI_AUTH_TENANCY}" \ + --from-literal=OCI_AUTH_USER="${OCI_AUTH_USER}" \ + --from-literal=OCI_OBJECTSTORAGE_COMPARTMENT="${OCI_OBJECTSTORAGE_COMPARTMENT}" \ + --from-literal=OCI_OBJECTSTORAGE_REGION="${OCI_OBJECTSTORAGE_REGION}" +fi \ No newline at end of file diff --git a/examples/integrations/cdi/oci-objectstorage/pom.xml b/examples/integrations/cdi/oci-objectstorage/pom.xml index f45f9e6d2..c32ec195f 100644 --- a/examples/integrations/cdi/oci-objectstorage/pom.xml +++ b/examples/integrations/cdi/oci-objectstorage/pom.xml @@ -21,112 +21,15 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.integrations.cdi - helidon-examples-integrations-cdi-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml - helidon-integrations-examples-oci-objectstorage + io.helidon.examples.integrations.cdi + helidon-examples-integrations-cdi-oci-objectstorage Helidon CDI Extensions Examples OCI ObjectStorage - - libs - ${project.artifactId} - ${project.basedir}/src/main/spotbugs/exclusions.xml - - TODO: For testing only, you need to set your OCI fingerprint here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set the full path to your OCI keyFile here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set your OCI keyFile passphrase here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set your OCI tenancy here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set your OCI user here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set your OCI compartment ID here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - TODO: For testing only, you need to set your OCI region here. For more information: https://docs.cloud.oracle.com/iaas/Content/API/Concepts/sdkconfig.htm - - - - - - src/main/resources - true - - - - - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/${dependenciesDirectory} - false - false - true - true - runtime - test - - - - - - maven-jar-plugin - - - - true - ${dependenciesDirectory} - io.helidon.microprofile.server.Main - - - - - - maven-resources-plugin - - - copy-resources - process-resources - - copy-resources - - - ${project.build.directory} - - - src/main/docker - true - - Dockerfile - - - - true - src/main/k8s - - oci.secrets.template - app.yaml - - - - - - - - - maven-surefire-plugin - - - ${oci.objectstorage.compartmentId} - ${oci.objectstorage.region} - - - - - - @@ -139,12 +42,6 @@ oci-java-sdk-objectstorage compile pom - - - org.glassfish.hk2.external - javax.inject - - org.eclipse.microprofile.config @@ -171,30 +68,22 @@ io.helidon.integrations.cdi helidon-integrations-cdi-oci-objectstorage - ${project.version} runtime - - - org.glassfish.hk2.external - javax.inject - - org.jboss jandex runtime + true io.helidon.microprofile.server helidon-microprofile-server - ${project.version} runtime io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime @@ -202,22 +91,28 @@ javax.activation-api runtime - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - - - org.slf4j - slf4j-simple - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/docker/Dockerfile b/examples/integrations/cdi/oci-objectstorage/src/main/docker/Dockerfile deleted file mode 100644 index d103a8b59..000000000 --- a/examples/integrations/cdi/oci-objectstorage/src/main/docker/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -FROM openjdk:8-jre-alpine -EXPOSE 8080 -RUN mkdir /app -COPY ${project.build.finalName}.jar /app -COPY ${dependenciesDirectory} /app/${dependenciesDirectory} -CMD [ \ -"sh", "-c", \ -"exec java \ --Doci.auth.fingerprint=\"${OCI_AUTH_FINGERPRINT}\" \ --Doci.auth.passphraseCharacters=\"${OCI_AUTH_PASSPHRASE}\" \ --Doci.auth.privateKey=\"${OCI_AUTH_PRIVATEKEY}\" \ --Doci.auth.tenancy=\"${OCI_AUTH_TENANCY}\" \ --Doci.auth.user=\"${OCI_AUTH_USER}\" \ --Doci.objectstorage.compartmentId=\"${OCI_OBJECTSTORAGE_COMPARTMENT}\" \ --Doci.objectstorage.region=\"${OCI_OBJECTSTORAGE_REGION}\" \ --XX:+UnlockExperimentalVMOptions \ --XX:+UseCGroupMemoryLimitForHeap \ --jar /app/${project.build.finalName}.jar" \ -] diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/Application.java b/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/Application.java index 4f2e10c1f..7154f5a66 100644 --- a/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/Application.java +++ b/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/Application.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.ws.rs.ApplicationPath; /** - * A JAX-RS {@linkplain javax.ws.rs.core.Application application} in - * {@linkplain ApplicationScoped application scope}. + * A JAX-RS {@linkplain javax.ws.rs.core.Application application} in {@linkplain ApplicationScoped application scope}. * * @see #getClasses() */ @@ -32,31 +31,30 @@ import javax.ws.rs.ApplicationPath; @ApplicationPath("/") public class Application extends javax.ws.rs.core.Application { - private final Set> classes; + private final Set> classes; - /** - * Creates a new {@link Application}. - */ - public Application() { - super(); - final Set> classes = new HashSet<>(); - classes.add(HelidonLogoResource.class); - this.classes = Collections.unmodifiableSet(classes); - } + /** + * Creates a new {@link Application}. + */ + public Application() { + super(); + final Set> classes = new HashSet<>(); + classes.add(HelidonLogoResource.class); + this.classes = Collections.unmodifiableSet(classes); + } - /** - * Returns a non-{@code null} {@linkplain - * java.util.Collections#unmodifiableSet(Set) immutable - * Set} of {@link Class}es that comprise this JAX-RS - * application. - * - * @return a non-{@code null} {@linkplain - * java.util.Collections#unmodifiableSet(Set) immutable - * Set} - */ - @Override - public Set> getClasses() { - return this.classes; - } + /** + * Returns a non-{@code null} {@linkplain + * java.util.Collections#unmodifiableSet(Set) immutable + * Set} of {@link Class}es that comprise this JAX-RS application. + * + * @return a non-{@code null} {@linkplain + * java.util.Collections#unmodifiableSet(Set) immutable + * Set} + */ + @Override + public Set> getClasses() { + return this.classes; + } } diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/HelidonLogoResource.java b/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/HelidonLogoResource.java index a7972afe8..601375f81 100644 --- a/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/HelidonLogoResource.java +++ b/examples/integrations/cdi/oci-objectstorage/src/main/java/io/helidon/integrations/examples/oci/objectstorage/jaxrs/HelidonLogoResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,94 +41,87 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped public class HelidonLogoResource { - private final ObjectStorage client; + private final ObjectStorage client; - private final String namespaceName; + private final String namespaceName; - /** - * Creates a new {@link HelidonLogoResource}. - * - * @param client an {@link ObjectStorage} client; must not be {@code - * null} - * - * @param namespaceName the name of an OCI object storage namespace - * that will be used; must not be {@code null} - * - * @exception NullPointerException if either parameter is {@code - * null} - */ - @Inject - public HelidonLogoResource(final ObjectStorage client, - @ConfigProperty(name = "oci.objectstorage.namespace") final String namespaceName) { - super(); - this.client = Objects.requireNonNull(client); - this.namespaceName = Objects.requireNonNull(namespaceName); - } - - /** - * Returns a non-{@code null} {@link Response} which, if successful, - * will contain the object stored under the supplied {@code - * namespaceName}, {@code bucketName} and {@code objectName}. - * - * @param namespaceName the OCI object storage namespace to use; - * must not be {@code null} - * - * @param bucketName the OCI object storage bucket name to use; must - * not be {@code null} - * - * @param objectName the OCI object storage object name to use; must - * not be {@code null} - * - * @return a non-{@code null} {@link Response} describing the - * operation - * - * @exception NullPointerException if any of the parameters is - * {@code null} - */ - @GET - @Path("/{namespaceName}/{bucketName}/{objectName}") - @Produces(MediaType.WILDCARD) - public Response getLogo(@PathParam("namespaceName") String namespaceName, - @PathParam("bucketName") final String bucketName, - @PathParam("objectName") final String objectName) { - final Response returnValue; - if (bucketName == null || bucketName.isEmpty() || objectName == null || objectName.isEmpty()) { - returnValue = Response.status(400) - .build(); - } else { - if (namespaceName == null || namespaceName.isEmpty()) { - namespaceName = this.namespaceName; - } - Response temp = null; - try { - final GetObjectRequest request = GetObjectRequest.builder() - .namespaceName(namespaceName) - .bucketName(bucketName) - .objectName(objectName) - .build(); - assert request != null; - final GetObjectResponse response = this.client.getObject(request); - assert response != null; - final Long contentLength = response.getContentLength(); - assert contentLength != null; - if (contentLength.longValue() <= 0L) { - temp = Response.noContent() - .build(); - } else { - temp = Response.ok() - .type(response.getContentType()) - .entity(response.getInputStream()) - .build(); - } - } catch (final BmcException bmcException) { - final int statusCode = bmcException.getStatusCode(); - temp = Response.status(statusCode) - .build(); - } finally { - returnValue = temp; - } + /** + * Creates a new {@link HelidonLogoResource}. + * + * @param client an {@link ObjectStorage} client; must not be {@code + * null} + * + * @param namespaceName the name of an OCI object storage namespace that will be used; must not be {@code null} + * + * @exception NullPointerException if either parameter is {@code + * null} + */ + @Inject + public HelidonLogoResource(final ObjectStorage client, + @ConfigProperty(name = "oci.objectstorage.namespace") final String namespaceName) { + super(); + this.client = Objects.requireNonNull(client); + this.namespaceName = Objects.requireNonNull(namespaceName); + } + + /** + * Returns a non-{@code null} {@link Response} which, if successful, will contain the object stored under the supplied {@code + * namespaceName}, {@code bucketName} and {@code objectName}. + * + * @param namespaceName the OCI object storage namespace to use; must not be {@code null} + * + * @param bucketName the OCI object storage bucket name to use; must not be {@code null} + * + * @param objectName the OCI object storage object name to use; must not be {@code null} + * + * @return a non-{@code null} {@link Response} describing the operation + * + * @exception NullPointerException if any of the parameters is {@code null} + */ + @GET + @Path("/{namespaceName}/{bucketName}/{objectName}") + @Produces(MediaType.WILDCARD) + public Response getLogo(@PathParam("namespaceName") String namespaceName, + @PathParam("bucketName") final String bucketName, + @PathParam("objectName") final String objectName) { + final Response returnValue; + if (bucketName == null || bucketName.isEmpty() || objectName == null || objectName.isEmpty()) { + returnValue = Response.status(400) + .build(); + } else { + if (namespaceName == null || namespaceName.isEmpty()) { + namespaceName = this.namespaceName; + } + Response temp = null; + try { + final GetObjectRequest request = GetObjectRequest.builder() + .namespaceName(namespaceName) + .bucketName(bucketName) + .objectName(objectName) + .build(); + assert request != null; + final GetObjectResponse response = this.client.getObject(request); + assert response != null; + final Long contentLength = response.getContentLength(); + assert contentLength != null; + if (contentLength <= 0L) { + temp = Response.noContent() + .build(); + } else { + temp = Response.ok() + .type(response.getContentType()) + .entity(response.getInputStream()) + .build(); + } + } catch (final BmcException bmcException) { + final int statusCode = bmcException.getStatusCode(); + temp = Response.status(statusCode) + .build(); + } finally { + returnValue = temp; + } + } + return returnValue; } - return returnValue; - } } diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/k8s/oci.secrets.template b/examples/integrations/cdi/oci-objectstorage/src/main/k8s/oci.secrets.template deleted file mode 100644 index 366bb687c..000000000 --- a/examples/integrations/cdi/oci-objectstorage/src/main/k8s/oci.secrets.template +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This file is a TEMPLATE for a shell script that will create -# Kubernetes secrets that will be used to deploy this example program -# to Kubernetes. If you are reading this from the -# src/main/resources/k8s directory, bear in mind that it is first -# copied with Maven filtering applied to the -# ${project.build.directory} directory, which is normally "target". -# -# You should take the target/oci.secrets.template file and make a copy -# of it. Then, customize the variables below in your copy to contain -# the required information. - -# The name of the secret that Kubernetes will create. It must consist of lower -# case alphanumeric characters, '-' or '.', and must start and end with an -# alphanumeric character. The regular expression used for validation is: -# [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)* -SECRET_NAME=${kubernetesSecretName} - -# The fingerprint for the key pair being used. See -# https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#How3 -# for more information. -OCI_AUTH_FINGERPRINT= - -# The passphrase used for the key if it is encrypted. See -# https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#two -# for more information. -OCI_AUTH_PASSPHRASE= - -# The actual private key contents. This variable is set by default to -# contain the exact contents of the private key file output by the -# instructions found at -# https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#two. -# However you choose to set this variable, it must contain the exact -# private key contents, including newlines. -OCI_AUTH_PRIVATEKEY=$(cat ~/.oci/oci_api_key.pem) - -# The OCID of your tenancy. See -# https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#five -# for more information. -OCI_AUTH_TENANCY= - -# The OCID of your user. See -# https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#five -# for more information. For more on OCIDs in general, see -# https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm#one. -OCI_AUTH_USER= - -# The OCID of the compartment containing the OCI object storage -# service you wish to access. For more on OCIDs in general, see -# https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm#one. -OCI_OBJECTSTORAGE_COMPARTMENT= - -# The region to use. See -# https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm -# for more information. -OCI_OBJECTSTORAGE_REGION= - -# The command below uses the variables above and should not need to be -# modified. -kubectl create secret generic ${SECRET_NAME} \ ---from-literal=OCI_AUTH_FINGERPRINT="${OCI_AUTH_FINGERPRINT}" \ ---from-literal=OCI_AUTH_PASSPHRASE="${OCI_AUTH_PASSPHRASE}" \ ---from-literal=OCI_AUTH_PRIVATEKEY="${OCI_AUTH_PRIVATEKEY}" \ ---from-literal=OCI_AUTH_TENANCY="${OCI_AUTH_TENANCY}" \ ---from-literal=OCI_AUTH_USER="${OCI_AUTH_USER}" \ ---from-literal=OCI_OBJECTSTORAGE_COMPARTMENT="${OCI_OBJECTSTORAGE_COMPARTMENT}" \ ---from-literal=OCI_OBJECTSTORAGE_REGION="${OCI_OBJECTSTORAGE_REGION}" diff --git a/examples/integrations/cdi/oci-objectstorage/src/main/spotbugs/exclusions.xml b/examples/integrations/cdi/oci-objectstorage/src/main/spotbugs/exclusions.xml deleted file mode 100644 index 1bf71bd7d..000000000 --- a/examples/integrations/cdi/oci-objectstorage/src/main/spotbugs/exclusions.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - diff --git a/examples/k8s/ingress.yaml b/examples/k8s/ingress.yaml new file mode 100644 index 000000000..fc2551044 --- /dev/null +++ b/examples/k8s/ingress.yaml @@ -0,0 +1,307 @@ +# +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + name: nginx-configuration + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: tcp-services + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: udp-services + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: nginx-ingress-clusterrole + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses/status + verbs: + - update + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: Role +metadata: + name: nginx-ingress-role + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + resourceNames: + # Defaults to "-" + # Here: "-" + # This has to be adapted if you change either parameter + # when launching the nginx-ingress-controller. + - "ingress-controller-leader-nginx" + verbs: + - get + - update + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: RoleBinding +metadata: + name: nginx-ingress-role-nisa-binding + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: nginx-ingress-role +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: nginx-ingress-clusterrole-nisa-binding + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-ingress-clusterrole +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: ingress-nginx + +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-ingress-controller + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + template: + metadata: + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + annotations: + prometheus.io/port: "10254" + prometheus.io/scrape: "true" + spec: + serviceAccountName: nginx-ingress-serviceaccount + containers: + - name: nginx-ingress-controller + image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.1 + args: + - /nginx-ingress-controller + - --configmap=$(POD_NAMESPACE)/nginx-configuration + - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services + - --udp-services-configmap=$(POD_NAMESPACE)/udp-services + - --publish-service=$(POD_NAMESPACE)/ingress-nginx + - --annotations-prefix=nginx.ingress.kubernetes.io + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + # www-data -> 33 + runAsUser: 33 + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - name: http + containerPort: 80 + - name: https + containerPort: 443 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + +--- + +kind: Service +apiVersion: v1 +metadata: + name: ingress-nginx + namespace: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx +spec: + externalTrafficPolicy: Local + type: LoadBalancer + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/part-of: ingress-nginx + ports: + - name: http + port: 80 + targetPort: http + - name: https + port: 443 + targetPort: https + +--- diff --git a/examples/webserver/demo-translator-frontend/k8s/frontend.yaml b/examples/k8s/zipkin.yaml similarity index 51% rename from examples/webserver/demo-translator-frontend/k8s/frontend.yaml rename to examples/k8s/zipkin.yaml index 7a41bb3de..e6770d1a4 100644 --- a/examples/webserver/demo-translator-frontend/k8s/frontend.yaml +++ b/examples/k8s/zipkin.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,47 +14,55 @@ # limitations under the License. # - apiVersion: extensions/v1beta1 kind: Deployment metadata: - name: helidon-webserver-translator-frontend + name: zipkin labels: - app: helidon-webserver-translator-frontend + app: zipkin spec: replicas: 1 template: metadata: labels: - app: helidon-webserver-translator-frontend - version: v1 + app: zipkin spec: containers: - - image: registry.oracledx.com/skeppare/helidon/helidon-webserver-translator-frontend:0.1.0-SNAPSHOT + - image: openzipkin/zipkin:2 imagePullPolicy: Always - name: helidon-webserver-translator-frontend + name: zipkin ports: - - containerPort: 8080 - envFrom: - - configMapRef: - name: aura-env-config - optional: true - imagePullSecrets: - - name: regsecret + - containerPort: 9411 restartPolicy: Always --- apiVersion: v1 kind: Service metadata: - name: helidon-webserver-translator-frontend + name: zipkin labels: - app: helidon-webserver-translator-frontend + app: zipkin spec: - ports: - - name: http - port: 8080 + type: ClusterIP selector: - app: helidon-webserver-translator-frontend - sessionAffinity: None - type: NodePort + app: zipkin + ports: + - port: 9411 + targetPort: 9411 + name: http + +--- + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: zipkin-ingress +spec: + rules: + - host: localhost + http: + paths: + - path: /zipkin + backend: + serviceName: zipkin + servicePort: 9411 diff --git a/examples/microprofile/README.md b/examples/microprofile/README.md index 470daf399..f678273b5 100644 --- a/examples/microprofile/README.md +++ b/examples/microprofile/README.md @@ -1,4 +1,3 @@ - # Helidon MP Examples - +This directory contains Helidon MP examples. diff --git a/examples/microprofile/hello-world-explicit/README.md b/examples/microprofile/hello-world-explicit/README.md index 0ee95536d..847ba3f2e 100644 --- a/examples/microprofile/hello-world-explicit/README.md +++ b/examples/microprofile/hello-world-explicit/README.md @@ -1,20 +1,12 @@ - # Helidon MP Hello World Explicit Example This examples shows a simple application written using Helidon MP. It is explicit because in this example you write the `main` class and explicitly start the microprofile server. -## Build - -``` +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-hello-world-explicit.jar ``` Then try the endpoints: diff --git a/examples/microprofile/hello-world-explicit/pom.xml b/examples/microprofile/hello-world-explicit/pom.xml index e681e7873..57981f129 100644 --- a/examples/microprofile/hello-world-explicit/pom.xml +++ b/examples/microprofile/hello-world-explicit/pom.xml @@ -22,15 +22,16 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml helidon-examples-microprofile-hello-world-explicit Helidon Microprofile Examples Explicit Hello World - Microprofile 2.2 example with explicit bootstrapping (Server.create(Application.class).start()) + Microprofile example with explicit bootstrapping (Server.create(Application.class).start()) @@ -41,31 +42,36 @@ io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} org.jboss jandex + runtime + true + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + org.jboss.jandex jandex-maven-plugin make-index - - jandex - - process-classes diff --git a/examples/microprofile/hello-world-implicit/README.md b/examples/microprofile/hello-world-implicit/README.md index dc26392f4..582629a3a 100644 --- a/examples/microprofile/hello-world-implicit/README.md +++ b/examples/microprofile/hello-world-implicit/README.md @@ -1,20 +1,15 @@ - # Helidon MP Hello World Implicit Example This examples shows a simple application written using Helidon MP. It is implicit because in this example you don't write the `main` class, instead you rely on the Microprofile Server main class. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-hello-world-implicit.jar ``` Then try the endpoints: diff --git a/examples/microprofile/hello-world-implicit/pom.xml b/examples/microprofile/hello-world-implicit/pom.xml index 2fe2fbbf2..2ab218102 100644 --- a/examples/microprofile/hello-world-implicit/pom.xml +++ b/examples/microprofile/hello-world-implicit/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.microprofile helidon-examples-microprofile-hello-world-implicit Helidon Microprofile Examples Implicit Hello World @@ -33,20 +35,14 @@ Microprofile 2.2 example with implicit bootstrapping (server.Main(new String[0]) - - io.helidon.microprofile.server.Main - - io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} org.jboss @@ -62,31 +58,24 @@ + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + org.jboss.jandex jandex-maven-plugin make-index - - jandex - - process-classes - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ${example.main-class} - - - - diff --git a/examples/microprofile/idcs/README.md b/examples/microprofile/idcs/README.md index 906b89873..c8e331f0b 100644 --- a/examples/microprofile/idcs/README.md +++ b/examples/microprofile/idcs/README.md @@ -1,22 +1,17 @@ - # Helidon MP IDCS Example JAX-RS application with resources protected by IDCS -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-security-idcs.jar ``` Try the endpoints: ``` -TBD +TODO ``` diff --git a/examples/microprofile/idcs/pom.xml b/examples/microprofile/idcs/pom.xml index 5a9bee255..e5e9f87a9 100644 --- a/examples/microprofile/idcs/pom.xml +++ b/examples/microprofile/idcs/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.microprofile helidon-examples-microprofile-security-idcs Helidon Microprofile Examples IDCS Security @@ -41,12 +43,39 @@ io.helidon.microprofile.bundles helidon-microprofile-1.1 - ${project.version} io.helidon.microprofile helidon-microprofile-oidc - ${project.version} + + + org.jboss + jandex + runtime + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/microprofile/mp1_1-security/README.md b/examples/microprofile/mp1_1-security/README.md index 8b8138297..0a43e9fc8 100644 --- a/examples/microprofile/mp1_1-security/README.md +++ b/examples/microprofile/mp1_1-security/README.md @@ -7,16 +7,12 @@ sharing a common resource accessed through different context roots. The resource has multiple endpoints, protected with different levels of security. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-mp1_1-security.jar ``` ## Endpoints diff --git a/examples/microprofile/mp1_1-security/pom.xml b/examples/microprofile/mp1_1-security/pom.xml index afb8d2cc4..3883e7d81 100644 --- a/examples/microprofile/mp1_1-security/pom.xml +++ b/examples/microprofile/mp1_1-security/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.microprofile helidon-examples-microprofile-mp1_1-security Helidon Microprofile Examples MP 1.1 Security @@ -41,12 +43,39 @@ io.helidon.microprofile.bundles helidon-microprofile-1.1 - ${project.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} + + + org.jboss + jandex + runtime + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/microprofile/mp1_1-static-content/README.md b/examples/microprofile/mp1_1-static-content/README.md index 75949bf29..4d10eadce 100644 --- a/examples/microprofile/mp1_1-static-content/README.md +++ b/examples/microprofile/mp1_1-static-content/README.md @@ -1,4 +1,3 @@ - # Helidon MP with Static Content This example has a simple Hello World rest enpoint, plus @@ -6,16 +5,12 @@ static content that is loaded from the application's classpath. The configuration for the static content is in the `microprofile-config.properties` file. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-mp1_1-static-content.jar ``` ## Endpoints @@ -24,4 +19,3 @@ mvn exec:java |:-----------|:----------------| |`helloworld`|Rest enpoint providing a link to the static content| |`resource.html`|The static content| - diff --git a/examples/microprofile/mp1_1-static-content/pom.xml b/examples/microprofile/mp1_1-static-content/pom.xml index 07d0fde11..f1c59bfe5 100644 --- a/examples/microprofile/mp1_1-static-content/pom.xml +++ b/examples/microprofile/mp1_1-static-content/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.microprofile helidon-examples-microprofile-mp1_1-static-content Helidon Microprofile Examples MP 1.1 Static Content @@ -41,32 +43,17 @@ io.helidon.microprofile.bundles helidon-microprofile-1.1 - ${project.version} - - - org.jboss.spec.javax.el - jboss.el.api.3.0.spec - - - org.jboss.spec.javax.interceptor - jboss.interceptors.api.1.2.spec - - - org.glassfish.hk2.external - javax.inject - - io.helidon.microprofile.bundles internal-test-libs - ${project.version} test org.jboss jandex - test + runtime + true javax.activation @@ -77,6 +64,34 @@ + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*$* + io/helidon/microprofile/example/staticc/StaticContentTest.java + + + org.apache.maven.plugins maven-failsafe-plugin @@ -102,29 +117,6 @@ - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*$* - io/helidon/microprofile/example/staticc/StaticContentTest.java - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - process-classes - - - diff --git a/examples/microprofile/openapi-basic/README.md b/examples/microprofile/openapi-basic/README.md index d919c0ef8..0848171f3 100644 --- a/examples/microprofile/openapi-basic/README.md +++ b/examples/microprofile/openapi-basic/README.md @@ -1,19 +1,14 @@ - # Helidon MP Basic OpenAPI Example This example shows a simple greeting application, similar to the one from the Helidon MP QuickStart, enhanced with OpenAPI support. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar target/helidon-examples-microprofile-openapi-basic.jar ``` Try the endpoints: diff --git a/examples/microprofile/openapi-basic/pom.xml b/examples/microprofile/openapi-basic/pom.xml index 67896b69d..7b5488d63 100644 --- a/examples/microprofile/openapi-basic/pom.xml +++ b/examples/microprofile/openapi-basic/pom.xml @@ -17,71 +17,44 @@ --> - - + 4.0.0 - - io.helidon.examples.microprofile - helidon-examples-microprofile-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.microprofile helidon-examples-microprofile-openapi-basic Helidon Microprofile Example Basic OpenAPI - Microprofile 2.2 example showing basic OpenAPI support + Microprofile example showing basic OpenAPI support - - - io.helidon.microprofile.server.Main - - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ${mainClass} - - - - - - io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} org.eclipse.microprofile.openapi microprofile-openapi-api - ${version.lib.microprofile-openapi-api} org.glassfish.jersey.media jersey-media-json-binding runtime + + org.jboss + jandex + runtime + true + javax.activation javax.activation-api @@ -92,10 +65,28 @@ junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/openapi/README.md b/examples/openapi/README.md index bee5ef7ab..6b6e11880 100644 --- a/examples/openapi/README.md +++ b/examples/openapi/README.md @@ -7,16 +7,12 @@ Helidon SE QuickStart, enhanced with OpenAPI support. Most of the OpenAPI document in this example comes from a static file packaged with the application. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java +java -jar helidon-examples-openapi.jar ``` Try the endpoints: @@ -36,5 +32,6 @@ curl -X GET http://localhost:8080/greet/Jose curl -X GET http://localhost:8080/openapi [lengthy OpenAPI document] ``` + The output describes not only then endpoints in `GreetService` as described in the static file but also an endpoint contributed by the `SimpleAPIModelReader`. diff --git a/examples/openapi/pom.xml b/examples/openapi/pom.xml index 8d5af4807..e08c0673e 100644 --- a/examples/openapi/pom.xml +++ b/examples/openapi/pom.xml @@ -19,10 +19,12 @@ 4.0.0 - io.helidon.examples - helidon-examples-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../applications/se/pom.xml + io.helidon.examples helidon-examples-openapi Helidon Examples OpenAPI @@ -34,29 +36,6 @@ io.helidon.examples.openapi.Main - - - - - io.helidon - helidon-bom - ${project.version} - pom - import - - - org.junit.jupiter - junit-jupiter-api - 5.1.0 - - - org.junit.jupiter - junit-jupiter-engine - 5.1.0 - - - - io.helidon.webserver @@ -87,34 +66,5 @@ junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - - - org.seleniumhq.selenium - selenium-java - test - 2.44.0 - - - com.opera - operadriver - test - 1.5 - - - org.seleniumhq.selenium - selenium-remote-driver - - - - - junit - junit - test - 4.11 - diff --git a/examples/openapi/src/test/java/io/helidon/examples/openapi/MainTest.java b/examples/openapi/src/test/java/io/helidon/examples/openapi/MainTest.java index 954d01153..a1055a64d 100644 --- a/examples/openapi/src/test/java/io/helidon/examples/openapi/MainTest.java +++ b/examples/openapi/src/test/java/io/helidon/examples/openapi/MainTest.java @@ -16,28 +16,24 @@ package io.helidon.examples.openapi; -import io.helidon.common.http.MediaType; -import io.helidon.examples.openapi.internal.SimpleAPIModelReader; -import java.io.OutputStream; -import java.util.Collections; -import java.util.concurrent.TimeUnit; import java.net.URL; import java.net.HttpURLConnection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import javax.json.JsonReaderFactory; - -import io.helidon.webserver.WebServer; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import javax.json.JsonBuilderFactory; -import javax.json.JsonObjectBuilder; import javax.json.JsonPointer; import javax.json.JsonString; -import javax.json.JsonWriter; + +import io.helidon.webserver.WebServer; +import io.helidon.common.http.MediaType; +import io.helidon.examples.openapi.internal.SimpleAPIModelReader; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.AfterAll; @@ -157,5 +153,4 @@ public class MainTest { return path.replace("/", "~1"); } - } diff --git a/examples/pom.xml b/examples/pom.xml index 6583de6ee..c25060ba8 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -39,14 +39,15 @@ config - webserver - security - microprofile - todo-app - quickstarts - health grpc + health + quickstarts + microprofile openapi + security + todo-app + translator-app + webserver diff --git a/examples/quickstarts/archetypes/create-archetype.sh b/examples/quickstarts/archetypes/create-archetype.sh index f01393cd8..2a1d71eef 100755 --- a/examples/quickstarts/archetypes/create-archetype.sh +++ b/examples/quickstarts/archetypes/create-archetype.sh @@ -274,6 +274,7 @@ processProjectPom(){ -e s@"${ARTIFACTID}"@'${artifactId}'@g \ -e s@"^ ${VERSION}"@' ${version}'@g \ -e s@"${NAME}"@'${project.artifactId}'@g \ + -e s@'.*'@''@g \ > ${outputfile} } diff --git a/examples/quickstarts/helidon-quickstart-mp/README.md b/examples/quickstarts/helidon-quickstart-mp/README.md index 8d0a6fe04..04b4686ac 100644 --- a/examples/quickstarts/helidon-quickstart-mp/README.md +++ b/examples/quickstarts/helidon-quickstart-mp/README.md @@ -1,35 +1,12 @@ - # Helidon Quickstart MP Example This example implements a simple Hello World REST service using MicroProfile -## Prerequisites +## Build and run -1. Maven 3.5 or newer -2. Java SE 8 or newer -3. Docker 17 or newer (if you want to build and run docker images) -4. Kubernetes minikube v0.24 or newer (if you want to deploy to Kubernetes) - or access to a Kubernetes 1.7.4 or newer cluster -5. Kubectl 1.7.4 or newer for deploying to Kubernetes - -Verify prerequisites -``` -java -version -mvn --version -docker --version -minikube version -kubectl version --short -``` - -## Build - -``` +With JDK8+ +```bash mvn package -``` - -## Start the application - -``` java -jar target/helidon-quickstart-mp.jar ``` diff --git a/examples/quickstarts/helidon-quickstart-mp/etc/checkstyle.xml b/examples/quickstarts/helidon-quickstart-mp/etc/checkstyle.xml deleted file mode 100644 index 54f5b25af..000000000 --- a/examples/quickstarts/helidon-quickstart-mp/etc/checkstyle.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - diff --git a/examples/quickstarts/helidon-quickstart-mp/pom.xml b/examples/quickstarts/helidon-quickstart-mp/pom.xml index 8dfc90b3f..ff8b2f380 100644 --- a/examples/quickstarts/helidon-quickstart-mp/pom.xml +++ b/examples/quickstarts/helidon-quickstart-mp/pom.xml @@ -17,171 +17,24 @@ --> - - + 4.0.0 - + + io.helidon.applications + helidon-mp + 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples helidon-quickstart-mp - 1.2.2-SNAPSHOT - jar Helidon Quickstart MP Example - 1.2.2-SNAPSHOT io.helidon.examples.quickstart.mp.Main - ${mainClass} - 8 - ${maven.compiler.source} - libs - ${project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 - -Dfile.encoding=UTF-8 - etc/checkstyle.xml - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - org.jboss.jandex - jandex-maven-plugin - 1.0.6 - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.junit.platform - junit-platform-surefire-provider - 1.1.0 - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${libs.classpath.prefix} - ${mainClass} - false - - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - false - - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - process-classes - - - - - - - - - - io.helidon - helidon-bom - ${helidon.version} - pom - import - - - io.helidon.microprofile.bundles - helidon-microprofile-3.0 - ${helidon.version} - - - org.jboss - jandex - 2.1.1.Final - - - javax.activation - javax.activation-api - 1.2.0 - - - org.junit.jupiter - junit-jupiter-api - 5.0.1 - - - org.junit.jupiter - junit-jupiter-engine - 5.0.1 - - - org.hamcrest - hamcrest-all - 1.3 - - - org.glassfish.jersey.media - jersey-media-json-binding - 2.29.1 - - - - io.helidon.microprofile.bundles @@ -207,10 +60,28 @@ junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/quickstarts/helidon-quickstart-se/README.md b/examples/quickstarts/helidon-quickstart-se/README.md index 419168a33..b4e0f1404 100644 --- a/examples/quickstarts/helidon-quickstart-se/README.md +++ b/examples/quickstarts/helidon-quickstart-se/README.md @@ -1,34 +1,12 @@ - # Helidon Quickstart SE Example This project implements a simple Hello World REST service using Helidon SE. -## Prerequisites +## Build and run -1. Maven 3.5 or newer -2. Java SE 8 or newer -3. Docker 17 or newer to build and run docker images -4. Kubernetes minikube v0.24 or newer to deploy to Kubernetes (or access to a K8s 1.7.4 or newer cluster) -5. Kubectl 1.7.4 or newer to deploy to Kubernetes - -Verify prerequisites -``` -java -version -mvn --version -docker --version -minikube version -kubectl version --short -``` - -## Build - -``` +With JDK8+ +```bash mvn package -``` - -## Start the application - -``` java -jar target/helidon-quickstart-se.jar ``` diff --git a/examples/quickstarts/helidon-quickstart-se/pom.xml b/examples/quickstarts/helidon-quickstart-se/pom.xml index 5ff30417d..7b5bde5c3 100644 --- a/examples/quickstarts/helidon-quickstart-se/pom.xml +++ b/examples/quickstarts/helidon-quickstart-se/pom.xml @@ -17,139 +17,25 @@ --> - - + 4.0.0 - + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples helidon-quickstart-se 1.2.2-SNAPSHOT - jar Helidon Quickstart SE Example - 1.2.2-SNAPSHOT - 1.0.10 io.helidon.examples.quickstart.se.Main - ${mainClass} - 8 - ${maven.compiler.source} - libs - ${project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 - -Dfile.encoding=UTF-8 - 2.0.1 - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.junit.platform - junit-platform-surefire-provider - 1.1.0 - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${libs.classpath.prefix} - ${mainClass} - false - - - - - - io.helidon.build-tools - helidon-maven-plugin - ${helidon.plugin.version} - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - false - - - - - - - - - - - io.helidon - helidon-bom - ${helidon.version} - pom - import - - - org.junit.jupiter - junit-jupiter-api - 5.1.0 - - - org.junit.jupiter - junit-jupiter-engine - 5.1.0 - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - - - - io.helidon.bundles @@ -171,46 +57,24 @@ io.helidon.metrics helidon-metrics2 - - org.eclipse.microprofile.metrics - microprofile-metrics-api - org.junit.jupiter junit-jupiter-api test - - org.junit.jupiter - junit-jupiter-engine - test - - - - native-image - - - - io.helidon.build-tools - helidon-maven-plugin - - - - native-image - - - - - - - - - io.helidon.integrations.graal - helidon-graal-native-image-extension - - - - + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/quickstarts/pom.xml b/examples/quickstarts/pom.xml index e245f66a3..6ce703a45 100644 --- a/examples/quickstarts/pom.xml +++ b/examples/quickstarts/pom.xml @@ -27,13 +27,6 @@ Helidon Quickstart Examples pom - - true - true - true - true - - helidon-quickstart-se helidon-quickstart-mp diff --git a/examples/security/attribute-based-access-control/README.md b/examples/security/attribute-based-access-control/README.md index dc15c5ed6..92f168493 100644 --- a/examples/security/attribute-based-access-control/README.md +++ b/examples/security/attribute-based-access-control/README.md @@ -1,16 +1,11 @@ - # Helidon Security ABAC Example JAX-RS (Jersey) example for attribute based access control. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` +java -jar target/helidon-examples-security-abac.jar +``` \ No newline at end of file diff --git a/examples/security/attribute-based-access-control/pom.xml b/examples/security/attribute-based-access-control/pom.xml index e4f76ebe9..ed579a3a0 100644 --- a/examples/security/attribute-based-access-control/pom.xml +++ b/examples/security/attribute-based-access-control/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.security helidon-examples-security-abac Helidon Security Examples ABAC @@ -41,21 +43,48 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} io.helidon.security.abac helidon-security-abac-policy-el - ${project.version} org.glassfish javax.el + + org.jboss + jandex + runtime + true + org.junit.jupiter junit-jupiter-api test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/security/attribute-based-access-control/src/main/java/io/helidon/security/examples/abac/AbacJerseyMain.java b/examples/security/attribute-based-access-control/src/main/java/io/helidon/security/examples/abac/AbacJerseyMain.java index f7f5edd6d..ca5724f7f 100644 --- a/examples/security/attribute-based-access-control/src/main/java/io/helidon/security/examples/abac/AbacJerseyMain.java +++ b/examples/security/attribute-based-access-control/src/main/java/io/helidon/security/examples/abac/AbacJerseyMain.java @@ -43,6 +43,7 @@ public final class AbacJerseyMain { Server server = Server.builder() .config(config) + .port(8080) .build() .start(); diff --git a/examples/security/google-login/README.md b/examples/security/google-login/README.md index 39e44a936..f3605134d 100644 --- a/examples/security/google-login/README.md +++ b/examples/security/google-login/README.md @@ -1,10 +1,9 @@ -Integration with Google login button -=================== +# Integration with Google login button This example demonstrates Integration with Google login button on a web page. -Contents --------- +## Contents + There are two examples with exactly the same behavior 1. builder - shows how to programmatically secure application 2. config - shows how to secure application with configuration @@ -18,13 +17,10 @@ Update the following files with your client id (it should support http://localho 2. src/main/resources/WEB/index.html - update the meta tag in header with name "google-signin-client_id" 3. src/main/java/io/helidon/security/examples/google/GoogleBuilderMain.java - update the client id in builder of provider +## Build and run -Running the Example -------------------- - -1. Clone the repository -2. If you cloned a snapshot, please run `mvn clean install -Dmaven.test.skip=true` in project root -3. Go to the directory of example you want to run - - And run `mvn exec:exec` to run the default example (config based) - - or run `mvn exec:exec -Dexample.main-class="io.helidon.security.examples.google.GoogleBuilderMain"` - to run builder based example \ No newline at end of file +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-google-login.jar +``` \ No newline at end of file diff --git a/examples/security/google-login/pom.xml b/examples/security/google-login/pom.xml index 23907c502..701c455b3 100644 --- a/examples/security/google-login/pom.xml +++ b/examples/security/google-login/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-google-login Helidon Security Examples Google Login @@ -41,27 +43,22 @@ io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.security.providers helidon-security-providers-google-login - ${project.version} io.helidon.config helidon-config-encryption - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} org.junit.jupiter @@ -89,4 +86,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/idcs-login/README.md b/examples/security/idcs-login/README.md index 1d2d6f2ba..25418e376 100644 --- a/examples/security/idcs-login/README.md +++ b/examples/security/idcs-login/README.md @@ -1,24 +1,17 @@ -Security integration with IDCS -=================== +# Security integration with IDCS This example demonstrates integration with IDCS (Oracle identity service, integrated with Open ID Connect provider). -Contents --------- +## Contents This project contains two samples, one (IdcsMain.java) which is configured via the application.yaml file and a second example (IdcsBuilderMain.java) which is configured in code. When configured the example exposes two HTTP endpoints `/jersey`, a rest endpoint protected by an IDCS application (with two scopes) and a second endpoint (/rest/profile) which is not protected. - -Configuring the example --------------------------- - ### IDCS Configuration Edit application.yaml for IdcsMain.java or OidcConfig variable definition for IdcsBuilderMain.java sample - 1. Log in to the IDCS console and create a new application of type "confidential app" 2. Within **Resources** 1. Create two resources called `first_scope` and `second_scope` @@ -44,12 +37,18 @@ Edit application.yaml for IdcsMain.java or OidcConfig variable definition for Id 5. proxy-host : Your proxy server if needed 6. scope-audience : This is the scope audience which MUST match the primary audience in the IDCS resource, recommendation is not to have a trailing slash (/) +## Build and run -## Building and Running the Example +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-oidc.jar +``` -1. `mvn package` to compile and build sample -2. `mvn exec:java` to run sample -3. Once run go to a browser window and navigate to your application /rest/profile URI, e.g. `http://localhost:7987/rest/profile`. This should present you with a response highlighting your logged in role (null) correctly as you are not logged in +Try the endpoints: + +3. Open http://localhost:7987/rest/profile in your browser. This should present + you with a response highlighting your logged in role (null) correctly as you are not logged in 4. Navigate to `http://localhost:7987/jersey` this should 1. Redirect you to the OIDCS login console to authenticate yourself, once done 2. Redirects you back to the application and should display your users credentials/IDCS information @@ -71,7 +70,6 @@ Now that everything is setup it is possible to call the sample from tools like p 5. Once you have a token ensure you press the "Use token" button 6. Execute your rest call - ## Troubleshooting #### Upon redirect to IDCS login page you receive a message indicating the scope isn't found diff --git a/examples/security/idcs-login/pom.xml b/examples/security/idcs-login/pom.xml index aa401c4ce..c014769ac 100644 --- a/examples/security/idcs-login/pom.xml +++ b/examples/security/idcs-login/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + io.helidon.examples.security helidon-examples-security-oidc Helidon Security Examples IDCS Login @@ -41,33 +43,32 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} io.helidon.tracing helidon-tracing-jaeger - ${project.version} io.helidon.microprofile.tracing helidon-microprofile-tracing - ${project.version} io.helidon.microprofile helidon-microprofile-oidc - ${project.version} io.helidon.security.providers helidon-security-providers-idcs-mapper - ${project.version} - io.helidon.bundles helidon-bundles-config - ${project.version} + + + org.jboss + jandex + runtime + true org.junit.jupiter @@ -80,4 +81,27 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/security/jersey/README.md b/examples/security/jersey/README.md index 792aba418..89f44404d 100644 --- a/examples/security/jersey/README.md +++ b/examples/security/jersey/README.md @@ -1,24 +1,28 @@ -Security integration with Jersey -=================== +# Security integration with Jersey This example demonstrates integration with Jersey (JAX-RS implementation). -Contents --------- +## Contents + There are three examples with exactly the same behavior 1. builder - shows how to secure application using security built by hand 2. config - shows how to secure application with configuration - 1. see src/main/resources/application.yaml + 1. see `src/main/resources/application.yaml` 3. programmatic - shows how to secure application using manual invocation of authentication -Running the Example -------------------- +## Build and run -1. Clone the repository -2. If you cloned a snapshot, please run `mvn clean install -Dmaven.test.skip=true` in project root -3. Go to the directory of example you want to run - - And run `mvn exec:exec` to run the default example (config based) - - or run `mvn exec:exec -Dexample.main-class="io.helidon.security.examples.jersey.JerseyBuilderMain"` - to run builder based example - - or run `mvn exec:exec -Dexample.main-class="io.helidon.security.examples.jersey.JerseyProgrammaticMain"` - to run example with a resource with manual security check +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-jersey.jar +``` + +Try the endpoints: +```bash +curl http://localhost:8080/rest +curl -v http://localhost:8080/rest/protected +curl -u "jack:password" http://localhost:8080/rest/protected +curl -u "jack:password" http://localhost:8080/rest/protected +curl -v -u "john:password" http://localhost:8080/rest/protected +``` \ No newline at end of file diff --git a/examples/security/jersey/pom.xml b/examples/security/jersey/pom.xml index 37f17eca5..34564bb0e 100644 --- a/examples/security/jersey/pom.xml +++ b/examples/security/jersey/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-jersey Helidon Security Examples Jersey Integration @@ -42,22 +44,18 @@ io.helidon.security.integration helidon-security-integration-jersey - ${project.version} io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} org.glassfish.jersey.inject @@ -66,12 +64,10 @@ io.helidon.bundles helidon-bundles-config - ${project.version} io.helidon.bundles helidon-bundles-security - ${project.version} org.junit.jupiter @@ -80,7 +76,7 @@ org.hamcrest - hamcrest-core + hamcrest-all test @@ -89,4 +85,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyBuilderMain.java b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyBuilderMain.java index 83bebce9a..5687f359d 100644 --- a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyBuilderMain.java +++ b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyBuilderMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -117,7 +117,7 @@ public final class JerseyBuilderMain { Routing.Builder routing = Routing.builder() .register("/rest", buildJersey()); - server = JerseyUtil.startIt(routing); + server = JerseyUtil.startIt(routing, 8080); JerseyResources.setPort(server.port()); } diff --git a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyConfigMain.java b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyConfigMain.java index bb95b21f4..81b5fc590 100644 --- a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyConfigMain.java +++ b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyConfigMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,7 +71,7 @@ public class JerseyConfigMain { Routing.Builder routing = Routing.builder() .register("/rest", buildJersey()); - server = JerseyUtil.startIt(routing); + server = JerseyUtil.startIt(routing, 8080); JerseyResources.setPort(server.port()); } diff --git a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyProgrammaticMain.java b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyProgrammaticMain.java index 579d0b344..daf55846b 100644 --- a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyProgrammaticMain.java +++ b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyProgrammaticMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ public final class JerseyProgrammaticMain { Routing.Builder routing = Routing.builder() .register("/rest", buildJersey()); - server = JerseyUtil.startIt(routing); + server = JerseyUtil.startIt(routing, 8080); JerseyResources.setPort(server.port()); } diff --git a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyResources.java b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyResources.java index 2af933267..89e88a064 100644 --- a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyResources.java +++ b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyResources.java @@ -58,7 +58,7 @@ final class JerseyResources { @GET @Produces(MediaType.TEXT_PLAIN) public String getHello(@Context SecurityContext securityContext) { - return "To test this example, call /jersey. If you use a user without \"user\" role, your request will be denied. " + return "To test this example, call /protected. If you use a user without \"user\" role, your request will be denied. " + "Your current subject: " + securityContext.user().orElse(SecurityContext.ANONYMOUS); } @@ -122,7 +122,7 @@ final class JerseyResources { @GET @Produces(MediaType.TEXT_PLAIN) public String getHello(@Context SecurityContext securityContext) { - return "To test this example, call /jersey. If you use a user without \"user\" role, your request will be denied. " + return "To test this example, call /protected. If you use a user without \"user\" role, your request will be denied. " + "Your current subject: " + securityContext.user().orElse(SecurityContext.ANONYMOUS); } diff --git a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyUtil.java b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyUtil.java index 798c787e6..3c96261ae 100644 --- a/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyUtil.java +++ b/examples/security/jersey/src/main/java/io/helidon/security/examples/jersey/JerseyUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerConfiguration; import io.helidon.webserver.WebServer; /** @@ -33,8 +34,11 @@ class JerseyUtil { private JerseyUtil() { } - static WebServer startIt(Supplier routing) { - WebServer server = WebServer.create(routing); + static WebServer startIt(Supplier routing, int port) { + WebServer server = WebServer.builder(routing) + .config(ServerConfiguration.builder() + .port(port)) + .build(); long t = System.nanoTime(); diff --git a/examples/security/nohttp-programmatic/README.md b/examples/security/nohttp-programmatic/README.md index 35b18020d..c357972a8 100644 --- a/examples/security/nohttp-programmatic/README.md +++ b/examples/security/nohttp-programmatic/README.md @@ -1,17 +1,11 @@ - # Helidon Security Example Example of manually using the security APIs. +## Build and run -## Build - -``` +With JDK8+ +```bash mvn package -``` - -## Run - -``` -mvn exec:java -``` +java -jar target/helidon-examples-security-nohttp-programmatic.jar +``` \ No newline at end of file diff --git a/examples/security/nohttp-programmatic/pom.xml b/examples/security/nohttp-programmatic/pom.xml index 5eccd1482..48d63bedd 100644 --- a/examples/security/nohttp-programmatic/pom.xml +++ b/examples/security/nohttp-programmatic/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-nohttp-programmatic Helidon Security Examples No-HTTP programmatic @@ -41,7 +43,20 @@ io.helidon.security helidon-security - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/oidc/README.md b/examples/security/oidc/README.md index 404a55c3f..ae08d1459 100644 --- a/examples/security/oidc/README.md +++ b/examples/security/oidc/README.md @@ -1,23 +1,28 @@ -Security integration with OIDC -=================== +# Security integration with OIDC This example demonstrates integration with OIDC (Open ID Connect) providers. -Contents --------- +## Contents + MP example that integrates with an OIDC provider. To configure this example, you need to replace the following: 1. src/main/resources/application.yaml - set security.properties.oidc-* to your tenant and application configuration -Running the Example -------------------- +## Running the Example Run the "OidcMain" class for file configuration based example. +## Local configuration -Local configuration ------------------- The example is already set up to read `${user.home}/helidon/conf/examples.yaml` to override defaults configured in `application.yaml`. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-oidc-login.jar +``` \ No newline at end of file diff --git a/examples/security/oidc/pom.xml b/examples/security/oidc/pom.xml index c442836d1..93832c057 100644 --- a/examples/security/oidc/pom.xml +++ b/examples/security/oidc/pom.xml @@ -20,12 +20,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml - - oidc-login + io.helidon.examples.security + helidon-examples-security-oidc-login Helidon Security Examples OIDC @@ -41,19 +42,44 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} io.helidon.microprofile helidon-microprofile-oidc - ${project.version} + + + org.jboss + jandex + runtime + true + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/examples/security/outbound-override/README.md b/examples/security/outbound-override/README.md index 9a19c192d..6ed59e027 100644 --- a/examples/security/outbound-override/README.md +++ b/examples/security/outbound-override/README.md @@ -4,14 +4,18 @@ Example that propagates identity, and on one endpoint explicitly sets the username and password. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package +java -jar target/helidon-examples-security-outbound-override.jar ``` -## Run - -``` -mvn exec:java -``` +Try the endpoints: +```bash +curl -u "jack:password" http://localhost:8080/propagate +curl -u "jack:password" http://localhost:8080/override +curl -u "jill:anotherPassword" http://localhost:8080/propagate +curl -u "jill:anotherPassword" http://localhost:8080/override +``` \ No newline at end of file diff --git a/examples/security/outbound-override/pom.xml b/examples/security/outbound-override/pom.xml index 16e377530..cfad360b4 100644 --- a/examples/security/outbound-override/pom.xml +++ b/examples/security/outbound-override/pom.xml @@ -21,10 +21,12 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security 4.0.0 helidon-examples-security-outbound-override Helidon Security Examples Outbound Override @@ -37,27 +39,22 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} io.helidon.security.providers helidon-security-providers-jwt - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} @@ -71,7 +68,20 @@ io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideExample.java b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideExample.java index 0d268ec0e..f8c38ca99 100644 --- a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideExample.java +++ b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideExample.java @@ -69,26 +69,24 @@ public final class OutboundOverrideExample { private static CompletionStage startServingService() { Config config = createConfig("serving-service"); - return startServer(Routing - .builder() - .register(WebSecurity.create(config.get("security"))) - .get("/hello", (req, res) -> { - res.send(req.context().get(SecurityContext.class).flatMap(SecurityContext::user).map( - Subject::principal).map(Principal::getName).orElse("Anonymous")); - }), - server -> servingPort = server.port()); + Routing routing = Routing.builder() + .register(WebSecurity.create(config.get("security"))) + .get("/hello", (req, res) -> { + res.send(req.context().get(SecurityContext.class).flatMap(SecurityContext::user).map( + Subject::principal).map(Principal::getName).orElse("Anonymous")); + }).build(); + return startServer(routing, 9080, server -> servingPort = server.port()); } private static CompletionStage startClientService() { Config config = createConfig("client-service"); - return startServer(Routing - .builder() - .register(WebSecurity.create(config.get("security"))) - .get("/override", OutboundOverrideExample::override) - .get("/propagate", OutboundOverrideExample::propagate), - server -> clientPort = server.port()); - + Routing routing = Routing.builder() + .register(WebSecurity.create(config.get("security"))) + .get("/override", OutboundOverrideExample::override) + .get("/propagate", OutboundOverrideExample::propagate) + .build(); + return startServer(routing, 8080, server -> clientPort = server.port()); } private static void override(ServerRequest req, ServerResponse res) { @@ -101,7 +99,7 @@ public final class OutboundOverrideExample { .rx() .get(String.class) .thenAccept(result -> { - res.send("You are: " + context.userName() + ", backend service returned: " + result); + res.send("You are: " + context.userName() + ", backend service returned: " + result + "\n"); }) .exceptionally(throwable -> sendError(throwable, res)); } @@ -113,7 +111,7 @@ public final class OutboundOverrideExample { .request() .rx() .get(String.class) - .thenAccept(result -> res.send("You are: " + context.userName() + ", backend service returned: " + result)) + .thenAccept(result -> res.send("You are: " + context.userName() + ", backend service returned: " + result + "\n")) .exceptionally(throwable -> sendError(throwable, res)); } } diff --git a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideJwtExample.java b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideJwtExample.java index 3fb8cfd2e..d5a97887e 100644 --- a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideJwtExample.java +++ b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideJwtExample.java @@ -75,29 +75,27 @@ public final class OutboundOverrideJwtExample { private static CompletionStage startServingService() { Config config = createConfig("serving-service-jwt"); - return startServer(Routing - .builder() - .register(WebSecurity.create(config.get("security"))) - .get("/hello", (req, res) -> { - // This is the token. It should be bearer - req.headers().first("Authorization") - .ifPresent(System.out::println); - res.send(req.context().get(SecurityContext.class).flatMap(SecurityContext::user).map( - Subject::principal).map(Principal::getName).orElse("Anonymous")); - }), - server -> servingPort = server.port()); + Routing routing = Routing.builder() + .register(WebSecurity.create(config.get("security"))) + .get("/hello", (req, res) -> { + // This is the token. It should be bearer + req.headers().first("Authorization") + .ifPresent(System.out::println); + res.send(req.context().get(SecurityContext.class).flatMap(SecurityContext::user).map( + Subject::principal).map(Principal::getName).orElse("Anonymous")); + }).build(); + return startServer(routing, 9080, server -> servingPort = server.port()); } private static CompletionStage startClientService() { Config config = createConfig("client-service-jwt"); - return startServer(Routing - .builder() - .register(WebSecurity.create(config.get("security"))) - .get("/override", OutboundOverrideJwtExample::override) - .get("/propagate", OutboundOverrideJwtExample::propagate), - server -> clientPort = server.port()); - + Routing routing = Routing.builder() + .register(WebSecurity.create(config.get("security"))) + .get("/override", OutboundOverrideJwtExample::override) + .get("/propagate", OutboundOverrideJwtExample::propagate) + .build(); + return startServer(routing, 8080, server -> clientPort = server.port()); } private static void override(ServerRequest req, ServerResponse res) { diff --git a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideUtil.java b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideUtil.java index 6f1d5cdfe..d5d121d0c 100644 --- a/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideUtil.java +++ b/examples/security/outbound-override/src/main/java/io/helidon/security/examples/outbound/OutboundOverrideUtil.java @@ -27,6 +27,7 @@ import io.helidon.config.Config; import io.helidon.config.ConfigSources; import io.helidon.security.SecurityContext; import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerConfiguration; import io.helidon.webserver.ServerRequest; import io.helidon.webserver.ServerResponse; import io.helidon.webserver.WebServer; @@ -61,8 +62,10 @@ public final class OutboundOverrideUtil { .orElseThrow(() -> new RuntimeException("Failed to get security context from request, security not configured")); } - static CompletionStage startServer(Routing.Builder builder, Consumer callback) { - return WebServer.create(builder) + static CompletionStage startServer(Routing routing, int port, Consumer callback) { + return WebServer.builder(routing) + .config(ServerConfiguration.builder().port(port)) + .build() .start() .thenAccept(callback); } diff --git a/examples/security/pom.xml b/examples/security/pom.xml index f98929675..4c1311ee3 100644 --- a/examples/security/pom.xml +++ b/examples/security/pom.xml @@ -47,5 +47,4 @@ outbound-override oidc - diff --git a/examples/security/spi-examples/README.md b/examples/security/spi-examples/README.md index 1f2305a33..15652fc7a 100644 --- a/examples/security/spi-examples/README.md +++ b/examples/security/spi-examples/README.md @@ -1,5 +1,4 @@ -SPI implementation -=================== +# SPI implementation This example demonstrates how to implement various SPIs of security component. @@ -12,7 +11,7 @@ The following examples are available: 3. Audit provider 4. Provider selection policy -Running the Example -------------------- +# Running the Example + This is an API/SPI example. It is validated through unit tests. \ No newline at end of file diff --git a/examples/security/spi-examples/pom.xml b/examples/security/spi-examples/pom.xml index e29e28747..4cd0713d1 100644 --- a/examples/security/spi-examples/pom.xml +++ b/examples/security/spi-examples/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-spi Helidon Security Examples SPI Implementation @@ -37,12 +39,10 @@ io.helidon.security helidon-security - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} org.junit.jupiter @@ -60,4 +60,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/webserver-digest-auth/README.md b/examples/security/webserver-digest-auth/README.md index 43ddc930b..282773cbb 100644 --- a/examples/security/webserver-digest-auth/README.md +++ b/examples/security/webserver-digest-auth/README.md @@ -1,22 +1,30 @@ -Web Server Integration and Digest Authentication -=================== +# Web Server Integration and Digest Authentication -This example demonstrates Integration of RX Web Server +This example demonstrates Integration of WebServer based application with Security component and Digest authentication (from HttpAuthProvider). -Contents --------- +## Contents + There are two examples with exactly the same behavior: 1. DigestExampleMain - shows how to programmatically secure application 2. DigestExampleConfigMain - shows how to secure application with configuration 1. see src/main/resources/application.conf for configuration -Running the Example -------------------- +## Build and run -1. Clone the repository -2. If you cloned a snapshot, please run `mvn clean install -Dmaven.test.skip=true` in project root -3. Go to the directory of example you want to run - - And run `mvn exec:exec` to run the default example (config based) - - or run `mvn exec:exec -Dexample.main-class="io.helidon.security.examples.webserver.digest.DigestExampleBuilderMain"` - to run builder based example +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-webserver-digest-auth.jar +``` + +Try the application: + +```bash +curl http://localhost:56551/public +curl --digest -u "jill:password" http://localhost:56551/noRoles +curl --digest -u "john:password" http://localhost:56551/user +curl --digest -u "jack:password" http://localhost:56551/admin +curl -v --digest -u "john:password" http://localhost:56551/deny +curl --digest -u "jack:password" http://localhost:56551/noAuthn +``` \ No newline at end of file diff --git a/examples/security/webserver-digest-auth/pom.xml b/examples/security/webserver-digest-auth/pom.xml index 7acbcf225..07589b18c 100644 --- a/examples/security/webserver-digest-auth/pom.xml +++ b/examples/security/webserver-digest-auth/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-webserver-digest-auth Helidon Security Examples Digest Authentication @@ -42,27 +44,26 @@ io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.config helidon-config-encryption - ${project.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} - io.helidon.bundles - helidon-bundles-config - ${project.version} + io.helidon.config + helidon-config + + + io.helidon.config + helidon-config-yaml org.glassfish.jersey.core @@ -90,4 +91,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/webserver-digest-auth/src/main/java/io/helidon/security/examples/webserver/digest/DigestExampleBuilderMain.java b/examples/security/webserver-digest-auth/src/main/java/io/helidon/security/examples/webserver/digest/DigestExampleBuilderMain.java index 137098e85..035571da3 100644 --- a/examples/security/webserver-digest-auth/src/main/java/io/helidon/security/examples/webserver/digest/DigestExampleBuilderMain.java +++ b/examples/security/webserver-digest-auth/src/main/java/io/helidon/security/examples/webserver/digest/DigestExampleBuilderMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ import io.helidon.webserver.Routing; import io.helidon.webserver.WebServer; /** - * Example of HTTP digest authentication with RX Web Server fully configured programmatically. + * Example of HTTP digest authentication with WebServer fully configured programmatically. */ public final class DigestExampleBuilderMain { // used from unit tests diff --git a/examples/security/webserver-digest-auth/src/main/resources/application.conf b/examples/security/webserver-digest-auth/src/main/resources/application.conf deleted file mode 100644 index fc652cfd0..000000000 --- a/examples/security/webserver-digest-auth/src/main/resources/application.conf +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright (c) 2016, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -security { - config { - # Configuration of secured config (encryption of passwords in property files) - - # Set to true for production - if set to true, clear text passwords will cause failure - require-encryption = false - } - - providers: [ - # Security provider - digest authentication (supports roles) - { - http-digest-auth { - realm = "mic" - server-secret = "aPassword" - users: [ - { - login = "jack" - password = "${CLEAR=password}" - roles = ["user", "admin"] - - }, - { - login = "jill" - # master password is "jungle", password is "password" - password = "${CLEAR=password}" - roles = ["user"] - }, - { - login = "john" - password = "${CLEAR=password}" - roles = [] - } - ] - } - } - ] - - web-server { - # Configuration of integration with web server - defaults { - authenticate = true - } - paths: [ - { - path = "/noRoles" - methods = ["get"] - }, - { - path = "/user[/{*}]" - methods = ["get"] - roles-allowed = ["user"] - }, - { - path = "/admin" - methods = ["get"] - roles-allowed = ["admin"] - }, - { - path = "/deny" - methods = ["get"] - roles-allowed = ["deny"] - audit = true - }, - { - path = "/noAuthn" - roles-allowed = ["admin"] - authentication-optional = true - audit = true - } - ] - } -} diff --git a/examples/security/webserver-digest-auth/src/main/resources/application.yaml b/examples/security/webserver-digest-auth/src/main/resources/application.yaml new file mode 100644 index 000000000..342349c11 --- /dev/null +++ b/examples/security/webserver-digest-auth/src/main/resources/application.yaml @@ -0,0 +1,58 @@ +# +# Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +security: + config: + # Configuration of secured config (encryption of passwords in property files) + # Set to true for production - if set to true, clear text passwords will cause failure + require-encryption: false + providers: + - http-digest-auth: + realm: "mic" + server-secret: "aPassword" + users: + - login: "jack" + password: "${CLEAR=password}" + roles: ["user", "admin"] + + - login: "jill" + password: "${CLEAR=password}" + roles: ["user"] + + - login: "john" + password: "${CLEAR=password}" + roles: [] + web-server: + # Configuration of integration with web server + defaults: + authenticate: true + paths: + - path: "/noRoles" + methods: ["get"] + - path: "/user[/{*}]" + methods: ["get"] + roles-allowed: ["user"] + - path: "/admin" + methods: ["get"] + roles-allowed: ["admin"] + - path: "/deny" + methods: ["get"] + roles-allowed: ["deny"] + audit: true + - path: "/noAuthn" + roles-allowed: ["admin"] + authentication-optional: true + audit: true diff --git a/examples/security/webserver-signatures/README.md b/examples/security/webserver-signatures/README.md index ee8ce0700..efce09c8d 100644 --- a/examples/security/webserver-signatures/README.md +++ b/examples/security/webserver-signatures/README.md @@ -1,26 +1,30 @@ -Web Server Integration and HTTP Signatures -=================== +# Web Server Integration and HTTP Signatures -This example demonstrates Integration of RX Web Server +This example demonstrates Integration of WebServer based application with Security component and HTTP Signatures. -Contents --------- +## Contents + There are two examples with exactly the same behavior 1. builder - shows how to programmatically secure application 2. config - shows how to secure application with configuration - 1. see src/main/resources/service1.conf and src/main/resources/service2.conf for configuration + 1. see `src/main/resources/service1.yaml` and `src/main/resources/service2.conf` for configuration 3. Each consists of two services 1. "public" service protected by basic authentication (for simplicity) 2. "internal" service protected by a combination of basic authentication (for user propagation) and http signature (for service authentication) -Running the Example -------------------- +## Build and run -1. Clone the repository -2. If you cloned a snapshot, please run `mvn clean install -Dmaven.test.skip=true` in project root -3. Go to the directory of example you want to run - - And run `mvn exec:exec` to run the default example (config based) - - or run `mvn exec:exec -Dexample.main-class="io.helidon.security.examples.signatures.SignatureExampleBuilderMain"` - to run builder based example \ No newline at end of file +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-security-webserver-signatures.jar +``` + +Try the endpoints: +```bash +curl -u "jack:password" http://localhost:8080/service1 +curl -u "jill:password" http://localhost:8080/service1-rsa +curl -v -u "john:password" http://localhost:8080/service1 +``` \ No newline at end of file diff --git a/examples/security/webserver-signatures/pom.xml b/examples/security/webserver-signatures/pom.xml index 107c7874d..556dc5c5b 100644 --- a/examples/security/webserver-signatures/pom.xml +++ b/examples/security/webserver-signatures/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.security - helidon-examples-security-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.security helidon-examples-security-webserver-signatures Helidon Security Examples HTTP Signatures @@ -42,17 +44,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} org.glassfish.jersey.inject @@ -61,22 +60,18 @@ io.helidon.bundles helidon-bundles-security - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} io.helidon.config helidon-config-hocon - ${project.version} org.glassfish.jersey.core jersey-client - test org.junit.jupiter @@ -85,7 +80,7 @@ org.hamcrest - hamcrest-core + hamcrest-all test @@ -94,4 +89,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleBuilderMain.java b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleBuilderMain.java index a76940532..c5511e1d0 100644 --- a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleBuilderMain.java +++ b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleBuilderMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -98,8 +98,8 @@ public class SignatureExampleBuilderMain { System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); // start service 2 first, as it is required by service 1 - service2Server = SignatureExampleUtil.startServer(routing2()); - service1Server = SignatureExampleUtil.startServer(routing1()); + service2Server = SignatureExampleUtil.startServer(routing2(), 9080); + service1Server = SignatureExampleUtil.startServer(routing1(), 8080); System.out.println("Signature example: from builder"); System.out.println(); diff --git a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleConfigMain.java b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleConfigMain.java index 32f18d257..f695fc354 100644 --- a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleConfigMain.java +++ b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleConfigMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,8 +49,8 @@ public class SignatureExampleConfigMain { System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); // start service 2 first, as it is required by service 1 - service2Server = SignatureExampleUtil.startServer(routing2()); - service1Server = SignatureExampleUtil.startServer(routing1()); + service2Server = SignatureExampleUtil.startServer(routing2(), 9080); + service1Server = SignatureExampleUtil.startServer(routing1(), 8080); System.out.println("Signature example: from configuration"); System.out.println(); diff --git a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleUtil.java b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleUtil.java index 131dbfac8..996a40c83 100644 --- a/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleUtil.java +++ b/examples/security/webserver-signatures/src/main/java/io/helidon/security/examples/signatures/SignatureExampleUtil.java @@ -27,6 +27,7 @@ import io.helidon.common.OptionalHelper; import io.helidon.common.http.MediaType; import io.helidon.security.SecurityContext; import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerConfiguration; import io.helidon.webserver.ServerRequest; import io.helidon.webserver.ServerResponse; import io.helidon.webserver.WebServer; @@ -48,8 +49,11 @@ final class SignatureExampleUtil { * @param routing routing to configre * @return started web server instance */ - public static WebServer startServer(Routing routing) { - WebServer server = WebServer.create(routing); + public static WebServer startServer(Routing routing, int port) { + WebServer server = WebServer.builder(routing) + .config(ServerConfiguration.builder() + .port(port)) + .build(); long t = System.nanoTime(); CountDownLatch cdl = new CountDownLatch(1); diff --git a/examples/todo-app/README.md b/examples/todo-app/README.md index 2adc65889..e4d00ad49 100644 --- a/examples/todo-app/README.md +++ b/examples/todo-app/README.md @@ -1,62 +1,84 @@ -TODOs Demo Application -===================== +# TODO Demo Application -If you want to run behind a proxy, you need to configure the following in application.yaml of both services (find appropriate -existing google-login provider configuration): +This application implements todomvc[http://todomvc.com] with two microservices +implements with Helidon MP and Helidon SE. + +## HTTP proxy + +If you want to run behind a proxy, you need to configure the config key + `security.providers.google-login.proxy-host`. You can do that by updating + `frontend/src/main/resources/application.yaml` and + `backend/src/main/resources/application.yaml` with the following content: ```yaml -providers: +security: + providers: - google-login: proxy-host: "proxy.host" - client-id: "1048216952820-6a6ke9vrbjlhngbc0al0dkj9qs9tqbk2.apps.googleusercontent.com" ``` -Build and start the applications: +## Start Zipkin + +With Docker: ```bash -mvn clean install -mvn -f demo-frontend/pom.xml generate-resources docker:build -mvn -f demo-backend/pom.xml generate-resources docker:build -mvn -f demo-backend/cassandra/pom.xml generate-resources docker:build +docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin ``` -and then + +With Kubernetes: ```bash -docker run -d --name zipkin -p 9411:9411 openzipkin/zipkin -docker run -d --name helidon-todos-cassandra -p 9042:9042 --link zipkin helidon.demos/io/helidon/demo/helidon-todos-cassandra -docker run -d --name helidon-todos-backend -p 8854:8854 --link zipkin --link helidon-todos-cassandra helidon.demos/io/helidon/demo/helidon-todos-backend -docker run -d --name helidon-todos-frontend -p 8080:8080 --link zipkin --link helidon-todos-backend helidon.demos/io/helidon/demo/helidon-todos-frontend +kubectl apply -f ../k8s/ingress.yaml -f ../k8s/zipkin.yaml ``` -or + +## Build and run + +### With Docker: ```bash -docker-compose up +docker build -t helidon-examples-todo-cassandra cassandra/ +docker build -t helidon-examples-todo-backend backend/ +docker build -t helidon-examples-todo-frontend frontend/ +docker run --rm -d -p 9042:9042 \ + --link zipkin \ + --name helidon-examples-todo-cassandra \ + helidon-examples-todo-cassandra +docker run --rm -d -p 8854:8854 \ + --link zipkin \ + --link helidon-examples-todo-cassandra \ + --name helidon-examples-todo-backend \ + helidon-examples-todo-backend +docker run --rm -d -p 8080:8080 \ + --link zipkin \ + --link helidon-examples-todo-backend \ + --name helidon-examples-todo-frontend \ + helidon-examples-todo-frontend ``` -Link map: +Open http://localhost:8080 in your browser, add some TODO entries, then check + out the traces at http://localhost:9411. -| URL | Description | -| --- | ----------- | -| http://localhost:8080/index.html | Main page of the demo | -| http://localhost:8080/metrics | Prometheus metrics (frontend metrics) | -| http://localhost:8080/env | Environment name (from configuration) | -| http://localhost:9411/zipkin/ | Tracing page for Zipkin (served from docker started above) | - -Kubernetes setup: This assumes that the cluster is running DNS for services and pods. This -is required for pods to find services by name as shown in the configuration. +### With Kubernetes (docker for desktop) ```bash -export KUBECONFIG=./path/to/admin.conf - -# From application root -cd k8s - -# Create or update deployments and services for demo -kubectl apply -f k8s-deployment.yml +docker build -t helidon-examples-todo-cassandra cassandra/ +docker build -t helidon-examples-todo-backend backend/ +docker build -t helidon-examples-todo-frontend frontend/ +kubectl apply -f cassandra.yaml -f backend/app.yaml -f frontend/app.yaml ``` -It takes a few minutes for all containers to start when running in Kubernetes. After all -containers are started, use these URLs: +Open http://localhost/todo/ in your browser, add some TODO entries, then + check out the traces at http://localhost/zipkin. -| URL | Description | -| --- | ----------- | -| http://localhost:30080/index.html | Main page of the demo | -| http://localhost:30080/metrics | Prometheus metrics (frontend metrics) | -| http://localhost:30080/env | Environment name (from configuration) | -| http://localhost:30011/zipkin | Tracing page for Zipkin (served from docker started above) | +Stop the docker containers: +```bash +docker stop zipkin \ + helidon-examples-todo-backend \ + helidon-examples-todo-frontend +``` + +Delete the Kubernetes resources: +```bash +kubectl delete \ + -f ../k8s/ingress.yaml \ + -f ../k8s/zipkin.yaml \ + -f cassandra.yaml \ + -f backend/app.yaml \ + -f frontend/app.yaml +``` \ No newline at end of file diff --git a/examples/todo-app/backend/.dockerignore b/examples/todo-app/backend/.dockerignore new file mode 100644 index 000000000..257c1a107 --- /dev/null +++ b/examples/todo-app/backend/.dockerignore @@ -0,0 +1 @@ +conf/dev.yaml diff --git a/examples/todo-app/backend/Dockerfile b/examples/todo-app/backend/Dockerfile new file mode 100644 index 000000000..41fa002bd --- /dev/null +++ b/examples/todo-app/backend/Dockerfile @@ -0,0 +1,44 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-todo-backend.jar ./ +COPY --from=build /helidon/target/libs ./libs + +CMD ["java", "-jar", "helidon-examples-todo-backend.jar"] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/todo-app/backend/app.yaml b/examples/todo-app/backend/app.yaml new file mode 100644 index 000000000..47291eb43 --- /dev/null +++ b/examples/todo-app/backend/app.yaml @@ -0,0 +1,71 @@ +# +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +kind: ConfigMap +apiVersion: v1 +metadata: + name: helidon-examples-todo-backend + namespace: default +data: + env: k8s + services: |- + zipkin.host: zipkin + cassandra: |- + servers: + - host: helidon-examples-todo-cassandra + port: 9042 + +--- + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: helidon-examples-todo-backend +spec: + replicas: 1 + template: + metadata: + labels: + app: helidon-examples-todo-backend + spec: + containers: + - name: helidon-examples-todo-backend + image: helidon-examples-todo-backend + imagePullPolicy: Never + ports: + - containerPort: 8854 + volumeMounts: + - name: config-volume + mountPath: /conf + volumes: + - name: config-volume + configMap: + name: helidon-examples-todo-backend + +--- + +kind: Service +apiVersion: v1 +metadata: + name: helidon-examples-todo-backend +spec: + type: ClusterIP + selector: + app: helidon-examples-todo-backend + ports: + - name: http + port: 8854 + targetPort: 8854 diff --git a/examples/todo-app/demo-backend/conf/dev.yaml b/examples/todo-app/backend/dev.yaml similarity index 89% rename from examples/todo-app/demo-backend/conf/dev.yaml rename to examples/todo-app/backend/dev.yaml index 999dde9c7..90fa8f84e 100644 --- a/examples/todo-app/demo-backend/conf/dev.yaml +++ b/examples/todo-app/backend/dev.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/examples/todo-app/demo-backend/pom.xml b/examples/todo-app/backend/pom.xml similarity index 70% rename from examples/todo-app/demo-backend/pom.xml rename to examples/todo-app/backend/pom.xml index e44c77fd2..24cdfbfbc 100644 --- a/examples/todo-app/demo-backend/pom.xml +++ b/examples/todo-app/backend/pom.xml @@ -22,22 +22,34 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.todos - example-todo-app-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml - helidon-todos-backend - Helidon Examples ToDo Demo Backend + io.helidon.examples.todos + helidon-examples-todo-backend + Helidon Examples TODO Demo Backend - Back-end part of the demo, uses Helidon Microprofile + Back-end part of the application uses Helidon MP io.helidon.demo.todos.backend.Main - ${mainClass} + 3.4.0 + + + + com.datastax.cassandra + cassandra-driver-core + ${version.lib.cassandra} + + + + com.fasterxml.jackson.core @@ -67,25 +79,11 @@ com.datastax.cassandra cassandra-driver-core + com.google.guava guava - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - - - org.mockito - mockito-core - test - @@ -95,11 +93,16 @@ maven-dependency-plugin - copy-dependencies - prepare-package - - copy-dependencies - + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index diff --git a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/DbService.java b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/DbService.java similarity index 99% rename from examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/DbService.java rename to examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/DbService.java index 02f84717e..8d0bcfd66 100644 --- a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/DbService.java +++ b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/DbService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java similarity index 95% rename from examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java rename to examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java index 6a183ef7b..9a8214095 100644 --- a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java +++ b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/JaxRsBackendResource.java @@ -78,7 +78,6 @@ public class JaxRsBackendResource { * @param headers HTTP headers * @return the response with the retrieved entries as entity */ - @SuppressWarnings("checkstyle:designforextension") @GET @Produces(MediaType.APPLICATION_JSON) public Response list(@Context final SecurityContext context, @@ -104,7 +103,6 @@ public class JaxRsBackendResource { * @param context security context to map the user * @return the response with the retrieved entry as entity */ - @SuppressWarnings("checkstyle:designforextension") @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) @@ -125,7 +123,6 @@ public class JaxRsBackendResource { * @param context security context to map the user * @return the response with the deleted entry as entity */ - @SuppressWarnings("checkstyle:designforextension") @DELETE @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) @@ -146,7 +143,6 @@ public class JaxRsBackendResource { * @param context security context to map the user * @return the response ({@code 200} status if successful */ - @SuppressWarnings("checkstyle:designforextension") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @@ -169,7 +165,6 @@ public class JaxRsBackendResource { * @param context security context to map the user * @return the response with the updated entry as entity */ - @SuppressWarnings("checkstyle:designforextension") @PUT @Path("/{id}") @Consumes(MediaType.APPLICATION_JSON) diff --git a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/Main.java b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/Main.java similarity index 84% rename from examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/Main.java rename to examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/Main.java index 6dd070a78..d39087110 100644 --- a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/Main.java +++ b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,9 @@ import java.util.logging.LogManager; import io.helidon.config.Config; import io.helidon.microprofile.server.Server; +import static io.helidon.common.CollectionsHelper.listOf; import static io.helidon.config.ConfigSources.classpath; +import static io.helidon.config.ConfigSources.environmentVariables; import static io.helidon.config.ConfigSources.file; /** @@ -65,16 +67,17 @@ public final class Main { */ static Config buildConfig() { return Config.builder() - .sources( + .sources(listOf( + environmentVariables(), // expected on development machine // to override props for dev - file("conf/dev.yaml").optional(), + file("dev.yaml").optional(), // expected in k8s runtime // to configure testing/production values - file("conf/backend.yaml").optional(), + file("prod.yaml").optional(), // in jar file // (see src/main/resources/application.yaml) - classpath("application.yaml")) + classpath("application.yaml"))) // support for passwords in configuration // .addFilter(SecureConfigFilter.fromConfig()) .build(); diff --git a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/Todo.java b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/Todo.java similarity index 100% rename from examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/Todo.java rename to examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/Todo.java diff --git a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/package-info.java b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/package-info.java similarity index 89% rename from examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/package-info.java rename to examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/package-info.java index d43470d5e..bf7786504 100644 --- a/examples/todo-app/demo-backend/src/main/java/io/helidon/demo/todos/backend/package-info.java +++ b/examples/todo-app/backend/src/main/java/io/helidon/demo/todos/backend/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/todo-app/demo-backend/src/main/resources/META-INF/beans.xml b/examples/todo-app/backend/src/main/resources/META-INF/beans.xml similarity index 92% rename from examples/todo-app/demo-backend/src/main/resources/META-INF/beans.xml rename to examples/todo-app/backend/src/main/resources/META-INF/beans.xml index a4a9cf0a4..0cbed5bf5 100644 --- a/examples/todo-app/demo-backend/src/main/resources/META-INF/beans.xml +++ b/examples/todo-app/backend/src/main/resources/META-INF/beans.xml @@ -1,7 +1,7 @@ - - 4.0.0 - io.helidon.demo.todos - helidon-todos-cassandra - 0.0.1-SNAPSHOT - Helidon Examples TODOs Demo Cassandra database image - - - ${docker.registry}/io/helidon/demo/${project.artifactId} - helidon-docker-registry - helidon.demos - https://${docker.registry}/ - ${project.version} - - - - - - org.apache.maven.plugins - maven-resources-plugin - 2.7 - - - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory}/distribution/container - - - src/main/docker - true - - - - - - - - com.spotify - docker-maven-plugin - 0.4.11 - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory}/distribution/container - - ${docker.image.version} - latest - - - - - - diff --git a/examples/todo-app/demo-backend/cassandra/src/main/docker/Dockerfile b/examples/todo-app/demo-backend/cassandra/src/main/docker/Dockerfile deleted file mode 100644 index 718334504..000000000 --- a/examples/todo-app/demo-backend/cassandra/src/main/docker/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# -# Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. -# - -FROM cassandra - -ADD startup.sh / - -RUN chmod -v u=rx,og-rwx /startup.sh - -ENTRYPOINT ["/startup.sh"] - -EXPOSE 7000 7001 7199 9042 9160 - -CMD ["cassandra", "-f"] diff --git a/examples/todo-app/demo-backend/src/main/docker/Dockerfile b/examples/todo-app/demo-backend/src/main/docker/Dockerfile deleted file mode 100644 index 641da0348..000000000 --- a/examples/todo-app/demo-backend/src/main/docker/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -#FROM openjdk:8-jdk -FROM openjdk:8-jre-slim - -EXPOSE 8854 -RUN mkdir /app -COPY ${artifactId}-${version}.jar /app -COPY libs /app/libs - -CMD java ${JAVA_OPTS} -jar /app/${project.artifactId}-${version}.jar diff --git a/examples/todo-app/demo-backend/src/test/resources/application.yaml b/examples/todo-app/demo-backend/src/test/resources/application.yaml deleted file mode 100644 index 68e538115..000000000 --- a/examples/todo-app/demo-backend/src/test/resources/application.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -webserver: - port: 8854 - -jana: - provider: "Cassandra" - database: "backend" - stores.named: - backend.schema.key: ["id"] - servers: - - host: localhost - port: 9042 - -security: - config: - require-encryption: false - aes.insecure-passphrase: "jungle" - providers: - - abac: - - http-basic-auth: - realm: "helidon" - users: - - login: "jack" - password: "${CLEAR=jackIsGreat}" - roles: ["user", "admin"] - - login: "jill" - # master password is "jungle", password is "password" - password: "${AES=3XQ8A1RszE9JbXl+lUnnsX0gakuqjnTyp8YJWIAU1D3SiM2TaSnxd6U0/LjrdJYv}" - roles: ["user"] diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/extends/handlers.js b/examples/todo-app/demo-frontend/src/main/resources/WEB/js/extends/handlers.js deleted file mode 100644 index 2cc970226..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/extends/handlers.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -define([ - 'knockout', - 'config/global' -], function (ko, g) { - 'use strict'; - - function keyupBindingFactory(keyCode) { - return { - init: function (element, valueAccessor, allBindingsAccessor, data, bindingContext) { - var wrappedHandler, newValueAccessor; - - // wrap the handler with a check for the enter key - wrappedHandler = function (data, event) { - if (event.keyCode === keyCode) { - valueAccessor().call(this, data, event); - } - }; - - // create a valueAccessor with the options that we would want to pass to the event binding - newValueAccessor = function () { - return { - keyup: wrappedHandler - }; - }; - - // call the real event binding's init function - ko.bindingHandlers.event.init(element, newValueAccessor, allBindingsAccessor, data, bindingContext); - } - }; - } - - ko.bindingHandlers.enterKey = keyupBindingFactory(g.ENTER_KEY); - ko.bindingHandlers.escapeKey = keyupBindingFactory(g.ESCAPE_KEY); - - // wrapper to hasfocus that also selects text and applies focus async - ko.bindingHandlers.selectAndFocus = { - init: function (element, valueAccessor, allBindingsAccessor) { - ko.bindingHandlers.hasfocus.init(element, valueAccessor, allBindingsAccessor); - ko.utils.registerEventHandler(element, 'focus', function () { - element.focus(); - }); - }, - update: function (element, valueAccessor) { - ko.utils.unwrapObservable(valueAccessor()); // for dependency - // ensure that element is visible before trying to focus - setTimeout(function () { - ko.bindingHandlers.hasfocus.update(element, valueAccessor); - }, 0); - } - }; -}); diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/main.js b/examples/todo-app/demo-frontend/src/main/resources/WEB/js/main.js deleted file mode 100644 index 9aaae41d7..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/main.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Author: Santiago Pericas-Geertsen - -require.config({ - paths: { - knockout: '../node_modules/knockout/build/output/knockout-latest', - jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery', - gapi: '//apis.google.com/js/platform' - }, - shim: { - gapi: { - exports: 'gapi' - } - } -}); - -require([ - 'knockout', - 'config/global', - 'viewmodels/todo', - 'util/todoutil', - 'util/rest', - 'gapi', - 'extends/handlers', - 'jquery' -], function (ko, global, TodoViewModel, TodoUtil, rest, gapi, handlers, jquery) { - 'use strict'; - - // Initialize ko handler for spinner - var displayValue = function (element, valueAccessor) { - var value = ko.utils.unwrapObservable(valueAccessor()); - var isCurrentlyVisible = !(element.style.display == "none"); - if (value && !isCurrentlyVisible) { - element.style.display = ""; - } - else if (!value && isCurrentlyVisible) { - element.style.display = "none"; - } - }; - ko.bindingHandlers.spinner = { - 'init': function (element, valueAccessor) { - jquery(element) - .append( - '
' + - '
'); - displayValue(element, valueAccessor); - }, - 'update': function (element, valueAccessor) { - displayValue(element, valueAccessor); - } - }; - - // Initialize and bind view model - var viewModel = new TodoViewModel([]); - ko.applyBindings(viewModel); - - // Function to refresh list of todos given a user token - var refreshTodos = function (id_token) { - global.id_token = id_token; - console.log('id_token', id_token); - - // Get all todos from server - rest.get("/api/todo") - .done(function (todos) { - console.log("todos = " + JSON.stringify(todos)); - viewModel.todos.removeAll(); - todos.forEach(function (todo) { - viewModel.todos.push(TodoUtil.toObservable(todo)) - }); - viewModel.showSpinner(false); - }) - .fail(function (err) { - console.log(err.statusText); - }); - }; - - // Load oauth library and find user token - gapi.load('auth2', function () { - gapi.auth2.init({ - client_id: global.GOOGLE_SIGN_IN_CLIENT_ID - }).then(function () { - var isSignedIn = gapi.auth2.getAuthInstance().isSignedIn.get(); - if (isSignedIn) { - var id_token = gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().id_token; - refreshTodos(id_token); - } else { - viewModel.current("(Use button below to sign in using Google)"); - } - window.gapi.auth2.getAuthInstance().currentUser.listen(function (user) { - var id_token = user.getAuthResponse().id_token; - refreshTodos(id_token); - viewModel.current(""); - }); - }); - }); -}); diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/rest.js b/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/rest.js deleted file mode 100644 index 9fd40c0d7..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/rest.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Author: Santiago Pericas-Geertsen - -require.config({ - paths: { - jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery', - } -}); - -define([ - 'jquery', - 'config/global' -], function (jquery, global) { - 'use strict'; - - var rest = {}; - jquery.each(["post", "get", "put", "delete"], function (i, method) { - rest[method] = function (url, data, callback) { - var settings = { - url: url, - type: method, - dataType: "json", - data: JSON.stringify(data), - headers: { - Accept: "application/json", - "Authorization": "Bearer " + global.id_token - }, - success: callback - }; - if (method == "post" || method == "put") { - settings.contentType = "application/json"; - } - return jquery.ajax(settings); - }; - }); - - return rest; -}); diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/todoutil.js b/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/todoutil.js deleted file mode 100644 index 3d49a1792..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/util/todoutil.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Author: Santiago Pericas-Geertsen - -define([ - 'knockout', - 'util/rest' -], function (ko, rest) { - 'use strict'; - - var TodoUtil = { - // Map todo object to observable - toObservable: function (todo) { - var obs = { - id: ko.observable(todo.id), - title: ko.observable(todo.title), - completed: ko.observable(todo.completed), - editing: ko.observable(false) - }; - - // Subscribe to changes on completed and update server - obs.completed.subscribe(function () { - rest.put("/api/todo/" + obs.id(), TodoUtil.fromObservable(obs)) - .fail(function (err) { - console.log(err.statusText); - }); - }); - - return obs; - }, - - // Map observable to todo object - fromObservable: function (obs) { - var todo = { - title: obs.title(), - completed: obs.completed() - }; - if (obs.id()) { - todo.id = obs.id(); - } - return todo; - } - }; - - return TodoUtil; -}); diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/viewmodels/todo.js b/examples/todo-app/demo-frontend/src/main/resources/WEB/js/viewmodels/todo.js deleted file mode 100644 index 85a591585..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/viewmodels/todo.js +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Author: Santiago Pericas-Geertsen - -define([ - 'knockout', - 'config/global', - 'util/todoutil', - 'util/rest' -], function (ko, g, TodoUtil, rest) { - 'use strict'; - - // Create view model for TODO app - var viewmodel = function (todos) { - var self = this; - - self.todos = ko.observableArray(ko.utils.arrayMap(todos, function (todo) { - return TodoUtil.toObservable(todo); - })); - - self.current = ko.observable(); - - self.showSpinner = ko.observable(true); - - // Add a new todo - self.add = function () { - var current = self.current().trim(); - if (current) { - var newTodo = {title: current, completed: false}; - rest.post("/api/todo", newTodo) - .done(function (todo) { - self.todos.push(TodoUtil.toObservable(todo)); - self.current(''); - }) - .fail(function (err) { - console.log(err.statusText) - }); - } - }; - - // Remove an existing todo using its server-generated ID - self.remove = function (todo) { - rest.delete("/api/todo/" + todo.id()) - .done(function () { - self.todos.remove(todo); - }) - .fail(function (err) { - console.log(err.statusText); - }); - }; - - // Remove all completed todos - self.removeCompleted = function () { - ko.utils.arrayForEach(self.todos(), function (todo) { - if (todo.completed()) { - self.remove(todo); - } - }) - }; - - // Begin editing an item in the UI - self.editItem = function (todo) { - todo.editing(true); - todo.previousTitle = todo.title(); - }; - - // Stop editing an item in the UI - self.stopEditing = function (todo) { - todo.editing(false); - - var title = todo.title(); - var trimmedTitle = title.trim(); - - if (!trimmedTitle) { - self.remove(todo); - } - else { - if (title !== trimmedTitle) { - todo.title(trimmedTitle); - } - - rest.put("/api/todo/" + todo.id(), TodoUtil.fromObservable(todo)) - .fail(function (err) { - console.log(err.statusText); - }); - } - }; - - // Cancel editing an item in the UI - self.cancelEditing = function (todo) { - todo.editing(false); - todo.title(todo.previousTitle); - }; - - // Returns the number of todos completed from cache - self.completedCount = ko.computed(function () { - return ko.utils.arrayFilter(self.todos(), function (todo) { - return todo.completed(); - }).length; - }); - - // Returns the number of todos not completed from cache - self.remainingCount = ko.computed(function () { - return self.todos().length - self.completedCount(); - }); - - // Handle all completed toggle - self.allCompleted = ko.computed({ - read: function () { - return !self.remainingCount(); - }, - write: function (newValue) { - ko.utils.arrayForEach(self.todos(), function (todo) { - todo.completed(newValue); - rest.put("/api/todo/" + todo.id(), TodoUtil.fromObservable(todo)) - .fail(function (err) { - console.log(err.statusText); - }); - }); - } - }); - - // Utility function - self.getLabel = function (count) { - return ko.utils.unwrapObservable(count) === 1 ? 'item' : 'items'; - }; - }; - - return viewmodel; -}) -; diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/package-lock.json b/examples/todo-app/demo-frontend/src/main/resources/WEB/package-lock.json deleted file mode 100644 index d3ca3c263..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/package-lock.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" - }, - "knockout": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.4.2.tgz", - "integrity": "sha1-6HlY3netHpNvfOZFuri118RW2Tc=" - }, - "requirejs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", - "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==" - }, - "todomvc-app-css": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.2.tgz", - "integrity": "sha512-WgXLWY4snfC7yBkpzFb6xRmUbB06NGuji6njCByte0byW2DUpmyhh32o4sCQ8HX/pTwm71huKQlFiKYxR/2iVQ==" - }, - "todomvc-common": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.5.tgz", - "integrity": "sha512-D8kEJmxVMQIWwztEdH+WeiAfXRbbSCpgXq4NkYi+gduJ2tr8CNq7sYLfJvjpQ10KD9QxJwig57rvMbV2QAESwQ==" - } - } -} diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/package.json b/examples/todo-app/demo-frontend/src/main/resources/WEB/package.json deleted file mode 100644 index bc1c20694..000000000 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "private": true, - "dependencies": { - "knockout": "^3.2.0", - "requirejs": "^2.1.15", - "todomvc-app-css": "^2.1.0", - "todomvc-common": "^1.0.1", - "jquery": "3.3.1" - } -} diff --git a/examples/todo-app/docker-compose.yml b/examples/todo-app/docker-compose.yml deleted file mode 100644 index 70f434914..000000000 --- a/examples/todo-app/docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -version: '3' -services: - zipkin: - image: openzipkin/zipkin - ports: - - "9411:9411" - helidon-todos-cassandra: - image: helidon.demos/io/helidon/demo/helidon-todos-cassandra - ports: - - "9042:9042" - helidon-todos-backend: - image: helidon.demos/io/helidon/demo/helidon-todos-backend - ports: - - "8854:8854" - helidon-todos-frontend: - image: helidon.demos/io/helidon/demo/helidon-todos-frontend - ports: - - "8080:8080" - links: - - helidon-todos-backend diff --git a/examples/todo-app/etc/checkstyle.xml b/examples/todo-app/etc/checkstyle.xml deleted file mode 100644 index 54f5b25af..000000000 --- a/examples/todo-app/etc/checkstyle.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - diff --git a/examples/todo-app/frontend/.dockerignore b/examples/todo-app/frontend/.dockerignore new file mode 100644 index 000000000..33bfc7b3e --- /dev/null +++ b/examples/todo-app/frontend/.dockerignore @@ -0,0 +1,4 @@ +dev.yaml +node_modules/ +node/ +target/ diff --git a/examples/todo-app/frontend/Dockerfile b/examples/todo-app/frontend/Dockerfile new file mode 100644 index 000000000..c24439701 --- /dev/null +++ b/examples/todo-app/frontend/Dockerfile @@ -0,0 +1,51 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests -Dskip.npm + +# Create a second layer to cache the "NPM World" under node_modules +# Incremental docker builds will always resume after that, unless you update +# the package.json or package-lock.json +ADD package*.json ./ +RUN mvn com.github.eirslett:frontend-maven-plugin:npm -Dfrontend.npm.arguments="install" + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +ADD webpack.config.js . +RUN mvn package -DskipTests +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-todo-frontend.jar ./ +COPY --from=build /helidon/target/libs ./libs + +CMD ["java", "-jar", "helidon-examples-todo-frontend.jar"] + +EXPOSE 8080 diff --git a/examples/todo-app/frontend/app.yaml b/examples/todo-app/frontend/app.yaml new file mode 100644 index 000000000..d0d8e9963 --- /dev/null +++ b/examples/todo-app/frontend/app.yaml @@ -0,0 +1,84 @@ +# +# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +kind: ConfigMap +apiVersion: v1 +metadata: + name: helidon-examples-todo-frontend + namespace: default +data: + env: k8s + services: |- + zipkin.host: zipkin + backend.endpoint: http://helidon-examples-todo-backend:8854 +--- + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: helidon-examples-todo-frontend +spec: + replicas: 1 + template: + metadata: + labels: + app: helidon-examples-todo-frontend + spec: + containers: + - name: helidon-examples-todo-frontend + image: helidon-examples-todo-frontend + imagePullPolicy: Never + ports: + - containerPort: 8080 + volumeMounts: + - name: config-volume + mountPath: /conf + volumes: + - name: config-volume + configMap: + name: helidon-examples-todo-frontend + +--- + +kind: Service +apiVersion: v1 +metadata: + name: helidon-examples-todo-frontend +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + selector: + app: helidon-examples-todo-frontend + sessionAffinity: None +--- + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$1 + name: helidon-examples-todo-frontend +spec: + rules: + - host: localhost + http: + paths: + - path: /todo/(.*) + backend: + serviceName: helidon-examples-todo-frontend + servicePort: 8080 \ No newline at end of file diff --git a/examples/todo-app/demo-frontend/conf/dev.yaml b/examples/todo-app/frontend/dev.yaml similarity index 89% rename from examples/todo-app/demo-frontend/conf/dev.yaml rename to examples/todo-app/frontend/dev.yaml index b07f36eff..5652174eb 100644 --- a/examples/todo-app/demo-frontend/conf/dev.yaml +++ b/examples/todo-app/frontend/dev.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/examples/todo-app/frontend/package-lock.json b/examples/todo-app/frontend/package-lock.json new file mode 100644 index 000000000..8bcc00764 --- /dev/null +++ b/examples/todo-app/frontend/package-lock.json @@ -0,0 +1,7921 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "4.17.15" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000992", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.3", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.1.0" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.5.1", + "inherits": "2.0.4", + "parse-asn1": "5.1.4" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.10" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000992", + "electron-to-chromium": "1.3.252" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.1", + "ieee754": "1.1.13", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.5", + "chownr": "1.1.2", + "glob": "7.1.4", + "graceful-fs": "4.2.2", + "lru-cache": "4.1.5", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.7.1", + "ssri": "5.3.0", + "unique-filename": "1.1.1", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000992", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000992", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000992.tgz", + "integrity": "sha512-9AZRaPuAGg7Dh3iiO5/i8APo9UjVEeyArfW1ZTvYpg0H/Eo4VrAe3ggqOaUY9mhyfxT3CLeAZgEKqo+1nRc0MA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.3", + "braces": "2.3.2", + "fsevents": "1.2.9", + "glob-parent": "3.1.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "4.0.1", + "normalize-path": "3.0.0", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.2.0" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "1.0.4", + "color-convert": "1.9.3", + "color-string": "0.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.3" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.7.1", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "2.0.0", + "is-directory": "0.3.1", + "js-yaml": "3.13.1", + "parse-json": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.5.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.4", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.4", + "ripemd160": "2.0.2", + "safe-buffer": "5.2.0", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.4", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.1.0", + "randomfill": "1.0.4" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "7.0.18", + "timsort": "0.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.1", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.2.3", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.2.1", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.1", + "source-list-map": "2.0.1" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.3", + "domutils": "1.5.1", + "nth-check": "1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.2", + "regexpu-core": "1.0.0" + } + }, + "css-tree": { + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "0.5.7" + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.3", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.3", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.1", + "postcss-zindex": "2.2.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "4.0.1", + "cssnano-util-raw-cache": "4.0.1", + "postcss": "7.0.18", + "postcss-calc": "7.0.1", + "postcss-colormin": "4.0.3", + "postcss-convert-values": "4.0.1", + "postcss-discard-comments": "4.0.2", + "postcss-discard-duplicates": "4.0.2", + "postcss-discard-empty": "4.0.1", + "postcss-discard-overridden": "4.0.1", + "postcss-merge-longhand": "4.0.11", + "postcss-merge-rules": "4.0.3", + "postcss-minify-font-values": "4.0.2", + "postcss-minify-gradients": "4.0.2", + "postcss-minify-params": "4.0.2", + "postcss-minify-selectors": "4.0.2", + "postcss-normalize-charset": "4.0.1", + "postcss-normalize-display-values": "4.0.2", + "postcss-normalize-positions": "4.0.2", + "postcss-normalize-repeat-style": "4.0.2", + "postcss-normalize-string": "4.0.2", + "postcss-normalize-timing-functions": "4.0.2", + "postcss-normalize-unicode": "4.0.1", + "postcss-normalize-url": "4.0.1", + "postcss-normalize-whitespace": "4.0.2", + "postcss-ordered-values": "4.1.2", + "postcss-reduce-initial": "4.0.3", + "postcss-reduce-transforms": "4.0.2", + "postcss-svgo": "4.0.2", + "postcss-unique-selectors": "4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "caniuse-lite": "1.0.30000989", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "1.5.2", + "chalk": "2.4.2", + "q": "1.5.1" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "1.9.3", + "color-string": "1.5.3" + } + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.3", + "domutils": "1.7.0", + "nth-check": "1.0.2" + } + }, + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "requires": { + "mdn-data": "1.1.4", + "source-map": "0.5.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0.2.1", + "domelementtype": "1.3.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "1.1.2" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "dev": true, + "requires": { + "css-unit-converter": "1.1.1", + "postcss": "7.0.18", + "postcss-selector-parser": "5.0.0", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "color": "3.1.2", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "7.0.18" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "7.0.18" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "7.0.18" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "7.0.18" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "stylehacks": "4.0.3" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "caniuse-api": "3.0.0", + "cssnano-util-same-parent": "4.0.1", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1", + "vendors": "1.0.3" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "4.0.0", + "is-color-stop": "1.1.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "browserslist": "4.7.0", + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "7.0.18" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "3.3.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "caniuse-api": "3.0.0", + "has": "1.0.3", + "postcss": "7.0.18" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "2.0.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "3.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "svgo": "1.3.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "7.0.18", + "uniqs": "2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "svgo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "coa": "2.0.2", + "css-select": "2.0.2", + "css-select-base-adapter": "0.1.1", + "css-tree": "1.0.0-alpha.33", + "csso": "3.5.1", + "js-yaml": "3.13.1", + "mkdirp": "0.5.1", + "object.values": "1.1.0", + "sax": "1.2.4", + "stable": "0.1.8", + "unquote": "1.1.1", + "util.promisify": "1.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "7.0.18" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "1.2.3", + "source-map": "0.5.7" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "0.10.51", + "type": "1.0.3" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.1.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "0.4.0" + } + }, + "dom-serializer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "dev": true, + "requires": { + "domelementtype": "2.0.1", + "entities": "2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1.3.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.2.1", + "domelementtype": "1.3.1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "electron-to-chromium": { + "version": "1.3.252", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.252.tgz", + "integrity": "sha512-NWJ5TztDnjExFISZHFwpoJjMbLUifsNBnx7u2JI0gCw6SbKyQYYWWtBHasO/jPtHym69F4EZuTpRNGN11MT/jg==", + "dev": true + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.2.2", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.9" + }, + "dependencies": { + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.1.tgz", + "integrity": "sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA==", + "dev": true, + "requires": { + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.0", + "is-callable": "1.1.4", + "is-regex": "1.0.4", + "object-inspect": "1.6.0", + "object-keys": "1.1.1", + "string.prototype.trimleft": "2.0.0", + "string.prototype.trimright": "2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.2" + } + }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.2", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-symbol": "3.1.2" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.2", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51" + } + } + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "0.11.23", + "through": "2.3.8" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.3", + "esrecurse": "4.2.1", + "estraverse": "4.3.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.3.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.51" + } + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.5", + "safe-buffer": "5.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "2.6.3", + "loader-utils": "1.2.3", + "schema-utils": "0.3.0", + "webpack-sources": "1.4.3" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.2.2", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.3.0", + "nopt": "4.0.1", + "npm-packlist": "1.4.1", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.7.0", + "tar": "4.4.8" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.1.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.5", + "minizlib": "1.2.1", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "0.2.3", + "fastparse": "1.1.2", + "html-minifier": "3.5.21", + "loader-utils": "1.2.3", + "object-assign": "4.1.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.2.1", + "commander": "2.17.1", + "he": "1.2.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.4.10" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "3.5.21", + "loader-utils": "0.2.17", + "lodash": "4.17.15", + "pretty-error": "2.1.1", + "tapable": "1.1.3", + "toposort": "1.0.7", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "3.4.0" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "2.0.0", + "resolve-from": "3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.13.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "hex-color-regex": "1.1.0", + "hsl-regex": "1.0.0", + "hsla-regex": "1.0.0", + "rgb-regex": "1.0.1", + "rgba-regex": "1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "1.1.2" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "2.7.3" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "knockout": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.0.tgz", + "integrity": "sha512-vBUF/IsBDzaejHkNpiquKdc5uPrImXuQ4Mb9lEfNNJ5cyHGI8ThDupR+h3eMFZhfmPE/brfwcIAn/fm0yOvJUg==" + }, + "last-call-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", + "dev": true, + "requires": { + "lodash": "4.17.15", + "webpack-sources": "1.4.3" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.2.2", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.7.1", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.1.1", + "from2": "2.3.0", + "parallel-transform": "1.2.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.5" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.7.1", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "1.5.0", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "3.0.0", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.1", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.2", + "stream-http": "2.8.3", + "string_decoder": "1.3.0", + "timers-browserify": "2.0.11", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.11.1", + "vm-browserify": "1.1.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.29.tgz", + "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==", + "dev": true, + "requires": { + "semver": "5.7.1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "2.8.4", + "resolve": "1.12.0", + "semver": "5.7.1", + "validate-npm-package-license": "3.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.14.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.14.1", + "function-bind": "1.1.1", + "has": "1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.1.tgz", + "integrity": "sha512-FSoF15xKSEM2qCE3/y2gH92PysJSBY58Wx/hmSdIzVSOd0vg+FRS28NWZADId1wh6PDlbVt0lfPduV0IBufItQ==", + "dev": true, + "requires": { + "cssnano": "4.1.10", + "last-call-webpack-plugin": "2.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "5.2.1", + "cssnano-preset-default": "4.0.7", + "is-resolvable": "1.1.0", + "postcss": "7.0.18" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "1.0.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17", + "safe-buffer": "5.2.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.2.0", + "sha.js": "2.4.11" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.5.1", + "source-map": "0.5.7", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.3" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.23" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "4.0.0", + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "svgo": "0.7.2" + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "1.0.3", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.3", + "utila": "0.4.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.4", + "randombytes": "2.1.0", + "safe-buffer": "5.2.0" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.7.1", + "inherits": "2.0.4", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.1.0", + "safe-buffer": "5.2.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.5.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "string_decoder": "1.3.0", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "4.2.2", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.2.0", + "htmlparser2": "3.10.1", + "strip-ansi": "3.0.1", + "utila": "0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "7.1.4" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.4" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "safe-buffer": "5.2.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "0.3.2" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.5" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.5" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz", + "integrity": "sha1-aLaqjhYsaoDnbjqKDC50cYbicf8=", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "function-bind": "1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz", + "integrity": "sha1-q0pW2AKgH75yk+EehPJNyBZGYd0=", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "function-bind": "1.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "4.7.0", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "todomvc-app-css": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.2.0.tgz", + "integrity": "sha512-H03oc3QOxiGXv+MqnotcduZIwoGX8A8QbSx9J4U2Z5R96LrK+dvQmRDTgeCc0nlkPBhd3nUL4EbfS7l0TccM5g==" + }, + "todomvc-common": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.5.tgz", + "integrity": "sha512-D8kEJmxVMQIWwztEdH+WeiAfXRbbSCpgXq4NkYi+gduJ2tr8CNq7sYLfJvjpQ10KD9QxJwig57rvMbV2QAESwQ==" + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "2.19.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.7", + "serialize-javascript": "1.9.1", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.4.3", + "worker-farm": "1.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "6.10.2", + "ajv-keywords": "3.4.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + } + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "2.0.2" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.1.8", + "graceful-fs": "4.2.2", + "neo-async": "2.6.1" + } + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "requires": { + "acorn": "5.7.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "6.10.2", + "ajv-keywords": "3.4.1", + "async": "2.6.3", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.2.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.4.0", + "loader-utils": "1.2.3", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.2.1", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.9", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.6.0", + "webpack-sources": "1.4.3", + "yargs": "8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.4.3" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "2.0.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/examples/todo-app/frontend/package.json b/examples/todo-app/frontend/package.json new file mode 100644 index 000000000..4eb32495d --- /dev/null +++ b/examples/todo-app/frontend/package.json @@ -0,0 +1,23 @@ +{ + "private": true, + "scripts": { + "build": "webpack --debug --config webpack.config.js" + }, + "dependencies": { + "jquery": "3.3.1", + "knockout": "^3.2.0", + "todomvc-app-css": "^2.1.0", + "todomvc-common": "^1.0.1" + }, + "devDependencies": { + "rimraf": "^2.6.0", + "html-loader": "0.5.5", + "css-loader": "^0.28.0", + "html-webpack-plugin": "^3.2.0", + "uglifyjs-webpack-plugin": "^1.1.1", + "extract-text-webpack-plugin": "^3.0.0", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "webpack": "^3.6.0", + "ajv": "^6.0.0" + } +} diff --git a/examples/todo-app/demo-frontend/pom.xml b/examples/todo-app/frontend/pom.xml similarity index 82% rename from examples/todo-app/demo-frontend/pom.xml rename to examples/todo-app/frontend/pom.xml index 7f670ebb4..57c156c4a 100644 --- a/examples/todo-app/demo-frontend/pom.xml +++ b/examples/todo-app/frontend/pom.xml @@ -22,15 +22,17 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.todos - example-todo-app-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml - helidon-todos-frontend - Helidon Examples ToDo Demo Frontend + io.helidon.examples.todo + helidon-examples-todo-frontend + Helidon Examples TODO Demo Frontend - Front-end part of the demo, uses pure Helidon + Front-end part of the application, uses pure Helidon SE @@ -51,6 +53,10 @@ io.helidon.webserver helidon-webserver
+ + io.helidon.webserver + helidon-webserver-access-log + io.helidon.media.jsonp helidon-media-jsonp-server @@ -104,19 +110,8 @@ jersey-hk2 - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - - - org.mockito - mockito-core - test + org.glassfish.jersey.core + jersey-common @@ -125,8 +120,10 @@ com.github.eirslett frontend-maven-plugin + 1.6 - src/main/resources/WEB + v8.11.1 + 5.6.0 @@ -143,6 +140,15 @@ install + + npm-run-build + + npm + + + run build + + @@ -150,11 +156,7 @@ maven-dependency-plugin - copy-dependencies - prepare-package - - copy-dependencies - + copy-libs diff --git a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java similarity index 96% rename from examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java rename to examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java index 8f7e5b59a..05c216a8e 100644 --- a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java +++ b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/BackendServiceClient.java @@ -33,6 +33,7 @@ import io.helidon.common.CollectionsHelper; import io.helidon.common.http.Http; import io.helidon.config.Config; import io.helidon.security.SecurityContext; +import io.helidon.security.integration.jersey.client.ClientSecurity; import io.helidon.webserver.ServerResponse; import io.opentracing.Span; @@ -149,12 +150,14 @@ public final class BackendServiceClient { * Create a new TODO entry. * * @param json the new entry value to create as {@code JsonObject} + * @param sc {@code SecurityContext} to use * @return created entry as {@code JsonObject} */ - public CompletionStage> create(final JsonObject json) { + public CompletionStage> create(final JsonObject json, final SecurityContext sc) { return client .target(serviceEndpoint + "/api/backend/") + .property(ClientSecurity.PROPERTY_CONTEXT, sc) .request() .rx() .post(Entity.json(json)) @@ -174,6 +177,7 @@ public final class BackendServiceClient { final ServerResponse res) { client.target(serviceEndpoint + "/api/backend/" + id) + .property(ClientSecurity.PROPERTY_CONTEXT, sc) .request() .buildPut(Entity.json(json)) .submit(new InvocationCallback() { diff --git a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/EnvHandler.java b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/EnvHandler.java similarity index 100% rename from examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/EnvHandler.java rename to examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/EnvHandler.java diff --git a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java similarity index 86% rename from examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java rename to examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java index 5a01622e2..eceec809d 100644 --- a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java +++ b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/Main.java @@ -17,7 +17,9 @@ package io.helidon.demo.todos.frontend; import java.io.IOException; +import java.util.logging.Level; import java.util.logging.LogManager; +import java.util.logging.Logger; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; @@ -32,10 +34,14 @@ import io.helidon.webserver.Routing; import io.helidon.webserver.ServerConfiguration; import io.helidon.webserver.StaticContentSupport; import io.helidon.webserver.WebServer; +import io.helidon.webserver.accesslog.AccessLogSupport; import io.opentracing.Tracer; +import org.glassfish.jersey.logging.LoggingFeature; +import static io.helidon.common.CollectionsHelper.listOf; import static io.helidon.config.ConfigSources.classpath; +import static io.helidon.config.ConfigSources.environmentVariables; import static io.helidon.config.ConfigSources.file; import static io.helidon.config.PollingStrategies.regular; import static java.time.Duration.ofSeconds; @@ -77,6 +83,7 @@ public final class Main { // build a client (Jersey) // and apply security and tracing features on it Client client = ClientBuilder.newClient(); + client.register(new LoggingFeature(Logger.getGlobal(), Level.FINE, LoggingFeature.Verbosity.PAYLOAD_ANY, 8192)); BackendServiceClient bsc = new BackendServiceClient(client, config); @@ -113,8 +120,7 @@ public final class Main { * @return the created {@code Tracer} */ private static Tracer registerTracer(final Config config) { - return TracerBuilder.create(config.get("tracing")) - .buildAndRegister(); + return TracerBuilder.create(config.get("tracing")).build(); } /** @@ -129,12 +135,13 @@ public final class Main { final BackendServiceClient bsc) { return Routing.builder() + .register(AccessLogSupport.create()) // register metrics features (on "/metrics") .register(MetricsSupport.create()) // register security features .register(WebSecurity.create(security, config)) // register static content support (on "/") - .register(StaticContentSupport.create("/WEB")) + .register(StaticContentSupport.builder("/WEB").welcomeFileName("index.html")) // register API handler (on "/api") - this path is secured (see application.yaml) .register("/api", new TodosHandler(bsc)) // and a simple environment handler to see where we are @@ -153,11 +160,8 @@ public final class Main { final Throwable throwable) { if (throwable == null) { - System.out.println("--- Service started on http://localhost:" - + webServer.port() + "/index.html"); - System.out.println("--- To stop the application, hit CTRL+C"); + System.out.println("WEB server is up! http://localhost:" + webServer.port()); } else { - System.out.println("--- Cannot start service!"); throwable.printStackTrace(System.out); System.exit(1); } @@ -169,21 +173,22 @@ public final class Main { */ private static Config buildConfig() { return Config.builder() - .sources( + .sources(listOf( + environmentVariables(), // expected on development machine // to override props for dev - file("conf/dev.yaml") + file("dev.yaml") .pollingStrategy(PollingStrategies::watch) .optional(), // expected in k8s runtime // to configure testing/production values - file("conf/frontend.yaml") + file("prod.yaml") .pollingStrategy(regular( ofSeconds(POLLING_INTERVAL))) .optional(), // in jar file // (see src/main/resources/application.yaml) - classpath("application.yaml")) + classpath("application.yaml"))) .build(); } } diff --git a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java similarity index 93% rename from examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java rename to examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java index 5b2fe1e77..ac1134db0 100644 --- a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java +++ b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/TodosHandler.java @@ -123,7 +123,7 @@ public final class TodosHandler implements Service { private void create(final ServerRequest req, final ServerResponse res) { secure(req, res, sc -> json(req, res, json -> { createCounter.inc(); - bsc.create(json) + bsc.create(json, sc) .thenAccept(created -> sendResponse(res, created, Http.Status.INTERNAL_SERVER_ERROR_500)) .exceptionally(t -> sendError(t, res)); })); @@ -136,13 +136,11 @@ public final class TodosHandler implements Service { * @param res the server response */ private void getAll(final ServerRequest req, final ServerResponse res) { - secure(req, - res, - securityContext -> { - bsc.getAll(req.spanContext()) - .thenAccept(res::send) - .exceptionally(t -> sendError(t, res)); - }); + secure(req, res, sc -> { + bsc.getAll(req.spanContext()) + .thenAccept(res::send) + .exceptionally(t -> sendError(t, res)); + }); } /** @@ -152,14 +150,12 @@ public final class TodosHandler implements Service { * @param res the server response */ private void update(final ServerRequest req, final ServerResponse res) { - secure(req, - res, - securityContext -> json(req, res, json -> { - updateCounter.inc(); - // example of asynchronous processing - bsc.update(securityContext, - req.path().param("id"), json, res); - })); + secure(req, res, sc -> json(req, res, json -> { + updateCounter.inc(); + // example of asynchronous processing + bsc.update(sc, + req.path().param("id"), json, res); + })); } /** diff --git a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java similarity index 89% rename from examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java rename to examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java index bf3c9a175..9ac2fbf10 100644 --- a/examples/todo-app/demo-frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java +++ b/examples/todo-app/frontend/src/main/java/io/helidon/demo/todos/frontend/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/todo-app/demo-frontend/src/main/resources/application.yaml b/examples/todo-app/frontend/src/main/resources/application.yaml similarity index 91% rename from examples/todo-app/demo-frontend/src/main/resources/application.yaml rename to examples/todo-app/frontend/src/main/resources/application.yaml index 31704f0c6..336c73dbb 100644 --- a/examples/todo-app/demo-frontend/src/main/resources/application.yaml +++ b/examples/todo-app/frontend/src/main/resources/application.yaml @@ -23,7 +23,7 @@ tracing: host: "zipkin" services: - backend.endpoint: "http://helidon-todos-backend:8854" + backend.endpoint: "http://helidon-examples-todo-backend:8854" security: config: @@ -43,7 +43,7 @@ security: - http-signatures: outbound: - name: "backend" - hosts: ["localhost", "helidon-todos-backend"] + hosts: ["localhost", "helidon-examples-todo-backend"] signature: key-id: "frontend" hmac.secret: "${CLEAR=frontend2backend}" diff --git a/examples/todo-app/demo-frontend/src/main/resources/logging.properties b/examples/todo-app/frontend/src/main/resources/logging.properties similarity index 100% rename from examples/todo-app/demo-frontend/src/main/resources/logging.properties rename to examples/todo-app/frontend/src/main/resources/logging.properties diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/css/spinner.css b/examples/todo-app/frontend/src/main/webapp/css/spinner.css similarity index 94% rename from examples/todo-app/demo-frontend/src/main/resources/WEB/js/css/spinner.css rename to examples/todo-app/frontend/src/main/webapp/css/spinner.css index 3c5f391b1..f8be5289f 100644 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/css/spinner.css +++ b/examples/todo-app/frontend/src/main/webapp/css/spinner.css @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/index.html b/examples/todo-app/frontend/src/main/webapp/index.html similarity index 72% rename from examples/todo-app/demo-frontend/src/main/resources/WEB/index.html rename to examples/todo-app/frontend/src/main/webapp/index.html index 493009247..74b822ecf 100644 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/index.html +++ b/examples/todo-app/frontend/src/main/webapp/index.html @@ -1,10 +1,6 @@ - - - - + + + Helidon TodoMVC - - - -
@@ -50,22 +43,19 @@
- - 0 - left - + + 0 + left +
-

Double-click to edit a todo

+

Double-click to edit a TODO

Helidon implementation of TodoMVC

 

-
button -
+
button
- - + diff --git a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/config/global.js b/examples/todo-app/frontend/src/main/webapp/js/global.js similarity index 66% rename from examples/todo-app/demo-frontend/src/main/resources/WEB/js/config/global.js rename to examples/todo-app/frontend/src/main/webapp/js/global.js index 8baf256cb..2f95b1d3a 100644 --- a/examples/todo-app/demo-frontend/src/main/resources/WEB/js/config/global.js +++ b/examples/todo-app/frontend/src/main/webapp/js/global.js @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -define({ - ENTER_KEY: 13, - ESCAPE_KEY: 27, - GOOGLE_SIGN_IN_CLIENT_ID: '1048216952820-6a6ke9vrbjlhngbc0al0dkj9qs9tqbk2.apps.googleusercontent.com', - id_token: 'ID_TOKEN_NOT_FOUND' -}); +module.exports = { + ENTER_KEY: 13, + ESCAPE_KEY: 27, + GOOGLE_SIGN_IN_CLIENT_ID: '1048216952820-6a6ke9vrbjlhngbc0al0dkj9qs9tqbk2.apps.googleusercontent.com', + id_token: 'ID_TOKEN_NOT_FOUND' +}; diff --git a/examples/todo-app/frontend/src/main/webapp/js/handlers.js b/examples/todo-app/frontend/src/main/webapp/js/handlers.js new file mode 100644 index 000000000..3829a8132 --- /dev/null +++ b/examples/todo-app/frontend/src/main/webapp/js/handlers.js @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const ko = require('knockout'); +const global = require('./global.js'); + +function keyupBindingFactory(keyCode) { + return { + init: function (element, valueAccessor, allBindingsAccessor, data, bindingContext) { + var wrappedHandler, newValueAccessor; + + // wrap the handler with a check for the enter key + wrappedHandler = function (data, event) { + if (event.keyCode === keyCode) { + valueAccessor().call(this, data, event); + } + }; + + // create a valueAccessor with the options that we would want to pass to the event binding + newValueAccessor = function () { + return { + keyup: wrappedHandler + }; + }; + + // call the real event binding's init function + ko.bindingHandlers.event.init(element, newValueAccessor, allBindingsAccessor, data, bindingContext); + } + }; +} +ko.bindingHandlers.enterKey = keyupBindingFactory(global.ENTER_KEY); +ko.bindingHandlers.escapeKey = keyupBindingFactory(global.ESCAPE_KEY); + +// wrapper to hasfocus that also selects text and applies focus async +ko.bindingHandlers.selectAndFocus = { + init: function (element, valueAccessor, allBindingsAccessor) { + ko.bindingHandlers.hasfocus.init(element, valueAccessor, allBindingsAccessor); + ko.utils.registerEventHandler(element, 'focus', function () { + element.focus(); + }); + }, + update: function (element, valueAccessor) { + ko.utils.unwrapObservable(valueAccessor()); // for dependency + // ensure that element is visible before trying to focus + setTimeout(function () { + ko.bindingHandlers.hasfocus.update(element, valueAccessor); + }, 0); + } +}; diff --git a/examples/todo-app/frontend/src/main/webapp/js/main.js b/examples/todo-app/frontend/src/main/webapp/js/main.js new file mode 100644 index 000000000..61b15216e --- /dev/null +++ b/examples/todo-app/frontend/src/main/webapp/js/main.js @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* global gapi */ + +// Author: Santiago Pericas-Geertsen + +const ko = require('knockout'); +const jquery = require('jquery'); +const global = require('./global.js'); +const rest = require('./rest.js'); +require('./handlers.js'); +const TodoViewModel = require('./todo.js'); +const TodoUtil = require('./todoutil.js'); + +// for bundling only +require('todomvc-common'); +require('todomvc-common-css'); +require('todomvc-app-css'); +require('../css/spinner.css'); + +// Initialize ko handler for spinner +var displayValue = function (element, valueAccessor) { + var value = ko.utils.unwrapObservable(valueAccessor()); + var isCurrentlyVisible = !(element.style.display === "none"); + if (value && !isCurrentlyVisible) { + element.style.display = ""; + } else if (!value && isCurrentlyVisible) { + element.style.display = "none"; + } +}; +ko.bindingHandlers.spinner = { + 'init': function (element, valueAccessor) { + jquery(element) + .append( + '
' + + '
'); + displayValue(element, valueAccessor); + }, + 'update': function (element, valueAccessor) { + displayValue(element, valueAccessor); + } +}; + +// Initialize and bind view model +var viewModel = new TodoViewModel([]); +ko.applyBindings(viewModel); + +// Function to refresh list of todos given a user token +var refreshTodos = function (id_token) { + global.id_token = id_token; + //console.log('id_token', id_token); + + // Get all todos from server + rest.get(window.location.pathname + "api/todo") + .done(function (todos) { + console.log("todos = " + JSON.stringify(todos)); + viewModel.todos.removeAll(); + todos.forEach(function (todo) { + viewModel.todos.push(TodoUtil.toObservable(todo)); + }); + viewModel.showSpinner(false); + }) + .fail(function (err) { + console.log(err.statusText); + }); +}; + +window.onGAPILoadCallback = function () { + // Load oauth library and find user token + gapi.load('signin2', function() { + gapi.signin2.render('gSignIn'); + }); + gapi.load('auth2', function () { + gapi.auth2.init({ + client_id: global.GOOGLE_SIGN_IN_CLIENT_ID + }).then(function () { + var isSignedIn = gapi.auth2.getAuthInstance().isSignedIn.get(); + if (isSignedIn) { + var id_token = gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().id_token; + refreshTodos(id_token); + } else { + viewModel.current("(Use button below to sign in using Google)"); + } + window.gapi.auth2.getAuthInstance().currentUser.listen(function (user) { + var id_token = user.getAuthResponse().id_token; + refreshTodos(id_token); + viewModel.current(""); + }); + }); + }); +}; diff --git a/examples/todo-app/frontend/src/main/webapp/js/rest.js b/examples/todo-app/frontend/src/main/webapp/js/rest.js new file mode 100644 index 000000000..9415fd192 --- /dev/null +++ b/examples/todo-app/frontend/src/main/webapp/js/rest.js @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Author: Santiago Pericas-Geertsen + +const jquery = require('jquery'); +const global = require('./global.js'); + +function init() { + var rest = {}; + jquery.each(["post", "get", "put", "delete"], function (i, method) { + rest[method] = function (url, data, callback) { + var settings = { + url: url, + type: method, + dataType: "json", + data: JSON.stringify(data), + headers: { + Accept: "application/json", + "Authorization": "Bearer " + global.id_token + }, + success: callback + }; + if (method === "post" || method === "put") { + settings.contentType = "application/json"; + } + return jquery.ajax(settings); + }; + }); + return rest; +} +module.exports = init(); diff --git a/examples/todo-app/frontend/src/main/webapp/js/todo.js b/examples/todo-app/frontend/src/main/webapp/js/todo.js new file mode 100644 index 000000000..c6f9b2035 --- /dev/null +++ b/examples/todo-app/frontend/src/main/webapp/js/todo.js @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Author: Santiago Pericas-Geertsen + +const ko = require('knockout'); +const global = require('./global.js'); +const rest = require('./rest.js'); +const TodoUtil = require('./todoutil.js'); + +// Create view model for TODO app +var viewmodel = function (todos) { + var self = this; + self.todos = ko.observableArray(ko.utils.arrayMap(todos, function (todo) { + return TodoUtil.toObservable(todo); + })); + self.current = ko.observable(); + self.showSpinner = ko.observable(true); + // Add a new todo + self.add = function () { + var current = self.current().trim(); + if (current) { + var newTodo = {title: current, completed: false}; + rest.post(window.location.pathname + "api/todo", newTodo) + .done(function (todo) { + self.todos.push(TodoUtil.toObservable(todo)); + self.current(''); + }) + .fail(function (err) { + console.log(err.statusText) + }); + } + }; + // Remove an existing todo using its server-generated ID + self.remove = function (todo) { + rest.delete(window.location.pathname + "api/todo/" + todo.id()) + .done(function () { + self.todos.remove(todo); + }) + .fail(function (err) { + console.log(err.statusText); + }); + }; + // Remove all completed todos + self.removeCompleted = function () { + ko.utils.arrayForEach(self.todos(), function (todo) { + if (todo.completed()) { + self.remove(todo); + } + }); + }; + // Begin editing an item in the UI + self.editItem = function (todo) { + todo.editing(true); + todo.previousTitle = todo.title(); + }; + // Stop editing an item in the UI + self.stopEditing = function (todo) { + todo.editing(false); + var title = todo.title(); + var trimmedTitle = title.trim(); + if (!trimmedTitle) { + self.remove(todo); + } else { + if (title !== trimmedTitle) { + todo.title(trimmedTitle); + } + + rest.put(window.location.pathname + "api/todo/" + todo.id(), TodoUtil.fromObservable(todo)) + .fail(function (err) { + console.log(err.statusText); + }); + } + }; + // Cancel editing an item in the UI + self.cancelEditing = function (todo) { + todo.editing(false); + todo.title(todo.previousTitle); + }; + // Returns the number of todos completed from cache + self.completedCount = ko.computed(function () { + return ko.utils.arrayFilter(self.todos(), function (todo) { + return todo.completed(); + }).length; + }); + // Returns the number of todos not completed from cache + self.remainingCount = ko.computed(function () { + return self.todos().length - self.completedCount(); + }); + // Handle all completed toggle + self.allCompleted = ko.computed({ + read: function () { + return !self.remainingCount(); + }, + write: function (newValue) { + ko.utils.arrayForEach(self.todos(), function (todo) { + todo.completed(newValue); + rest.put(window.location.pathname + "api/todo/" + todo.id(), TodoUtil.fromObservable(todo)) + .fail(function (err) { + console.log(err.statusText); + }); + }); + } + }); + // Utility function + self.getLabel = function (count) { + return ko.utils.unwrapObservable(count) === 1 ? 'item' : 'items'; + }; +}; + +module.exports = viewmodel; diff --git a/examples/todo-app/frontend/src/main/webapp/js/todoutil.js b/examples/todo-app/frontend/src/main/webapp/js/todoutil.js new file mode 100644 index 000000000..3351a7a3c --- /dev/null +++ b/examples/todo-app/frontend/src/main/webapp/js/todoutil.js @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Author: Santiago Pericas-Geertsen + +const ko = require('knockout'); +const rest = require('./rest.js'); + +var TodoUtil = { + // Map todo object to observable + toObservable: function (todo) { + var obs = { + id: ko.observable(todo.id), + title: ko.observable(todo.title), + completed: ko.observable(todo.completed), + editing: ko.observable(false) + }; + + // Subscribe to changes on completed and update server + obs.completed.subscribe(function () { + rest.put(window.location.pathname + "api/todo/" + obs.id(), TodoUtil.fromObservable(obs)) + .fail(function (err) { + console.log(err.statusText); + }); + }); + + return obs; + }, + + // Map observable to todo object + fromObservable: function (obs) { + var todo = { + title: obs.title(), + completed: obs.completed() + }; + if (obs.id()) { + todo.id = obs.id(); + } + return todo; + } +}; + +module.exports = TodoUtil; \ No newline at end of file diff --git a/examples/todo-app/frontend/webpack.config.js b/examples/todo-app/frontend/webpack.config.js new file mode 100644 index 000000000..851ef2c66 --- /dev/null +++ b/examples/todo-app/frontend/webpack.config.js @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* global __dirname, Infinity */ + +const global = require('./src/main/webapp/js/global.js'); +const path = require('path'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); + +function resolve (dir) { + return path.join(__dirname, dir); +} + +module.exports = { + entry: './src/main/webapp/js/main.js', + output: { + path: resolve('/target/classes/WEB/'), + filename: 'js/[name].[chunkhash].js', + chunkFilename: 'js/[id].[chunkhash].js' + }, + module: { + rules: [ + { + test: /\.html$/, + loader: 'html-loader' + }, + { + test: /\.css$/, + use: ExtractTextPlugin.extract({ + use: [{loader: 'css-loader', options: {sourceMap: false}}] + }) + } + ] + }, + resolve: { + alias: { + 'jquery': resolve('node_modules/jquery/dist/jquery.js'), + 'knockout': resolve('node_modules/knockout/build/output/knockout-latest.js'), + 'todomvc-common': resolve('node_modules/todomvc-common/base.js'), + 'todomvc-common-css': resolve('node_modules/todomvc-common/base.css'), + 'todomvc-app-css': resolve('node_modules/todomvc-app-css/index.css'), + '@': resolve('src/main/webapp/js') + }, + extensions: ['.js', '.css'] // File types + }, + plugins: [ + new ExtractTextPlugin({ + filename: 'css/[name].[contenthash].css', + allChunks: true + }), + new OptimizeCSSPlugin({ + cssProcessorOptions: {safe: true, map: {inline: false}} + }), + new UglifyJsPlugin({ + uglifyOptions: { compress: { warnings: false } }, + sourceMap: true, + parallel: true + }), + new HtmlWebpackPlugin({ + filename: resolve('target/classes/WEB/index.html'), + template: 'src/main/webapp/index.html', + 'meta': { + 'google-signin-client_id': global.GOOGLE_SIGN_IN_CLIENT_ID + }, + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + }, + chunksSortMode: 'dependency' + }), + new webpack.HashedModuleIdsPlugin(), + new webpack.optimize.ModuleConcatenationPlugin(), + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks(module) { + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, './node_modules') + ) === 0 + ); + } + }), + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }) + ] +}; diff --git a/examples/todo-app/k8s/k8s-deployment.yml b/examples/todo-app/k8s/k8s-deployment.yml deleted file mode 100644 index 572cd0b52..000000000 --- a/examples/todo-app/k8s/k8s-deployment.yml +++ /dev/null @@ -1,200 +0,0 @@ -# -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -kind: ConfigMap -apiVersion: v1 -metadata: - name: helidon-todos-frontend-config - namespace: default -data: - env: k8s - services: |- - zipkin.host: zipkin - backend.endpoint: http://helidon-todos-backend:8854 - ---- - -kind: ConfigMap -apiVersion: v1 -metadata: - name: helidon-todos-backend-config - namespace: default -data: - env: k8s - services: |- - zipkin.host: zipkin - jana: |- - servers: - - host: helidon-todos-cassandra - port: 9042 - ---- - -kind: Service -apiVersion: v1 -metadata: - name: zipkin -spec: - type: NodePort - selector: - app: zipkin - ports: - - protocol: TCP - port: 9411 - targetPort: 9411 - nodePort: 30011 - - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: zipkin-deployment -spec: - replicas: 1 - template: - metadata: - labels: - app: zipkin - spec: - containers: - - name: zipkin-container - image: openzipkin/zipkin - imagePullPolicy: Never - ports: - - containerPort: 9411 - - ---- - -kind: Service -apiVersion: v1 -metadata: - name: helidon-todos-cassandra -spec: - type: NodePort - selector: - app: helidon-todos-cassandra - ports: - - protocol: TCP - port: 9042 - targetPort: 9042 - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: helidon-todos-cassandra-deployment -spec: - replicas: 1 - template: - metadata: - labels: - app: helidon-todos-cassandra - spec: - containers: - - name: helidon-todos-cassandra-container - image: helidon.demos/io/helidon/demo/helidon-todos-cassandra - imagePullPolicy: Never - ports: - - containerPort: 9042 - ---- - -kind: Service -apiVersion: v1 -metadata: - name: helidon-todos-backend -spec: - type: NodePort - selector: - app: helidon-todos-backend - ports: - - protocol: TCP - port: 8854 - targetPort: 8854 - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: helidon-todos-backend-deployment -spec: - replicas: 1 - template: - metadata: - labels: - app: helidon-todos-backend - spec: - containers: - - name: helidon-todos-backend-container - image: helidon.demos/io/helidon/demo/helidon-todos-backend - imagePullPolicy: Never - ports: - - containerPort: 8854 - volumeMounts: - - name: config-volume - mountPath: /conf - volumes: - - name: config-volume - configMap: - name: helidon-todos-backend-config - ---- - -kind: Service -apiVersion: v1 -metadata: - name: helidon-todos-frontend -spec: - type: NodePort - selector: - app: helidon-todos-frontend - ports: - - protocol: TCP - port: 8080 - targetPort: 8080 - nodePort: 30080 - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: helidon-todos-frontend-deployment -spec: - replicas: 1 - template: - metadata: - labels: - app: helidon-todos-frontend - spec: - containers: - - name: helidon-todos-frontend-container - image: helidon.demos/io/helidon/demo/helidon-todos-frontend - imagePullPolicy: Never - ports: - - containerPort: 8080 - volumeMounts: - - name: config-volume - mountPath: /conf - volumes: - - name: config-volume - configMap: - name: helidon-todos-frontend-config diff --git a/examples/todo-app/pom.xml b/examples/todo-app/pom.xml index 6618f353d..9acca7f72 100644 --- a/examples/todo-app/pom.xml +++ b/examples/todo-app/pom.xml @@ -26,232 +26,14 @@ example-todo-app-project pom 1.2.2-SNAPSHOT - Helidon Examples ToDo Demo + Helidon Examples TODO Demo - ToDo demo application + TODO demo application - demo-frontend - demo-backend + frontend + backend - - - 8 - UTF-8 - UTF-8 - - libs - ${project.build.directory}/${libs.classpath.prefix} - - ${project.version} - - 3.4.0 - 2.29 - 2.9.5 - 16.0.1 - - 5.1.0 - 1.3 - 2.15.0 - - ${docker.registry}/io/helidon/demo/${project.artifactId} - helidon-docker-registry - helidon.demos - https://${docker.registry}/ - ${project.version} - - etc/checkstyle.xml - - 2.0.1 - - - - - - org.glassfish.jersey - jersey-bom - ${version.lib.jersey} - pom - import - - - io.helidon - helidon-bom - ${version.lib.helidon} - pom - import - - - com.fasterxml.jackson.core - jackson-core - ${version.lib.jackson} - - - com.datastax.cassandra - cassandra-driver-core - ${version.lib.cassandra} - - - - com.google.guava - guava - ${version.lib.guava} - - - org.junit.jupiter - junit-jupiter-api - ${version.lib.junit} - - - org.hamcrest - hamcrest-all - ${version.lib.hamcrest} - - - org.mockito - mockito-core - ${version.lib.mockito} - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - - org.apache.maven.plugins - maven-resources-plugin - 2.7 - - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - com.spotify - docker-maven-plugin - 0.4.11 - - - - - - - com.spotify - docker-maven-plugin - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory} - true - - ${docker.image.version} - latest - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - - - - org.codehaus.mojo - exec-maven-plugin - - java - true - - -Djava.util.logging.config.file=src/main/resources/logging.properties - -classpath - - ${mainClass} - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - - ${copied.libs.dir} - false - false - true - true - runtime - test - - - - - - maven-resources-plugin - - - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory} - - - src/main/docker - true - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ${libs.classpath.prefix} - ${mainClass} - - - - - - com.github.eirslett - frontend-maven-plugin - 1.6 - - v8.11.1 - 5.6.0 - - - - diff --git a/examples/translator-app/README.md b/examples/translator-app/README.md new file mode 100644 index 000000000..f5fcfb21d --- /dev/null +++ b/examples/translator-app/README.md @@ -0,0 +1,84 @@ +# Translator Example Application + +This application demonstrates a pseudo application composed of two microservices + implemented with Helidon SE. + +## Start Zipkin + +With Docker: +```bash +docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin +``` + +With Java 8+: +```bash +curl -sSL https://zipkin.io/quickstart.sh | bash -s +java -jar zipkin.jar +``` + +With Kubernetes: +```bash +kubectl apply -f ../k8s/ingress.yaml -f ../k8s/zipkin.yaml +``` + +## Build and run + +With Docker: +```bash +docker build -t helidon-examples-translator-backend backend/ +docker build -t helidon-examples--translator-frontend frontend/ +docker run --rm -d -p 9080:9080 \ + --link zipkin \ + --name helidon-examples-translator-backend \ + helidon-examples-translator-backend:latest +docker run --rm -d -p 8080:8080 \ + --link zipkin \ + --link helidon-examples-translator-backend \ + --name helidon-examples-translator-frontend \ + helidon-examples-translator-frontend:latest +``` + +With Java 8+: +```bash +mvn package +java -jar backend/target/helidon-examples-translator-backend.jar & +java -jar frontend/target/helidon-examples-translator-frontend.jar +``` + +Try the endpoint: +```bash +curl "http://localhost:8080?q=cloud&lang=czech" +curl "http://localhost:8080?q=cloud&lang=french" +curl "http://localhost:8080?q=cloud&lang=italian" +``` + +Then check out the traces at http://localhost:9411. + +## Run with Kubernetes (docker for desktop) + +```bash +docker build -t helidon-examples-translator-backend backend/ +docker build -t helidon-examples-translator-frontend frontend/ +kubectl apply -f backend/app.yaml -f frontend/app.yaml +``` + +Try the endpoint: +```bash +curl "http://localhost/translator?q=cloud&lang=czech" +curl "http://localhost/translator?q=cloud&lang=french" +curl "http://localhost/translator?q=cloud&lang=italian" +``` + +Then check out the traces at http://localhost/zipkin. + +Stop the docker containers: +```bash +docker stop zipkin \ + helidon-examples-translator-backend \ + helidon-examples-translator-frontend +``` + +Delete the Kubernetes resources: +```bash +kubectl delete -f backend/app.yaml -f frontend/app.yaml +``` \ No newline at end of file diff --git a/examples/translator-app/backend/Dockerfile b/examples/translator-app/backend/Dockerfile new file mode 100644 index 000000000..f10b94e45 --- /dev/null +++ b/examples/translator-app/backend/Dockerfile @@ -0,0 +1,47 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests + +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-translator-backend.jar ./ +COPY --from=build /helidon/target/libs ./libs + +ENV tracing.host="zipkin" + +CMD ["java", "-jar", "helidon-examples-translator-backend.jar"] + +EXPOSE 9080 \ No newline at end of file diff --git a/examples/translator-app/backend/app.yaml b/examples/translator-app/backend/app.yaml new file mode 100644 index 000000000..33be877c8 --- /dev/null +++ b/examples/translator-app/backend/app.yaml @@ -0,0 +1,55 @@ +# +# Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: helidon-examples-translator-backend + labels: + app: helidon-examples-translator-backend +spec: + replicas: 1 + template: + metadata: + labels: + app: helidon-examples-translator-backend + spec: + containers: + - image: helidon-examples-translator-backend:latest + imagePullPolicy: IfNotPresent + name: helidon-examples-translator-backend + ports: + - containerPort: 9080 + env: + - name: tracing.host + value: "zipkin" + restartPolicy: Always +--- + +apiVersion: v1 +kind: Service +metadata: + name: helidon-examples-translator-backend + labels: + app: helidon-examples-translator-backend +spec: + type: ClusterIP + selector: + app: helidon-examples-translator-backend + ports: + - port: 9080 + targetPort: 9080 + name: http diff --git a/examples/translator-app/backend/pom.xml b/examples/translator-app/backend/pom.xml new file mode 100644 index 000000000..dba011f15 --- /dev/null +++ b/examples/translator-app/backend/pom.xml @@ -0,0 +1,71 @@ + + + + + 4.0.0 + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + + io.helidon.examples.translator + helidon-examples-translator-backend + 1.2.2-SNAPSHOT + Helidon Examples Translator Backend + + + A translator backend example app. + + + + io.helidon.examples.translator.backend.Main + + + + + io.helidon.webserver + helidon-webserver + + + io.helidon.tracing + helidon-tracing-zipkin + + + io.helidon.config + helidon-config + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + + diff --git a/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/Main.java b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/Main.java new file mode 100644 index 000000000..afead50f3 --- /dev/null +++ b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/Main.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.examples.translator.backend; + +import java.io.IOException; +import java.util.concurrent.CompletionStage; +import java.util.logging.LogManager; + +import io.helidon.config.Config; +import io.helidon.config.ConfigSources; +import io.helidon.tracing.TracerBuilder; +import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerConfiguration; +import io.helidon.webserver.WebServer; + +/** + * Translator application backend main class. + */ +public class Main { + + private Main() { + } + + /** + * Start the server. + * @return the created {@link WebServer} instance + * @throws IOException if there are problems reading logging properties + */ + public static CompletionStage startBackendServer() throws IOException { + // configure logging in order to not have the standard JVM defaults + LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); + + Config config = Config.builder() + .sources(ConfigSources.environmentVariables()) + .build(); + + WebServer webServer = WebServer.create( + ServerConfiguration.builder() + .port(9080) + .tracer(TracerBuilder.create(config.get("tracing")) + .serviceName("helidon-webserver-translator-backend")), + Routing.builder() + .register(new TranslatorBackendService())); + + return webServer.start() + .thenApply(ws -> { + System.out.println( + "WEB server is up! http://localhost:" + ws.port()); + ws.whenShutdown().thenRun(() + -> System.out.println("WEB server is DOWN. Good bye!")); + return ws; + }).exceptionally(t -> { + System.err.println("Startup failed: " + t.getMessage()); + t.printStackTrace(System.err); + return null; + }); + } + + /** + * The main method of Translator backend. + * + * @param args command-line args, currently ignored. + * @throws Exception in case of an error + */ + public static void main(String[] args) throws Exception { + startBackendServer(); + } +} diff --git a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/TranslatorResource.java b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/TranslatorBackendService.java similarity index 74% rename from examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/TranslatorResource.java rename to examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/TranslatorBackendService.java index 341f2c85b..9e4063750 100644 --- a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/TranslatorResource.java +++ b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/TranslatorBackendService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,30 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package io.helidon.webserver.examples.translator.backend; +package io.helidon.examples.translator.backend; import java.util.HashMap; import java.util.Map; -import java.util.logging.Logger; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import io.helidon.webserver.BadRequestException; +import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerRequest; +import io.helidon.webserver.ServerResponse; +import io.helidon.webserver.Service; /** - * Translator backend resource. + * Translator backend service. */ -@Path("translator") -public class TranslatorResource { - - private static final Logger LOGGER = Logger.getLogger(TranslatorResource.class.getName()); - - private static volatile boolean brokenFlag = false; +public class TranslatorBackendService implements Service { private static final String CZECH = "czech"; private static final String SPANISH = "spanish"; @@ -137,31 +128,17 @@ public class TranslatorResource { TRANSLATED_WORDS_REPOSITORY.put("ten" + SEPARATOR + FRENCH, "dix"); } - /** - * Get method to translate a given query to a given language if possible. - * - * @param query the query to translate - * @param language the target language to translate the query to - * @return the translated text - */ - @GET - @Produces(MediaType.TEXT_PLAIN) - public Response getText(@QueryParam("q") String query, @QueryParam("lang") String language) { - if (Main.isSecurityDisabled()) { - LOGGER.info("[dev-local] Security check is disabled by local development mode."); - LOGGER.info("getText(\"" + query + "\", " + language + ")"); - } else { - // TODO add security -// if (SecurityModule.getUserPrincipal() == null) { -// return Response.status(401).header("WWW-Authenticate", "Bearer realm=\"DefaultRealm\"").build(); -// } -// LOGGER.info("getText(\"" + query + "\", " + language + ") - Principal: " + SecurityModule.getUserPrincipal()); - } + @Override + public void update(Routing.Rules rules) { + rules.get(this::getText); + } - if (TranslatorResource.brokenFlag) { - return Response.serverError().build(); - } + private void getText(ServerRequest request, ServerResponse response) { + String query = request.queryParams().first("q") + .orElseThrow(() -> new BadRequestException("missing query parameter 'q'")); + String language = request.queryParams().first("lang") + .orElseThrow(() -> new BadRequestException("missing query parameter 'lang'")); String translation; switch (language) { case CZECH: @@ -183,55 +160,19 @@ public class TranslatorResource { translation = TRANSLATED_WORDS_REPOSITORY.get(query + SEPARATOR + FRENCH); break; default: - return Response.status(Response.Status.NOT_FOUND) - .entity(String.format( + response.status(404) + .send(String.format( "Language '%s' not in supported. Supported languages: %s, %s, %s, %s.", language, - CZECH, SPANISH, CHINESE, HINDI)) - .build(); + CZECH, SPANISH, CHINESE, HINDI)); + return; } if (translation != null) { - return Response.ok(translation).build(); + response.send(translation); } else { - return Response.status(Response.Status.NOT_FOUND) - .entity(String.format("Word '%s' not in the dictionary", query)) - .build(); + response.status(404) + .send(String.format("Word '%s' not in the dictionary", query)); } } - - /** - * Start delay post method. - */ - @POST - @Path("/break") - public void startDelay() { - setBroken(true); - } - - /** - * Stop delay post method. - */ - @POST - @Path("/fix") - public void stopDelay() { - setBroken(false); - } - - /** - * Marathon health check. - *

- * This should check the health of state/storage service (if present). - * - * @return HTTP 2xx response. - */ - @GET - @Path("health") - public Response health() { - return Response.noContent().build(); - } - - private static void setBroken(boolean broken) { - brokenFlag = broken; - } } diff --git a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/package-info.java b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/package-info.java similarity index 83% rename from examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/package-info.java rename to examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/package-info.java index d81345a8c..3c5c24fef 100644 --- a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/package-info.java +++ b/examples/translator-app/backend/src/main/java/io/helidon/examples/translator/backend/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,4 +17,4 @@ /** * Demo examples Translator Backend package. */ -package io.helidon.webserver.examples.translator.backend; +package io.helidon.examples.translator.backend; diff --git a/examples/webserver/demo-translator-backend/src/main/resources/logging.properties b/examples/translator-app/backend/src/main/resources/logging.properties similarity index 100% rename from examples/webserver/demo-translator-backend/src/main/resources/logging.properties rename to examples/translator-app/backend/src/main/resources/logging.properties diff --git a/examples/translator-app/frontend/Dockerfile b/examples/translator-app/frontend/Dockerfile new file mode 100644 index 000000000..0ba4588cd --- /dev/null +++ b/examples/translator-app/frontend/Dockerfile @@ -0,0 +1,48 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -Dmaven.test.skip + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -Dmaven.test.skip + +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-translator-frontend.jar ./ +COPY --from=build /helidon/target/libs ./libs + +ENV tracing.host="zipkin" +ENV backend.host="helidon-examples-translator-backend" + +CMD ["java", "-jar", "helidon-examples-translator-frontend.jar"] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/translator-app/frontend/app.yaml b/examples/translator-app/frontend/app.yaml new file mode 100644 index 000000000..b24f1639a --- /dev/null +++ b/examples/translator-app/frontend/app.yaml @@ -0,0 +1,74 @@ +# +# Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: helidon-examples-translator-frontend + labels: + app: helidon-examples-translator-frontend +spec: + replicas: 1 + template: + metadata: + labels: + app: helidon-examples-translator-frontend + spec: + containers: + - image: helidon-examples-translator-frontend:latest + imagePullPolicy: IfNotPresent + name: translator-frontend + ports: + - containerPort: 8080 + env: + - name: tracing.host + value: "zipkin" + - name: backend.host + value: "helidon-examples-translator-backend" + restartPolicy: Always +--- + +apiVersion: v1 +kind: Service +metadata: + name: helidon-examples-translator-frontend + labels: + app: helidon-examples-translator-frontend +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + selector: + app: helidon-examples-translator-frontend + sessionAffinity: None + +--- + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: helidon-examples-translator-frontend +spec: + rules: + - host: localhost + http: + paths: + - path: /translator + backend: + serviceName: helidon-examples-translator-frontend + servicePort: 8080 \ No newline at end of file diff --git a/examples/translator-app/frontend/pom.xml b/examples/translator-app/frontend/pom.xml new file mode 100644 index 000000000..ceb0ce804 --- /dev/null +++ b/examples/translator-app/frontend/pom.xml @@ -0,0 +1,108 @@ + + + + + 4.0.0 + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + + io.helidon.examples.translator + helidon-examples-translator-frontend + 1.2.2-SNAPSHOT + Helidon Examples Translator Frontend + + + A translator frontend example app. + + + + io.helidon.examples.translator.frontend.Main + + + + + io.helidon.webserver + helidon-webserver + + + io.helidon.config + helidon-config + + + io.helidon.tracing + helidon-tracing-jersey-client + + + io.helidon.tracing + helidon-tracing-zipkin + + + io.helidon.common + helidon-common + + + org.junit.jupiter + junit-jupiter-api + test + + + org.hamcrest + hamcrest-all + test + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + + + + + add-backend-dependency + + + !maven.test.skip + + + + + io.helidon.examples.translator + helidon-examples-translator-backend + ${project.version} + test + + + + + diff --git a/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/Main.java b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/Main.java new file mode 100644 index 000000000..6723515b3 --- /dev/null +++ b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/Main.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.examples.translator.frontend; + +import java.io.IOException; +import java.util.concurrent.CompletionStage; +import java.util.logging.LogManager; + +import io.helidon.config.Config; +import io.helidon.config.ConfigSources; +import io.helidon.tracing.TracerBuilder; +import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerConfiguration; +import io.helidon.webserver.WebServer; + +/** + * Translator application frontend main class. + */ +public class Main { + + private Main() { + } + + /** + * Start the server. + * @return the created {@link WebServer} instance + * @throws IOException if there are problems reading logging properties + */ + public static CompletionStage startFrontendServer() throws IOException { + // configure logging in order to not have the standard JVM defaults + LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); + + Config config = Config.builder() + .sources(ConfigSources.environmentVariables()) + .build(); + + WebServer webServer = WebServer.create( + ServerConfiguration.builder() + .port(8080) + .tracer(TracerBuilder.create(config.get("tracing")) + .serviceName("helidon-webserver-translator-frontend") + .registerGlobal(false)), + Routing.builder() + .register(new TranslatorFrontendService( + config.get("backend.host").asString().orElse("localhost"), + 9080))); + + return webServer.start() + .thenApply(ws -> { + System.out.println( + "WEB server is up! http://localhost:" + ws.port()); + ws.whenShutdown().thenRun(() + -> System.out.println("WEB server is DOWN. Good bye!")); + return ws; + }).exceptionally(t -> { + System.err.println("Startup failed: " + t.getMessage()); + t.printStackTrace(System.err); + return null; + }); + } + + /** + * The main method of Translator frontend. + * + * @param args command-line args, currently ignored. + * @throws Exception in case of an error + */ + public static void main(String[] args) throws Exception { + startFrontendServer(); + } +} diff --git a/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/TranslatorFrontendService.java b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/TranslatorFrontendService.java new file mode 100644 index 000000000..d943652e3 --- /dev/null +++ b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/TranslatorFrontendService.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.helidon.examples.translator.frontend; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import io.helidon.tracing.jersey.client.ClientTracingFilter; +import io.helidon.webserver.BadRequestException; +import io.helidon.webserver.Routing; +import io.helidon.webserver.ServerRequest; +import io.helidon.webserver.ServerResponse; +import io.helidon.webserver.Service; + +/** + * Translator frontend resource. + */ +public final class TranslatorFrontendService implements Service { + + private static final Logger LOGGER = Logger.getLogger(TranslatorFrontendService.class.getName()); + private final WebTarget backendTarget; + + TranslatorFrontendService(String backendHostname, int backendPort) { + backendTarget = ClientBuilder.newClient() + .target("http://" + backendHostname + ":" + backendPort); + } + + @Override + public void update(Routing.Rules rules) { + rules.get(this::getText); + } + + private void getText(ServerRequest request, ServerResponse response) { + try { + String query = request.queryParams().first("q") + .orElseThrow(() -> new BadRequestException("missing query parameter 'q'")); + String language = request.queryParams().first("lang") + .orElseThrow(() -> new BadRequestException("missing query parameter 'lang'")); + + Response backendResponse = backendTarget + .property(ClientTracingFilter.TRACER_PROPERTY_NAME, request.tracer()) + .property(ClientTracingFilter.CURRENT_SPAN_CONTEXT_PROPERTY_NAME, request.spanContext()) + .queryParam("q", query) + .queryParam("lang", language) + .request().get(); + + final String result; + if (backendResponse.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL) { + result = backendResponse.readEntity(String.class); + } else { + result = "Error: " + backendResponse.readEntity(String.class); + } + response.send(result + "\n"); + } catch (ProcessingException pe) { + LOGGER.log(Level.WARNING, "Problem to call translator frontend.", pe); + response.status(503).send("Translator backend service isn't available."); + } + } +} diff --git a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/package-info.java b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/package-info.java similarity index 83% rename from examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/package-info.java rename to examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/package-info.java index e79b9ec12..93687d50c 100644 --- a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/package-info.java +++ b/examples/translator-app/frontend/src/main/java/io/helidon/examples/translator/frontend/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,4 +17,4 @@ /** * Demo examples Translator Frontend package. */ -package io.helidon.webserver.examples.translator.frontend; +package io.helidon.examples.translator.frontend; diff --git a/examples/webserver/demo-translator-frontend/src/main/resources/logging.properties b/examples/translator-app/frontend/src/main/resources/logging.properties similarity index 100% rename from examples/webserver/demo-translator-frontend/src/main/resources/logging.properties rename to examples/translator-app/frontend/src/main/resources/logging.properties diff --git a/examples/webserver/demo-translator-frontend/src/test/java/io/helidon/webserver/examples/translator/TranslatorTest.java b/examples/translator-app/frontend/src/test/java/io/helidon/examples/translator/TranslatorTest.java similarity index 54% rename from examples/webserver/demo-translator-frontend/src/test/java/io/helidon/webserver/examples/translator/TranslatorTest.java rename to examples/translator-app/frontend/src/test/java/io/helidon/examples/translator/TranslatorTest.java index 17c558e5e..5b07dce6f 100644 --- a/examples/webserver/demo-translator-frontend/src/test/java/io/helidon/webserver/examples/translator/TranslatorTest.java +++ b/examples/translator-app/frontend/src/test/java/io/helidon/examples/translator/TranslatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,8 @@ * limitations under the License. */ -package io.helidon.webserver.examples.translator; +package io.helidon.examples.translator; -import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; import javax.ws.rs.client.Client; @@ -30,13 +29,11 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import static io.helidon.webserver.examples.translator.backend.Main.createBackendWebServer; -import static io.helidon.webserver.examples.translator.frontend.Main.createFrontendWebServer; +import static io.helidon.examples.translator.backend.Main.startBackendServer; +import static io.helidon.examples.translator.frontend.Main.startFrontendServer; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.AllOf.allOf; -import static org.hamcrest.core.StringContains.containsString; - /** * The TranslatorTest. */ @@ -49,14 +46,8 @@ public class TranslatorTest { @BeforeAll public static void setUp() throws Exception { - CompletionStage backendStage = - createBackendWebServer(null).start(); - webServerBackend = backendStage.toCompletableFuture().get(10, TimeUnit.SECONDS); - - CompletionStage frontendStage = - createFrontendWebServer(null, "localhost", webServerBackend.port()).start(); - webServerFrontend = frontendStage.toCompletableFuture().get(10, TimeUnit.SECONDS); - + webServerBackend = startBackendServer().toCompletableFuture().get(10, TimeUnit.SECONDS); + webServerFrontend = startFrontendServer().toCompletableFuture().get(10, TimeUnit.SECONDS); client = ClientBuilder.newClient(); target = client.target("http://localhost:" + webServerFrontend.port()); } @@ -65,23 +56,41 @@ public class TranslatorTest { public static void tearDown() throws Exception { webServerFrontend.shutdown().toCompletableFuture().get(10, TimeUnit.SECONDS); webServerBackend.shutdown().toCompletableFuture().get(10, TimeUnit.SECONDS); - if (client != null) { client.close(); } } @Test - public void e2e() throws Exception { - - Response response = target.path("translator") - .queryParam("q", "cloud") + public void testCzech() throws Exception { + Response response = target.queryParam("q", "cloud") + .queryParam("lang", "czech") .request() .get(); assertThat("Unexpected response! Status code: " + response.getStatus(), - response.readEntity(String.class), - allOf(containsString("oblak"), - containsString("nube"))); + response.readEntity(String.class), is("oblak\n")); + } + + @Test + public void testItalian() throws Exception { + Response response = target.queryParam("q", "cloud") + .queryParam("lang", "italian") + .request() + .get(); + + assertThat("Unexpected response! Status code: " + response.getStatus(), + response.readEntity(String.class), is("nube\n")); + } + + @Test + public void testFrench() throws Exception { + Response response = target.queryParam("q", "cloud") + .queryParam("lang", "french") + .request() + .get(); + + assertThat("Unexpected response! Status code: " + response.getStatus(), + response.readEntity(String.class), is("nuage\n")); } } diff --git a/examples/translator-app/pom.xml b/examples/translator-app/pom.xml new file mode 100644 index 000000000..eda5d4d95 --- /dev/null +++ b/examples/translator-app/pom.xml @@ -0,0 +1,42 @@ + + + + + 4.0.0 + + io.helidon.examples + helidon-examples-project + 1.2.2-SNAPSHOT + + io.helidon.examples.translator + helidon-examples-translator-project + pom + Helidon Examples Translator Demo + + + A translator example app. + + + + backend + frontend + + diff --git a/examples/webserver/README.md b/examples/webserver/README.md index c1bb0d76d..41c29e619 100644 --- a/examples/webserver/README.md +++ b/examples/webserver/README.md @@ -1,4 +1,3 @@ - # Helidon SE WebServer Examples - +This directory contains Helidon SE webserver examples. \ No newline at end of file diff --git a/examples/webserver/basics/README.md b/examples/webserver/basics/README.md index 20708312c..894b86825 100644 --- a/examples/webserver/basics/README.md +++ b/examples/webserver/basics/README.md @@ -6,18 +6,17 @@ at runtime. Each method illustrates a different WebServer concept. See the comments in `Main.java` for a description of the various methods. -## Build +## Build and run -``` +With JDK8+ +```bash mvn package ``` -## Run - To see the list of methods that are available run: -``` -mvn -DexampleName=help exec:java +```bash +java -DexampleName=help -jar target/helidon-examples-webserver-basics.jar ``` You should see output like: @@ -41,8 +40,7 @@ Example method names: You can then choose the method to execute by setting the `exampleName` system property: ``` -mvn -DexampleName=firstRouting exec:java +java -DexampleName=firstRouting -jar target/helidon-examples-webserver-basics.jar ``` This will start the Helidon SE WebServer using the method indicated. - diff --git a/examples/webserver/basics/pom.xml b/examples/webserver/basics/pom.xml index bf4bf0bfd..5f8a9b1c2 100644 --- a/examples/webserver/basics/pom.xml +++ b/examples/webserver/basics/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-basics Helidon WebServer Examples Basics @@ -41,17 +43,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} com.google.guava @@ -70,7 +69,6 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test @@ -79,4 +77,18 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/webserver/comment-aas/README.md b/examples/webserver/comment-aas/README.md new file mode 100644 index 000000000..811f2322f --- /dev/null +++ b/examples/webserver/comment-aas/README.md @@ -0,0 +1,21 @@ +# Comments As a Service + +This application allows users to add or read short comments related to a single topic. + Topic can be anything including blog post, newspaper article, and others. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-webserver-comment-aas.jar +``` + +Try the application: + +```bash +curl http://localhost:8080/comments/java -d "I use Helidon!" +curl http://localhost:8080/comments/java -d "I use vertx" +curl http://localhost:8080/comments/java -d "I use spring" +curl http://localhost:8080/comments/java +``` \ No newline at end of file diff --git a/examples/webserver/comment-aas/pom.xml b/examples/webserver/comment-aas/pom.xml index a0aab89a2..264138cb4 100644 --- a/examples/webserver/comment-aas/pom.xml +++ b/examples/webserver/comment-aas/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-comment-aas Helidon WebServer Examples CommentsAAS @@ -39,26 +41,18 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.common helidon-common - ${project.version} - - - io.projectreactor - reactor-core - - - io.helidon.bundles - helidon-bundles-config - ${project.version} io.helidon.config - helidon-config-etcd - ${project.version} + helidon-config + + + io.helidon.config + helidon-config-yaml org.junit.jupiter @@ -73,13 +67,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} - test - - - org.slf4j - slf4j-jdk14 test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/webserver/comment-aas/readme.md b/examples/webserver/comment-aas/readme.md deleted file mode 100644 index 2f51eb10d..000000000 --- a/examples/webserver/comment-aas/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -Comments As a Service -===================== - -The **Web Server** example. - -Users can add or read short comments related to the single topic. Topic can be anything -including blog post, newspaper article, and others. \ No newline at end of file diff --git a/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/CommentsService.java b/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/CommentsService.java index b7dc138bc..379a58552 100644 --- a/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/CommentsService.java +++ b/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/CommentsService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,6 @@ public class CommentsService implements Service { req.content() .as(String.class) .thenAccept(msg -> addComment(msg, userName, topic)) - // Notice the beauty of fluent and reactive response composing... .thenRun(resp::send) .exceptionally(t -> { req.next(t); diff --git a/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/Main.java b/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/Main.java index 6497b2a2a..b6d939a71 100644 --- a/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/Main.java +++ b/examples/webserver/comment-aas/src/main/java/io/helidon/webserver/examples/comments/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,12 @@ package io.helidon.webserver.examples.comments; -import java.net.URI; import java.util.Optional; import java.util.concurrent.CompletionException; import io.helidon.common.OptionalHelper; import io.helidon.common.http.Http; -import io.helidon.common.http.MediaType; import io.helidon.config.Config; -import io.helidon.config.ConfigSources; -import io.helidon.config.etcd.EtcdConfigSourceBuilder; import io.helidon.webserver.HttpException; import io.helidon.webserver.Routing; import io.helidon.webserver.ServerConfiguration; @@ -51,7 +47,7 @@ public final class Main { */ public static void main(String[] args) { // Load configuration - Config config = loadConfig(); + Config config = Config.create(); boolean acceptAnonymousUsers = config.get("anonymous-enabled").asBoolean().orElse(false); ServerConfiguration serverConfig = config.get("webserver").as(ServerConfiguration::create).get(); @@ -59,34 +55,19 @@ public final class Main { WebServer server = WebServer.create(serverConfig, createRouting(acceptAnonymousUsers)); // Start the server and print some info. - server.start().thenAccept(Main::printStartupMessage); + server.start().thenAccept((ws) -> { + System.out.println( + "WEB server is up! http://localhost:" + ws.port() + "/comments"); + }); - // Server uses non-demon threads. It is not needed to block a main thread. Just react! server.whenShutdown() - .thenRun(() -> System.out.println("Comments-As-A-Service is DOWN. Good bye!")) - .thenRun(() -> System.exit(0)); - } - - private static Config loadConfig() { - String etcdUri = Optional.ofNullable(System.getenv("ETCD_URI")) - .orElse("http://localhost:2379"); - - return Config.builder() - .sources(EtcdConfigSourceBuilder.create(URI.create(etcdUri), - "comments-aas-config", - EtcdConfigSourceBuilder.EtcdApi.v2) - .mediaType("application/x-yaml") - .optional() - .build(), - ConfigSources.classpath("application.conf")) - .build(); + .thenRun(() -> System.out.println("WEB server is DOWN. Good bye!")); } static Routing createRouting(boolean acceptAnonymousUsers) { return Routing.builder() // Filter that translates user identity header into the contextual "user" information .any((req, res) -> { - String user = OptionalHelper.from(req.headers().first("user-identity")) .or(() -> acceptAnonymousUsers ? Optional.of("anonymous") : Optional.empty()) .asOptional() @@ -95,21 +76,8 @@ public final class Main { req.context().register("user", user); req.next(); }) - - // Main service logic part is registered as a separated class to "/comments" context root .register("/comments", new CommentsService()) - - - // Shut down logic is registered to "/mgmt/shutdown" path - .post("/mgmt/shutdown", (req, res) -> { - res.headers().contentType(MediaType.TEXT_PLAIN.withCharset("UTF-8")); - res.send("Shutting down 'COMMENTS-As-A-Service' server. Good bye!\n"); - // Use reactive API nature to stop the server AFTER the response was sent. - res.whenSent().thenRun(() -> req.webServer().shutdown()); - }) - - // Error handling for argot expressions. .error(CompletionException.class, (req, res, ex) -> req.next(ex.getCause())) .error(ProfanityException.class, (req, res, ex) -> { @@ -126,14 +94,4 @@ public final class Main { }) .build(); } - - private static void printStartupMessage(WebServer ws) { - String urlBase = "http://localhost:" + ws.port(); - StringBuilder info = new StringBuilder(); - info.append("Comments-As-A-Service for your service! ").append(urlBase).append('\n'); - info.append(" - ").append("Add comment: POST ").append(urlBase).append("/comments/{topic}\n"); - info.append(" - ").append("List comments: GET ").append(urlBase).append("/comments/{topic}\n\n"); - info.append("Shutdown: POST ").append(urlBase).append("/mgmt/shutdown\n\n"); - System.out.println(info); - } } diff --git a/examples/webserver/comment-aas/src/main/resources/application.conf b/examples/webserver/comment-aas/src/main/resources/application.yaml similarity index 87% rename from examples/webserver/comment-aas/src/main/resources/application.conf rename to examples/webserver/comment-aas/src/main/resources/application.yaml index b6b7a78fb..ec8334b64 100644 --- a/examples/webserver/comment-aas/src/main/resources/application.conf +++ b/examples/webserver/comment-aas/src/main/resources/application.yaml @@ -1,5 +1,5 @@ # -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,9 +14,8 @@ # limitations under the License. # -webserver { - port: 8080 -} +webserver: + port: 8080 # If true then anonymous access is enabled. anonymous-enabled: true diff --git a/examples/webserver/comment-aas/src/test/java/io/helidon/webserver/examples/comments/MainTest.java b/examples/webserver/comment-aas/src/test/java/io/helidon/webserver/examples/comments/MainTest.java index 6547acb87..fd9ac7c5e 100644 --- a/examples/webserver/comment-aas/src/test/java/io/helidon/webserver/examples/comments/MainTest.java +++ b/examples/webserver/comment-aas/src/test/java/io/helidon/webserver/examples/comments/MainTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ package io.helidon.webserver.examples.comments; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - import io.helidon.common.http.Http; import io.helidon.common.http.MediaType; import io.helidon.webserver.testsupport.MediaPublisher; @@ -28,28 +25,12 @@ import io.helidon.webserver.testsupport.TestResponse; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests {@link Main} class. */ public class MainTest { - @Test - public void testShutDown() throws Exception { - TestResponse response = TestClient.create(Main.createRouting(true)) - .path("/mgmt/shutdown") - .post(); - - assertEquals(Http.Status.OK_200, response.status()); - - CountDownLatch latch = new CountDownLatch(1); - response.webServer() - .whenShutdown() - .thenRun(latch::countDown); - assertTrue(latch.await(5, TimeUnit.SECONDS)); - } - @Test public void argot() throws Exception { TestResponse response = TestClient.create(Main.createRouting(true)) diff --git a/examples/webserver/demo-translator-backend/README.md b/examples/webserver/demo-translator-backend/README.md deleted file mode 100644 index b379be75f..000000000 --- a/examples/webserver/demo-translator-backend/README.md +++ /dev/null @@ -1,100 +0,0 @@ -Translator Backend Example Application -====================================== - -Running locally ---------------- -Prerequisites: -1. Requirements: JDK9, Maven, Docker (optional) -2. Add following lines to `/etc/hosts` - ``` - 127.0.0.1 zipkin - 127.0.0.1 helidon-webserver-translator-backend - 127.0.0.1 helidon-webserver-translator-frontend - ``` -3. Run Zipkin:
- In Docker: - ``` - docker run -d -p 9411:9411 openzipkin/zipkin - ``` - or with Java 8+: - ``` - curl -sSL https://zipkin.io/quickstart.sh | bash -s - java -jar zipkin.jar - ``` - -Build and run: -``` -mvn clean install -pl examples/demo-translator-backend -mvn exec:java -pl examples/demo-translator-backend -curl "http://helidon-webserver-translator-backend:9080/translator?q=cloud&lang=czech" -``` -Check out the traces at: ```http://zipkin:9411``` - -Aura ----- - -### Deployment -In the parent `examples/` directory, execute: -``` -export KUBECONFIG=/path/to/your/kubeconfig -ls *translator*/**/*.yaml | while read FILE; do kubectl create -f <(istioctl kube-inject -f $FILE) & done -``` -### Accessing -``` - -# Setup port-forwarding -kubectl port-forward $(kubectl get pod -l component=aura-istio-zipkin -o jsonpath='{.items[0].metadata.name}') 9411:9411 & -kubectl port-forward $(kubectl get pod -l component=aura-istio-grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 & -kubectl port-forward $(kubectl get pod -l component=aura-istio-ingress -o jsonpath='{.items[0].metadata.name}') 30080:80 & - -# Call the FE -watch -n 0.1 curl 'http://localhost:30080/translator?q=cloud' - -# Break a random BE pod -watch -n 10 curl 'http://localhost:30080/translator/break' -X POST -# or alternatively break a specific one by execing into a specific pod -kubectl exec -c proxy "$(kubectl get pod -l app=helidon-webserver-translator-backend -o jsonpath='{.items[0].metadata.name}')" -i -t -- /bin/bash -c "watch -n 10 curl 'http://localhost:9080/translator/break' -X POST" - -# Fix a random BE pod -watch -n 10 curl 'http://localhost:30080/translator/fix' -X POST - -# See Grafana -open http://localhost:3000 - -# See Zipkin -open http://localhost:9411 -``` -### Uninstallation -``` -export KUBECONFIG=/path/to/your/kubeconfig -ls *translator*/**/*.yaml | while read FILE; do kubectl delete -f $FILE & done - -``` - -Running in MiniKube -------------------- - -Prerequisites -1. Requirements: JDK9, Docker client, Minikube, Maven -2. Running Minikube and Zipkin: check out instructions at [WebServer Examples OpenTracing](../opentracing/README.md) - -Running Translator Backend app: -``` -eval $(minikube docker-env) - -mvn clean deploy -Dmaven.deploy.skip=true -Drelease.enforce.no-snapshosts.phase=none -P release - -\# without Istio -kubectl create -f examples/demo-translator-backend/k8s/backend.yaml -\# with Istio -kubectl create -f <(istioctl kube-inject -f examples/demo-translator-backend/k8s/backend.yaml) - -curl "$(minikube service helidon-webserver-translator-backend --url)/translator?q=cloud&lang=czech" - -``` - -Check out Zipkin traces: -``` -minikube service zipkin - -``` diff --git a/examples/webserver/demo-translator-backend/k8s/backend.yaml b/examples/webserver/demo-translator-backend/k8s/backend.yaml deleted file mode 100644 index 98337458c..000000000 --- a/examples/webserver/demo-translator-backend/k8s/backend.yaml +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: helidon-webserver-translator-backend-v1 - labels: - app: helidon-webserver-translator-backend -spec: - replicas: 2 - template: - metadata: - labels: - app: helidon-webserver-translator-backend - version: v1 - spec: - containers: - - image: registry.oracledx.com/skeppare/helidon/helidon-webserver-translator-backend:0.1.0-SNAPSHOT - imagePullPolicy: Always - name: helidon-webserver-translator-backend - envFrom: - - configMapRef: - name: aura-env-config - optional: true - imagePullSecrets: - - name: regsecret - restartPolicy: Always - ---- - -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: helidon-webserver-translator-backend-v2 - labels: - app: helidon-webserver-translator-backend -spec: - replicas: 3 - template: - metadata: - labels: - app: helidon-webserver-translator-backend - version: v2 - spec: - containers: - - image: registry.oracledx.com/skeppare/helidon/helidon-webserver-translator-backend:0.1.0-SNAPSHOT - imagePullPolicy: Always - name: helidon-webserver-translator-backend - envFrom: - - configMapRef: - name: aura-env-config - optional: true - imagePullSecrets: - - name: regsecret - restartPolicy: Always - ---- - -apiVersion: v1 -kind: Service -metadata: - name: helidon-webserver-translator-backend - labels: - app: helidon-webserver-translator-backend -spec: - ports: - - name: http - port: 9080 - selector: - app: helidon-webserver-translator-backend - sessionAffinity: None - type: NodePort diff --git a/examples/webserver/demo-translator-backend/pom.xml b/examples/webserver/demo-translator-backend/pom.xml deleted file mode 100644 index 30d10eb43..000000000 --- a/examples/webserver/demo-translator-backend/pom.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - 4.0.0 - - io.helidon.examples.webserver - helidon-examples-webserver-project - 1.2.2-SNAPSHOT - - helidon-examples-webserver-translator-backend - Helidon WebServer Examples Translator Backend - - - A translator backend example app. - - - - io.helidon.webserver.examples.translator.backend.Main - - ${docker.registry}/skeppare/helidon/helidon-webserver-translator-backend:${project.version} - - mic-docker-registry-automation - registry.oracledx.com - https://${docker.registry}/v1/ - - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory}/distribution/container - - - src/main/docker - true - - - - - - - - com.spotify - docker-maven-plugin - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory}/distribution/container - - ${docker.image.version} - latest - - - - / - ${project.build.directory} - ${project.build.finalName}-fat.jar - - - - - - - - - maven-surefire-plugin - - - ${project.build.outputDirectory}/logging.properties - - - - - - - - - - io.helidon.webserver - helidon-webserver - ${project.version} - - - io.helidon.webserver - helidon-webserver-jersey - ${project.version} - - - io.helidon.tracing - helidon-tracing-jersey - ${project.version} - - - io.helidon.tracing - helidon-tracing-zipkin - ${project.version} - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - - - org.mockito - mockito-core - test - - - io.helidon.webserver - helidon-webserver-test-support - ${project.version} - test - - - diff --git a/examples/webserver/demo-translator-backend/src/main/docker/Dockerfile b/examples/webserver/demo-translator-backend/src/main/docker/Dockerfile deleted file mode 100644 index d0934997f..000000000 --- a/examples/webserver/demo-translator-backend/src/main/docker/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -FROM java:9 - -EXPOSE 9080 -COPY ./* / -RUN rm Dockerfile -WORKDIR / -CMD if [ ! -z "$MIC_CONTAINER_MEM_QUOTA" ]; then java -Xmx${MIC_CONTAINER_MEM_QUOTA}m ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; else java ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; fi diff --git a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Application.java b/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Application.java deleted file mode 100644 index a5d0cdab2..000000000 --- a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Application.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.backend; - -import io.helidon.tracing.jersey.TracingFilter; - -import org.glassfish.jersey.server.ResourceConfig; - -/** - * Translator backend JAX-RS Application. - */ -public class Application extends ResourceConfig { - - /** - * Translator Backend application. - */ - public Application() { - packages(TranslatorResource.class.getPackage().getName()); - register(TracingFilter.class); - } -} diff --git a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Main.java b/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Main.java deleted file mode 100644 index 148377e63..000000000 --- a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/Main.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.backend; - -import java.util.Map; -import java.util.TreeMap; -import java.util.logging.LogManager; -import java.util.logging.Logger; - -import io.helidon.tracing.TracerBuilder; -import io.helidon.webserver.Routing; -import io.helidon.webserver.ServerConfiguration; -import io.helidon.webserver.WebServer; -import io.helidon.webserver.jersey.JerseySupport; - -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; - -/** - * Demo Backend Example Application main class. - */ -public class Main { - - private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); - - /** - * (design) HideUtilityClassConstructor: Utility classes should not have a public or default constructor. - */ - private Main() { - } - - /** - * Creates new instance of {@link WebServer} configured for this service. - * - * @param configuration the server configuration - * @return new {@link WebServer} instance. - */ - public static WebServer createBackendWebServer(ServerConfiguration configuration) { - - Routing.Builder router = Routing.builder() - .register(JerseySupport.create(new Application())); - - if (!isSecurityDisabled()) { - // TODO Add security - // builder.addModule(SecurityModule.builder() - // .enforceAuthentication("/translator/*") - // .skipAuthentication("/translator/break") - // .skipAuthentication("/translator/fix") - // .skipAuthentication("/translator/health") - // .build()); - } else { - LOGGER.info("[dev-local] Running without Security module."); - } - return WebServer.create(configuration, router.build()); - } - - /** - * Is the application running in local development mode? - * - * @return {@code true} if the application is running locally. - */ - public static boolean isSecurityDisabled() { - // TODO enable security return System.getenv("MIC_DEV_LOCAL") != null; - return true; - } - - /** - * The main method of Translator backend. - * - * @param args command-line args, currently ignored. - * @throws Exception in case of an error - */ - public static void main(String[] args) throws Exception { - // configure logging in order to not have the standard JVM defaults - LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); - - dumpEnv(); - - long initNanoTime = System.nanoTime(); - - WebServer webServer = createBackendWebServer( - ServerConfiguration.builder() - .port(9080) - .tracer(TracerBuilder.create("helidon-webserver-translator-backend") - .collectorHost(System.getenv().getOrDefault("ODX_AURA_ZIPKIN_ADDRESS", "localhost")) - .buildAndRegister()) - .build()) - .start() - .toCompletableFuture() - .get(10, SECONDS); - - System.out.println("Translator backend started in " + MILLISECONDS - .convert(System.nanoTime() - initNanoTime, NANOSECONDS) + " ms."); - System.out.println("Webserver running at http://localhost:" + webServer.port()); - } - - private static void dumpEnv() { - Map sortedEnvVars = new TreeMap<>(System.getenv()); - - System.out.println("Environment variables:"); - sortedEnvVars.forEach((key, value) -> System.out.println(key + "=" + value)); - System.out.println("---"); - } - -} diff --git a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/StaticFrontPageResource.java b/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/StaticFrontPageResource.java deleted file mode 100644 index 6edae7ad7..000000000 --- a/examples/webserver/demo-translator-backend/src/main/java/io/helidon/webserver/examples/translator/backend/StaticFrontPageResource.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.backend; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -/** - * Static resources JAX-RS Resource. - */ -@Path("/") -public class StaticFrontPageResource { - - /** - * Static page get method. - * - * @return The page. - */ - @GET - @Produces(MediaType.TEXT_HTML) - @SuppressWarnings("checkstyle:methodlength") - public String get() { - - return "\n" - + "\n" - + "\n" - + " \n" - + " \n" - + " \n" - + " Translator Backend Service\n" - + " \n" - + "

\n" - + " Translator Backend Service\n" - + "


\n" - + "\n" - + "

Summary

\n" - + "\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
ResourceMethodDescription
./translatorGET

\n" - + "

\n" - + "\n" - + "

Resources


\n" - + "\n" - + "

./translator

\n" - + "\n" - + "

Methods
\n" - + "\n" - + "
\n" - + "
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
GETgetText()\n" - + "
\n" - + "

request
\n" - + "\n" - + "
\n" - + "
query params
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
qstring
langstring
\n" - + "

\n" - + "
responses
\n" - + "\n" - + "
\n" - + "
status:
\n" - + " 200 - OK\n" - + "
\n" - + "
representations
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
text/plain\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + "\n" - + "\n"; - } -} diff --git a/examples/webserver/demo-translator-frontend/README.md b/examples/webserver/demo-translator-frontend/README.md deleted file mode 100644 index efd0043d1..000000000 --- a/examples/webserver/demo-translator-frontend/README.md +++ /dev/null @@ -1,105 +0,0 @@ -Translator Frontend Example Application -====================================== - -Running locally ---------------- -Prerequisites: -1. Requirements: JDK9, Maven, Docker (optional) -2. Add following lines to `/etc/hosts` - ``` - 127.0.0.1 zipkin - 127.0.0.1 helidon-webserver-translator-backend - 127.0.0.1 helidon-webserver-translator-frontend - ``` -3. Run Zipkin:
- In Docker: - ``` - docker run -d -p 9411:9411 openzipkin/zipkin - ``` - or with Java 8+: - ``` - curl -sSL https://zipkin.io/quickstart.sh | bash -s - java -jar zipkin.jar - ``` - -Build and run: -``` -mvn clean install -pl examples/demo-translator-frontend -mvn exec:java -pl examples/demo-translator-frontend -curl "http://helidon-webserver-translator-frontend:8080/translator?q=cloud" -``` -Check out the traces at: ```http://zipkin:9411``` - - -Aura ----- - -### Deployment -In the parent `examples/` directory, execute: -``` -export KUBECONFIG=/path/to/your/kubeconfig -ls *translator*/**/*.yaml | while read FILE; do kubectl create -f <(istioctl kube-inject -f $FILE) & done -``` -### Accessing -``` - -# Setup port-forwarding -kubectl port-forward $(kubectl get pod -l component=aura-istio-zipkin -o jsonpath='{.items[0].metadata.name}') 9411:9411 & -kubectl port-forward $(kubectl get pod -l component=aura-istio-grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 & -kubectl port-forward $(kubectl get pod -l component=aura-istio-ingress -o jsonpath='{.items[0].metadata.name}') 30080:80 & - -# Call the FE -watch -n 0.1 curl 'http://localhost:30080/translator?q=cloud' - -# Break a random BE pod -watch -n 10 curl 'http://localhost:30080/translator/break' -X POST -# or alternatively break a specific one by execing into a specific pod -kubectl exec -c proxy "$(kubectl get pod -l app=helidon-webserver-translator-backend -o jsonpath='{.items[0].metadata.name}')" -i -t -- /bin/bash -c "watch -n 10 curl 'http://localhost:9080/translator/break' -X POST" - -# Fix a random BE pod -watch -n 10 curl 'http://localhost:30080/translator/fix' -X POST - -# See Grafana -open http://localhost:3000 - -# See Zipkin -open http://localhost:9411 -``` -### Uninstallation -``` -export KUBECONFIG=/path/to/your/kubeconfig -ls *translator*/**/*.yaml | while read FILE; do kubectl delete -f $FILE & done - -``` - -Running in MiniKube -------------------- - -Prerequisites -1. Running Minikube and Zipkin: check out instructions at [WebServer Examples OpenTracing](../opentracing/README.md) - -Running Translator Frontend app -``` -eval $(minikube docker-env) - -mvn clean deploy -Dmaven.deploy.skip=true -Drelease.enforce.no-snapshosts.phase=none -P release - -\# Without Istio -kubectl create -f examples/demo-translator-frontend/k8s/frontend.yaml -\# With Istio -kubectl create -f <(istioctl kube-inject -f examples/demo-translator-frontend/k8s/frontend.yaml) -kubectl create -f examples/demo-translator-frontend/k8s/gateway.yaml - -\# Without Istio -curl "$(minikube service helidon-webserver-translator-frontend --url)/translator?q=cloud" - -\# With Istio -curl "$(minikube service -l istio=ingress --url)/translator?q=cloud" -``` - -Check out Zipkin traces: -``` -minikube service zipkin - -``` - diff --git a/examples/webserver/demo-translator-frontend/k8s/gateway.yaml b/examples/webserver/demo-translator-frontend/k8s/gateway.yaml deleted file mode 100644 index 226e61406..000000000 --- a/examples/webserver/demo-translator-frontend/k8s/gateway.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: helidon-webserver-gateway - annotations: - kubernetes.io/ingress.class: "istio" -spec: - rules: - - http: - paths: - - path: /translator - backend: - serviceName: helidon-webserver-translator-frontend - servicePort: 8080 - - path: /translator/break - backend: - serviceName: helidon-webserver-translator-backend - servicePort: 9080 - - path: /translator/fix - backend: - serviceName: helidon-webserver-translator-backend - servicePort: 9080 diff --git a/examples/webserver/demo-translator-frontend/pom.xml b/examples/webserver/demo-translator-frontend/pom.xml deleted file mode 100644 index 03e150171..000000000 --- a/examples/webserver/demo-translator-frontend/pom.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - 4.0.0 - - io.helidon.examples.webserver - helidon-examples-webserver-project - 1.2.2-SNAPSHOT - - helidon-examples-webserver-translator-frontend - Helidon WebServer Examples Translator Frontend - - - A translator frontend example app. - - - - io.helidon.webserver.examples.translator.frontend.Main - - ${docker.registry}/skeppare/helidon/helidon-webserver-translator-frontend:${project.version} - - mic-docker-registry-automation - registry.oracledx.com - https://${docker.registry}/v1/ - 1.0.0 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory}/distribution/container - - - src/main/docker - true - - - - - - - - com.spotify - docker-maven-plugin - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory}/distribution/container - - ${docker.image.version} - latest - - - - / - ${project.build.directory} - ${project.build.finalName}-fat.jar - - - - - - - - - maven-surefire-plugin - - - ${project.build.outputDirectory}/logging.properties - - - - - - - - - - io.helidon.webserver - helidon-webserver - ${project.version} - - - io.helidon.webserver - helidon-webserver-jersey - ${project.version} - - - io.helidon.tracing - helidon-tracing-jersey - ${project.version} - - - io.helidon.tracing - helidon-tracing-zipkin - ${project.version} - - - io.helidon.common - helidon-common - ${project.version} - - - io.helidon.examples.webserver - helidon-examples-webserver-translator-backend - test - ${project.version} - - - org.junit.jupiter - junit-jupiter-api - test - - - org.hamcrest - hamcrest-all - test - - - org.mockito - mockito-core - test - - - io.helidon.webserver - helidon-webserver-test-support - ${project.version} - test - - - diff --git a/examples/webserver/demo-translator-frontend/src/main/docker/Dockerfile b/examples/webserver/demo-translator-frontend/src/main/docker/Dockerfile deleted file mode 100644 index 6cd9a2799..000000000 --- a/examples/webserver/demo-translator-frontend/src/main/docker/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -FROM java:9 - -EXPOSE 8080 -COPY ./* / -RUN rm Dockerfile -WORKDIR / -CMD if [ ! -z "$MIC_CONTAINER_MEM_QUOTA" ]; then java -Xmx${MIC_CONTAINER_MEM_QUOTA}m ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; else java ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; fi diff --git a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Application.java b/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Application.java deleted file mode 100644 index 106a52bbb..000000000 --- a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Application.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.frontend; - -import io.helidon.tracing.jersey.TracingFilter; - -import org.glassfish.hk2.utilities.binding.AbstractBinder; -import org.glassfish.jersey.server.ResourceConfig; - -/** - * Translator frontend JAX-RS Application. - */ -public class Application extends ResourceConfig { - - - /** - * Translator Frontend application. - * - * @param backendHostname the translator backend hostname - * @param backendPort the translator backend port - */ - public Application(String backendHostname, int backendPort) { - register(new AbstractBinder() { - @Override - protected void configure() { - bind(backendPort).to(Integer.class).named(TranslatorResource.BACKEND_PORT); - bind(backendHostname).to(String.class).named(TranslatorResource.BACKEND_HOSTNAME); - - } - }); - register(TracingFilter.class); - packages(TranslatorResource.class.getPackage().getName()); - } -} diff --git a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Main.java b/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Main.java deleted file mode 100644 index d0eed3884..000000000 --- a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/Main.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.frontend; - -import java.util.Map; -import java.util.TreeMap; -import java.util.logging.LogManager; -import java.util.logging.Logger; - -import io.helidon.tracing.TracerBuilder; -import io.helidon.webserver.Routing; -import io.helidon.webserver.ServerConfiguration; -import io.helidon.webserver.WebServer; -import io.helidon.webserver.jersey.JerseySupport; - -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; - -/** - * Demo Frontend Example Application main class. - */ -public class Main { - - private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); - - /** - * (design) HideUtilityClassConstructor: Utility classes should not have a public or default constructor. - */ - private Main() { - } - - /** - * Creates new instance of {@link WebServer} configured for this service. - * - * @param configuration the server configuration - * @param backendHostname the translator backend hostname - * @param backendPort the translator backend port - * @return new {@link WebServer} instance. - */ - public static WebServer createFrontendWebServer(ServerConfiguration configuration, String backendHostname, int backendPort) { - - Routing.Builder router = Routing.builder() - .register(JerseySupport.create(new Application(backendHostname, backendPort))); - - if (!isSecurityDisabled()) { - // TODO Add security - // builder.addModule(SecurityModule.builder().build()); - } else { - LOGGER.info("[dev-local] Running without Security module."); - } - return WebServer.create(configuration, router.build()); - } - - /** - * Is the application running in local development mode? - * - * @return {@code true} if the application is running locally. - */ - public static boolean isSecurityDisabled() { - // TODO add security return System.getenv("MIC_DEV_LOCAL") != null; - return true; - } - - /** - * The main method of Translator frontend. - * - * @param args command-line args, currently ignored. - * @throws Exception in case of an error - */ - public static void main(String[] args) throws Exception { - // configure logging in order to not have the standard JVM defaults - LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); - - dumpEnv(); - - long initNanoTime = System.nanoTime(); - - WebServer webServer = createFrontendWebServer( - ServerConfiguration.builder() - .port(8080) - .tracer(TracerBuilder.create("helidon-webserver-translator-frontend") - .collectorHost(System.getenv().getOrDefault("ODX_AURA_ZIPKIN_ADDRESS", "localhost")) - .buildAndRegister()) - .build(), - "helidon-webserver-translator-backend", - 9080) - .start() - .toCompletableFuture() - .get(10, SECONDS); - - System.out.println("Translator frontend started in " + MILLISECONDS - .convert(System.nanoTime() - initNanoTime, NANOSECONDS) + " ms."); - System.out.println("Webserver running at http://localhost:" + webServer.port()); - } - - private static void dumpEnv() { - Map sortedEnvVars = new TreeMap<>(System.getenv()); - - System.out.println("Environment variables:"); - sortedEnvVars.forEach((key, value) -> System.out.println(key + "=" + value)); - System.out.println("---"); - } - -} diff --git a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/StaticFrontPageResource.java b/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/StaticFrontPageResource.java deleted file mode 100644 index fc690cdb0..000000000 --- a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/StaticFrontPageResource.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.frontend; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -/** - * Static resources JAX-RS Resource. - */ -@Path("/") -public class StaticFrontPageResource { - - /** - * Static page get method. - * - * @return The page. - */ - @GET - @Produces(MediaType.TEXT_HTML) - @SuppressWarnings("checkstyle:methodlength") - public String get() { - - return "\n" - + "\n" - + "\n" - + " \n" - + " \n" - + " \n" - + " Translator Frontend Service\n" - + " \n" - + "

\n" - + " Translator Frontend Service\n" - + "


\n" - + "\n" - + "

Summary

\n" - + "\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
ResourceMethodDescription
./translatorGET
POST



\n" - + "

\n" - + "\n" - + "

Resources


\n" - + "\n" - + "

./translator

\n" - + "\n" - + "

Methods
\n" - + "\n" - + "
\n" - + "
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
GETgetText()\n" - + "
\n" - + "

request
\n" - + "\n" - + "
\n" - + "
query params
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
qstring
\n" - + "

\n" - + "
responses
\n" - + "\n" - + "
\n" - + "
status:
\n" - + " 200 - OK\n" - + "
\n" - + "
representations
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
text/plain\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
POSTpost()\n" - + "
\n" - + "

request
\n" - + "\n" - + "
\n" - + " unspecified\n" - + "
\n" - + "
responses
\n" - + "\n" - + "
\n" - + "
status:
\n" - + " 200 - OK\n" - + "
\n" - + "
representations
\n" - + " \n" - + " \n" - + " \n" - + " \n" - + "
text/plain\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + "
\n" - + "\n" - + "\n"; - } -} diff --git a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/TranslatorResource.java b/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/TranslatorResource.java deleted file mode 100644 index dc97ebff8..000000000 --- a/examples/webserver/demo-translator-frontend/src/main/java/io/helidon/webserver/examples/translator/frontend/TranslatorResource.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.webserver.examples.translator.frontend; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import io.helidon.common.CollectionsHelper; -import io.helidon.tracing.jersey.client.ClientTracingFilter; -import io.helidon.webserver.ServerRequest; - -import io.opentracing.Tracer; -import org.glassfish.jersey.server.Uri; - -/** - * Translator frontend resource. - */ -@Path("translator") -public class TranslatorResource { - - private static final Logger LOGGER = Logger.getLogger(TranslatorResource.class.getName()); - - private static final String TRANSLATOR_VERSION = "TRANSLATOR_VERSION"; - private static final String TRANSLATOR_BACKEND = "http://{backend-hostname}:{backend-port}"; - - /** The backend port named injection qualifier. */ - public static final String BACKEND_PORT = "backend-port"; - /** The backend hostname named injection qualifier. */ - public static final String BACKEND_HOSTNAME = "backend-hostname"; - - private List languages = CollectionsHelper.listOf("czech", "spanish", "chinese", "hindi"); - - private List languagesV2 = CollectionsHelper.listOf("italian", "french"); - - @Inject - private ServerRequest request; - - @Inject @Named(BACKEND_PORT) - private Integer backendPort; - - @Inject @Named(BACKEND_HOSTNAME) - private String backendHostname; - - /** - * Get the translated text as a html page. - * - * @param query the text to translate - * @param translator the backend translator to use - * @return a page with the translated text - */ - @GET - @Produces(MediaType.TEXT_HTML) - public String getHtml(@QueryParam("q") String query, - @Uri(TRANSLATOR_BACKEND) WebTarget translator) { - return "\n" - + "\n" - + "\n" - + " \n" - + " Translator Frontend\n" - + "\n" - + "\n" - + "\n" - + "

Translator Frontend

\n" - + getText(query, translator).replace("\n", "
") - + "\n" - + "\n"; - } - - /** - * Get method to translate a given query. - * - * @param query the query to translate - * @param translator the backend translator to use - * @return the translated text - */ - @GET - @Produces(MediaType.TEXT_PLAIN) - public String getText(@QueryParam("q") String query, - @Uri(TRANSLATOR_BACKEND) WebTarget translator) { - try { - translator = translator.resolveTemplate("backend-port", backendPort) - .resolveTemplate("backend-hostname", backendHostname) - .property(ClientTracingFilter.TRACER_PROPERTY_NAME, tracer(request)) - .property(ClientTracingFilter.CURRENT_SPAN_CONTEXT_PROPERTY_NAME, request.spanContext()) - .path("translator").queryParam("q", query); - final StringBuilder sb = new StringBuilder(); - - // Add languages for version 2 - final String version = System.getenv(TRANSLATOR_VERSION); - if ("2".equals(version)) { - languages.addAll(languagesV2); - } - - for (String language : languages) { - final WebTarget lang = translator.queryParam("lang", language); - LOGGER.info("GET " + lang.getUri()); - - translate(lang, sb); - } - - return sb.toString(); - } catch (ProcessingException pe) { - LOGGER.log(Level.WARNING, "Problem to call translator frontend.", pe); - return "Translator backend service isn't available."; - } catch (Exception e) { - final StringWriter stringWriter = new StringWriter(); - e.printStackTrace(new PrintWriter(stringWriter)); - - return stringWriter.toString(); - } - } - - private Tracer tracer(ServerRequest request) { - return request.tracer(); - } - - private void translate(final WebTarget backend, final StringBuilder sb) { - if (Main.isSecurityDisabled()) { - LOGGER.info("[dev-local] Backend is called without security."); - translateImpl(backend, sb); - } else { - // TODO add security - //SecurityModule.runAsSystem(() -> translateImpl(backend, sb)); - } - } - - private void translateImpl(final WebTarget backend, final StringBuilder sb) { - Response response = backend.request().get(); - final String result; - if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL) { - result = response.readEntity(String.class); - } else { - result = "Error: " + response.readEntity(String.class); - } - sb.append(result).append('\n'); - } - - /** - * An example of a post method that simply sleeps. - * - * @return {@code post!} string - */ - @POST - @Produces(MediaType.TEXT_PLAIN) - public String post() { - try { - Thread.sleep(10); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "post!"; - } - - /** - * Marathon health check. - *

- * This should check the health of state/storage service (if present). - * - * @return HTTP 2xx response. - */ - @GET - @Path("health") - public Response health() { - return Response.noContent().build(); - } -} diff --git a/examples/webserver/jersey/README.md b/examples/webserver/jersey/README.md index 48ff385f0..ebe45b3d3 100644 --- a/examples/webserver/jersey/README.md +++ b/examples/webserver/jersey/README.md @@ -1,21 +1,19 @@ -WebServer Jersey Application Example -===================== +# WebServer Jersey Application Example An example of **Jersey** integration into the **Web Server**. This is just a simple Hello World example. A user can start the application using the `WebServerJerseyMain` class and `GET` the `Hello World!` response by accessing `http://localhost:8080/jersey/hello`. -Running the example -------------------- +## Build and run -Running this example requires - * To have checked out the Java sources of this Maven module locally - * JDK 9 - * Maven 3 - * CURL +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-webserver-jersey.jar +``` -Execute from this directory (where this `README.md` file is located): - - mvn exec:java -pl examples/jersey - curl http://localhost:8080/jersey/hello +Make an HTTP request to application: +```bash +curl http://localhost:8080/jersey/hello +``` \ No newline at end of file diff --git a/examples/webserver/jersey/pom.xml b/examples/webserver/jersey/pom.xml index 4b44ba455..fdac69984 100644 --- a/examples/webserver/jersey/pom.xml +++ b/examples/webserver/jersey/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-jersey Helidon WebServer Examples Jersey @@ -34,19 +36,17 @@ - io.helidon.webserver.examples.jersey.WebServerJerseyMain + io.helidon.webserver.examples.jersey.Main io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} org.junit.jupiter @@ -61,23 +61,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test - - - - maven-surefire-plugin - - - ${project.build.outputDirectory}/logging.properties - - - - - + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + diff --git a/examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/WebServerJerseyMain.java b/examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/Main.java similarity index 91% rename from examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/WebServerJerseyMain.java rename to examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/Main.java index 545c816b3..d77ed04cd 100644 --- a/examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/WebServerJerseyMain.java +++ b/examples/webserver/jersey/src/main/java/io/helidon/webserver/examples/jersey/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,9 +33,9 @@ import org.glassfish.jersey.server.ResourceConfig; * @see #main(String[]) * @see #startServer(ServerConfiguration) */ -public final class WebServerJerseyMain { +public final class Main { - private WebServerJerseyMain() { + private Main() { } /** @@ -46,7 +46,7 @@ public final class WebServerJerseyMain { */ public static void main(String[] args) throws IOException { // configure logging in order to not have the standard JVM defaults - LogManager.getLogManager().readConfiguration(WebServerJerseyMain.class.getResourceAsStream("/logging.properties")); + LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); // start the server on port 8080 startServer(ServerConfiguration.builder() diff --git a/examples/webserver/jersey/src/test/java/io/helidon/webserver/examples/jersey/HelloWorldTest.java b/examples/webserver/jersey/src/test/java/io/helidon/webserver/examples/jersey/HelloWorldTest.java index ed4daf3be..ef1ba2145 100644 --- a/examples/webserver/jersey/src/test/java/io/helidon/webserver/examples/jersey/HelloWorldTest.java +++ b/examples/webserver/jersey/src/test/java/io/helidon/webserver/examples/jersey/HelloWorldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,10 +33,10 @@ import static org.junit.jupiter.api.Assertions.*; /** * The Jersey Client based example that tests the {@link HelloWorld} resource - * that gets served by running {@link WebServerJerseyMain#startServer(ServerConfiguration)} + * that gets served by running {@link Main#startServer(ServerConfiguration)} * * @see HelloWorld - * @see WebServerJerseyMain + * @see Main */ public class HelloWorldTest { @@ -44,7 +44,7 @@ public class HelloWorldTest { @BeforeAll public static void startTheServer() throws Exception { - webServer = WebServerJerseyMain.startServer(null) + webServer = Main.startServer(null) .toCompletableFuture() .get(10, TimeUnit.SECONDS); } diff --git a/examples/webserver/opentracing/Dockerfile b/examples/webserver/opentracing/Dockerfile new file mode 100644 index 000000000..5ef12f9fc --- /dev/null +++ b/examples/webserver/opentracing/Dockerfile @@ -0,0 +1,47 @@ +# +# Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# 1st stage, build the app +FROM maven:3.5.4-jdk-9 as build + +WORKDIR /helidon + +# Create a first layer to cache the "Maven World" in the local repository. +# Incremental docker builds will always resume after that, unless you update +# the pom +ADD pom.xml . +RUN mvn package -DskipTests + +# Do the Maven build! +# Incremental docker builds will resume here when you change sources +ADD src src +RUN mvn package -DskipTests + +RUN echo "done!" + +# 2nd stage, build the runtime image +FROM openjdk:8-jre-slim +WORKDIR /helidon + +# Copy the binary built in the 1st stage +COPY --from=build /helidon/target/helidon-examples-webserver-opentracing.jar ./ +COPY --from=build /helidon/target/libs ./libs + +ENV tracing.host="zipkin" + +CMD ["java", "-jar", "helidon-examples-webserver-opentracing.jar"] + +EXPOSE 8080 \ No newline at end of file diff --git a/examples/webserver/opentracing/README.md b/examples/webserver/opentracing/README.md index 2cb79d7ef..f5ffcce58 100644 --- a/examples/webserver/opentracing/README.md +++ b/examples/webserver/opentracing/README.md @@ -1,86 +1,41 @@ -Opentracing Example Application -=============================== +# Opentracing Example Application -Running locally ---------------- -Prerequisites: -1. Requirements: JDK9, Maven, Docker (optional) -2. Add following lines to `/etc/hosts` - ``` - 127.0.0.1 zipkin - ``` -3. Run Zipkin:
- In Docker: - ``` - docker run -d -p 9411:9411 openzipkin/zipkin - ``` - or with Java 8+: - ``` - curl -sSL https://zipkin.io/quickstart.sh | bash -s - java -jar zipkin.jar - ``` - -Build and run: -``` -mvn clean install -pl examples/opentracing -mvn exec:java -pl examples/opentracing -curl "http://localhost:8080/test" -``` -Check out the traces at: ```http://zipkin:9411``` - - -Running in Minikube -------------------- - -### Preparing the infrastructure ### -Starting Minikube - -``` -% minikube start - -% kubectl version -Client Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.2", GitCommit:"477efc3cbe6a7effca06bd1452fa356e2201e1ee", GitTreeState:"clean", BuildDate:"2017-04-19T22:51:36Z", GoVersion:"go1.8.1", Compiler:"gc", Platform:"darwin/amd64"} -Server Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.0", GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37", GitTreeState:"dirty", BuildDate:"2017-04-07T20:46:46Z", GoVersion:"go1.7.3", Compiler:"gc", Platform:"linux/amd64"} - -% minikube dashboard - Waiting, endpoint for service is not ready yet... - Opening kubernetes dashboard in default browser... +## Start Zipkin +With Docker: +```bash +docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin ``` -Running Zipkin in K8S -``` -% kubectl run zipkin --image=openzipkin/zipkin --port=9411 -deployment "zipkin" created - -% kubectl expose deployment zipkin --type=NodePort -service "zipkin" exposed - -% kubectl get pod -NAME READY STATUS RESTARTS AGE -zipkin-2596933303-bccnw 0/1 ContainerCreating 0 14s - -% kubectl get pod -NAME READY STATUS RESTARTS AGE -zipkin-2596933303-bccnw 1/1 Running 0 16s - -% minikube service zipkin -Opening kubernetes service default/zipkin in default browser... +With Java 8+: +```bash +curl -sSL https://zipkin.io/quickstart.sh | bash -s +java -jar zipkin.jar ``` -Running opentracing app -``` -% eval $(minikube docker-env) -% mvn clean install -pl examples/opentracing docker:build +## Build and run -% kubectl run helidon-webserver-opentracing-example --image=mic.docker.oraclecorp.com/helidon-webserver-opentracing-example:0.1.0-SNAPSHOT --port=8080 --image-pull-policy=Never -deployment "helidon-webserver-opentracing-example" created - -% kubectl expose deployment helidon-webserver-opentracing-example --type=NodePort -service "helidon-webserver-opentracing-example" exposed - -% curl $(minikube service helidon-webserver-opentracing-example --url)/test -Hello World!% +With Docker: +```bash +docker build -t helidon-webserver-opentracing-example . +docker run --rm -d --link zipkin --name helidon-webserver-opentracing-example \ + -p 8080:8080 helidon-webserver-opentracing-example:latest ``` +With Java 8+: +```bash +mvn package +java -jar target/helidon-examples-webserver-opentracing.jar +``` +Try the endpoint: +```bash +curl http://localhost:8080/test +``` + +Then check out the traces at http://localhost:9411. + +Stop the docker containers: +```bash +docker stop zipkin helidon-webserver-opentracing-example +``` diff --git a/examples/webserver/opentracing/pom.xml b/examples/webserver/opentracing/pom.xml index 554190a5c..398074be3 100644 --- a/examples/webserver/opentracing/pom.xml +++ b/examples/webserver/opentracing/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-opentracing Helidon WebServer Examples OpenTracing @@ -34,80 +36,21 @@ - io.helidon.webserver.examples.opentracing.ZipkinExampleMain - - ${docker.registry}/helidon-webserver-opentracing-example:${project.version} - - mic-docker-registry-automation - mic.docker.oraclecorp.com - https://${docker.registry}/v1/ - 0.3.3 - + io.helidon.webserver.examples.opentracing.Main - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-docker-resources - generate-resources - - copy-resources - - - ${project.build.directory}/distribution/container - - - src/main/docker - true - - - - - - - - com.spotify - docker-maven-plugin - - ${docker.server.id} - ${docker.registry.url} - ${docker.image.name} - ${project.build.directory}/distribution/container - - ${docker.image.version} - latest - - - - / - ${project.build.directory} - ${project.build.finalName}-fat.jar - - - - - - - io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} io.helidon.tracing helidon-tracing-zipkin - ${project.version} org.junit.jupiter @@ -127,8 +70,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/webserver/opentracing/src/main/docker/Dockerfile b/examples/webserver/opentracing/src/main/docker/Dockerfile deleted file mode 100644 index 6cd9a2799..000000000 --- a/examples/webserver/opentracing/src/main/docker/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -FROM java:9 - -EXPOSE 8080 -COPY ./* / -RUN rm Dockerfile -WORKDIR / -CMD if [ ! -z "$MIC_CONTAINER_MEM_QUOTA" ]; then java -Xmx${MIC_CONTAINER_MEM_QUOTA}m ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; else java ${JAVA_OPTS} -jar ${artifactId}-${version}-fat.jar ; fi diff --git a/examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/ZipkinExampleMain.java b/examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/Main.java similarity index 77% rename from examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/ZipkinExampleMain.java rename to examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/Main.java index c52cd247d..cba419c3a 100644 --- a/examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/ZipkinExampleMain.java +++ b/examples/webserver/opentracing/src/main/java/io/helidon/webserver/examples/opentracing/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ package io.helidon.webserver.examples.opentracing; import java.io.IOException; import java.util.logging.LogManager; +import io.helidon.config.Config; +import io.helidon.config.ConfigSources; import io.helidon.tracing.TracerBuilder; import io.helidon.webserver.Routing; import io.helidon.webserver.ServerConfiguration; @@ -31,9 +33,9 @@ import io.helidon.webserver.WebServer; * @see io.helidon.tracing.TracerBuilder * @see io.helidon.tracing.zipkin.ZipkinTracerBuilder */ -public final class ZipkinExampleMain { +public final class Main { - private ZipkinExampleMain() { + private Main() { } /** @@ -45,17 +47,20 @@ public final class ZipkinExampleMain { public static void main(String[] args) throws IOException { // configure logging in order to not have the standard JVM defaults - LogManager.getLogManager().readConfiguration(ZipkinExampleMain.class.getResourceAsStream("/logging.properties")); + LogManager.getLogManager().readConfiguration(Main.class.getResourceAsStream("/logging.properties")); + + Config config = Config.builder() + .sources(ConfigSources.environmentVariables()) + .build(); WebServer webServer = WebServer.create( ServerConfiguration.builder() - .port(8080) - .tracer(TracerBuilder.create("demo-first") - .collectorHost("zipkin") - .buildAndRegister()), + .port(8080) + .tracer(TracerBuilder.create(config.get("tracing")) + .serviceName("demo-first") + .registerGlobal(true)), Routing.builder() - .any((req, res) -> { - + .any((req, res) -> { System.out.println("Received another request."); req.next(); }) diff --git a/examples/webserver/pom.xml b/examples/webserver/pom.xml index 6f1becaf1..1f4885e19 100644 --- a/examples/webserver/pom.xml +++ b/examples/webserver/pom.xml @@ -26,10 +26,9 @@ helidon-examples-project 1.2.2-SNAPSHOT - io.helidon.examples.webserver helidon-examples-webserver-project - Helidon WebServer Examples Parent + Helidon WebServer Examples pom @@ -39,9 +38,6 @@ static-content jersey opentracing - demo-translator-frontend - demo-translator-backend streaming - diff --git a/examples/webserver/static-content/README.md b/examples/webserver/static-content/README.md new file mode 100644 index 000000000..f2dcae853 --- /dev/null +++ b/examples/webserver/static-content/README.md @@ -0,0 +1,14 @@ +# Static Content Example + +This application demonstrates use of the StaticContentSupport to serve static files + together with a simple REST service. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-webserver-static-content.jar +``` + +Open http://localhost:8080 in your browser. diff --git a/examples/webserver/static-content/pom.xml b/examples/webserver/static-content/pom.xml index d18779801..032db2252 100644 --- a/examples/webserver/static-content/pom.xml +++ b/examples/webserver/static-content/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-static-content Helidon WebServer Examples Static Content @@ -42,12 +44,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} org.junit.jupiter @@ -62,8 +62,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/webserver/static-content/readme.md b/examples/webserver/static-content/readme.md deleted file mode 100644 index 1538cbe6b..000000000 --- a/examples/webserver/static-content/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -Static Content Example -====================== - -The **Web Server** example. - -Users can see WEB page access statistics. - -Application demonstrates use of the StaticContentSupport together with a simple REST with JSON support. - -Running the example -------------------- - -Running this example requires - * To have checked out the Java sources of this Maven module locally - * JDK 9 - * Maven 3 - * Web browser - -Execute - - mvn exec:java -pl examples/jersey - open in your WEB browser: http://localhost:8080 diff --git a/examples/webserver/streaming/README.md b/examples/webserver/streaming/README.md new file mode 100644 index 000000000..4c85b0853 --- /dev/null +++ b/examples/webserver/streaming/README.md @@ -0,0 +1,20 @@ +# Streaming Example + +This application uses NIO and data buffers to show the implementation of a simple streaming service. + Files can be uploaded and downloaded in a streaming fashion using `Subscriber` and +`Producer`. As a result, service runs in constant space instead of proportional +to the size of the file being uploaded or downloaded. + +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-webserver-streaming.jar +``` + +Upload a file and download it back with `curl`: +```bash +curl --data-binary "@target/classes/large-file.bin" http://localhost:8080/upload +curl http://localhost:8080/download +``` \ No newline at end of file diff --git a/examples/webserver/streaming/pom.xml b/examples/webserver/streaming/pom.xml index 52f18d51f..2df7315ac 100644 --- a/examples/webserver/streaming/pom.xml +++ b/examples/webserver/streaming/pom.xml @@ -22,10 +22,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-streaming Helidon WebServer Examples Streaming @@ -42,7 +44,6 @@ io.helidon.webserver helidon-webserver - ${project.version} org.junit.jupiter @@ -57,8 +58,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/examples/webserver/streaming/readme.md b/examples/webserver/streaming/readme.md deleted file mode 100644 index a5562595d..000000000 --- a/examples/webserver/streaming/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -Streaming Example -================= - -The **Streaming NIO** example. - -Uses NIO and data buffers to show the implementation of a simple streaming service. Files can be -uploaded and downloaded in a streaming fashion using `Subscriber` and -`Producer`. As a result, service runs in constant space instead of proportional -to the size of the file being uploaded or downloaded. - -Running the example -------------------- - -Running this example requires: - - * To have checked out the Java sources of this Maven module locally - * JDK 8 - * Maven 3 - * Curl - -Execute as follows: - - mvn clean install exec:java - curl --data-binary "@target/classes/large-file.bin" http://localhost:8080/upload - curl http://localhost:8080/download \ No newline at end of file diff --git a/examples/webserver/tutorial/README.md b/examples/webserver/tutorial/README.md index 7f6badaf0..f51c09037 100644 --- a/examples/webserver/tutorial/README.md +++ b/examples/webserver/tutorial/README.md @@ -1,7 +1,11 @@ -Tutorial Server -=============== +# Tutorial Server -Web application serving tutorial articles. Articles contains code examples directly from sources. Thanks to it, all examples -are build, tested and up-to-date. +This application demonstrates various WebServer use cases together and in its complexity. -It is also complex Web Server example. \ No newline at end of file +## Build and run + +With JDK8+ +```bash +mvn package +java -jar target/helidon-examples-webserver-tutorial.jar +``` \ No newline at end of file diff --git a/examples/webserver/tutorial/pom.xml b/examples/webserver/tutorial/pom.xml index 892b9690b..6c70e02bd 100644 --- a/examples/webserver/tutorial/pom.xml +++ b/examples/webserver/tutorial/pom.xml @@ -22,16 +22,19 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.examples.webserver - helidon-examples-webserver-project + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT + ../../../applications/se/pom.xml + io.helidon.examples.webserver helidon-examples-webserver-tutorial Helidon WebServer Examples Tutorial A tutorial documentation server. - It serves various tutorial articles designed based on project examples. It is also a complex example demonstrating various web server features. + It serves various tutorial articles designed based on project examples. + It is also a complex example demonstrating various web server features. @@ -42,12 +45,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.projectreactor @@ -66,8 +67,21 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/grpc/client/pom.xml b/grpc/client/pom.xml index 66ba8a382..e604f3e38 100644 --- a/grpc/client/pom.xml +++ b/grpc/client/pom.xml @@ -35,27 +35,22 @@ io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.helidon.tracing helidon-tracing-zipkin - ${project.version} io.opentracing.contrib @@ -69,13 +64,11 @@ io.helidon.grpc helidon-grpc-server - ${project.version} test io.helidon.config helidon-config-yaml - ${project.version} test diff --git a/grpc/core/pom.xml b/grpc/core/pom.xml index 2a1395392..2a043182e 100644 --- a/grpc/core/pom.xml +++ b/grpc/core/pom.xml @@ -35,7 +35,6 @@ io.helidon.grpc io.grpc - ${project.version} @@ -72,18 +71,15 @@ io.helidon.config helidon-config-object-mapping - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} test io.helidon.common helidon-common-http - ${project.version} diff --git a/grpc/io.grpc/pom.xml b/grpc/io.grpc/pom.xml index a77fa870e..30aa4e5f8 100644 --- a/grpc/io.grpc/pom.xml +++ b/grpc/io.grpc/pom.xml @@ -36,12 +36,6 @@ io.grpc grpc-core - - - com.google.code.findbugs - jsr305 - - io.grpc @@ -70,18 +64,6 @@ org.apache.maven.plugins maven-shade-plugin - - - org.ow2.asm - asm - ${version.lib.asm} - - - org.ow2.asm - asm-commons - ${version.lib.asm} - - shade diff --git a/grpc/metrics/pom.xml b/grpc/metrics/pom.xml index 484db3492..ffb62c3d4 100644 --- a/grpc/metrics/pom.xml +++ b/grpc/metrics/pom.xml @@ -33,31 +33,20 @@ io.helidon.grpc helidon-grpc-server - ${project.version} provided io.helidon.grpc helidon-grpc-client - ${project.version} - provided - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - - ${version.lib.microprofile-metrics-api} provided io.helidon.common helidon-common-metrics - ${project.version} io.helidon.metrics helidon-metrics - ${project.version} provided diff --git a/grpc/server/pom.xml b/grpc/server/pom.xml index aeed10249..9927e5950 100644 --- a/grpc/server/pom.xml +++ b/grpc/server/pom.xml @@ -35,28 +35,23 @@ io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.health helidon-health - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.opentracing.contrib @@ -97,25 +92,21 @@ io.helidon.health helidon-health-checks - ${project.version} test io.helidon.tracing helidon-tracing-zipkin - ${project.version} test io.helidon.config helidon-config-hocon - ${project.version} test io.helidon.config helidon-config-yaml - ${project.version} test diff --git a/health/health-checks/pom.xml b/health/health-checks/pom.xml index 94e81e194..55f857f8b 100644 --- a/health/health-checks/pom.xml +++ b/health/health-checks/pom.xml @@ -36,7 +36,6 @@ io.helidon.health helidon-health - ${project.version} @@ -74,4 +73,4 @@ test - \ No newline at end of file + diff --git a/health/health/pom.xml b/health/health/pom.xml index a229978ea..1cd1fa65b 100644 --- a/health/health/pom.xml +++ b/health/health/pom.xml @@ -32,12 +32,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} org.eclipse.microprofile.health @@ -71,8 +69,7 @@ io.helidon.config helidon-config-yaml - ${project.version} test - \ No newline at end of file + diff --git a/integrations/README.adoc b/integrations/README.md similarity index 89% rename from integrations/README.adoc rename to integrations/README.md index 2c8a65499..a27a6ed71 100644 --- a/integrations/README.adoc +++ b/integrations/README.md @@ -1,14 +1,14 @@ -= Helidon Integrations +# Helidon Integrations The Helidon Integrations project contains adapter code that integrates various useful external services into Helidon MicroProfile. -== `serviceconfiguration` +## `serviceconfiguration` The `serviceconfiguration` subproject provides mechanisms for automatically configuring and in some cases provisioning services. -== `cdi` +## `cdi` The `cdi` subproject contains CDI http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi[portable diff --git a/integrations/cdi/README.adoc b/integrations/cdi/README.adoc deleted file mode 100644 index 302dac870..000000000 --- a/integrations/cdi/README.adoc +++ /dev/null @@ -1,20 +0,0 @@ -= Helidon CDI Integrations - -This subproject contains -http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi[CDI portable -extensions] that provide convenient integrations with popular -libraries and services. - -* link:datasource-hikaricp[Datasource using HikariCP]: inject - https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html[`DataSource`] - objects into your CDI-based application that are backed by the - http://brettwooldridge.github.io/HikariCP/[Hikari connection pool]. - -* link:jedis-cdi[Jedis Client]: inject - https://github.com/xetorthio/jedis#jedis[Jedis] - client objects into your CDI-based application. - -* link:oci-objectstorage-cdi[Oracle Cloud Infrastructure Object Storage]: inject an - https://cloud.oracle.com/storage/object-storage/features[OCI Object Storage] - client into your CDI-based application. - diff --git a/integrations/cdi/README.md b/integrations/cdi/README.md new file mode 100644 index 000000000..2b8244f9f --- /dev/null +++ b/integrations/cdi/README.md @@ -0,0 +1,16 @@ +# Helidon CDI Integrations + +This subproject contains [CDI portable extensions](http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi) + that provide convenient integrations with popular libraries and services. + +* [Datasource using HikariCP](datasource-hikaricp): inject [`DataSource`](https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html) + objects into your CDI-based application that are backed by the + [Hikari connection pool](http://brettwooldridge.github.io/HikariCP/). + +* [Jedis Client](jedis-cdi): inject [Jedis](https://github.com/xetorthio/jedis#jedis) + client objects into your CDI-based application. + +* [Oracle Cloud Infrastructure Object Storage](oci-objectstorage-cdi): inject an + [OCI Object Storage](https://cloud.oracle.com/storage/object-storage/features) + client into your CDI-based application. + diff --git a/integrations/cdi/common-cdi/reference-counted-context/pom.xml b/integrations/cdi/common-cdi/reference-counted-context/pom.xml index 7a088b64d..ea8030cb8 100644 --- a/integrations/cdi/common-cdi/reference-counted-context/pom.xml +++ b/integrations/cdi/common-cdi/reference-counted-context/pom.xml @@ -69,9 +69,8 @@ - ${project.groupId} + io.helidon.integrations.cdi helidon-integrations-cdi-delegates - ${project.version} compile diff --git a/integrations/cdi/datasource-hikaricp/README.adoc b/integrations/cdi/datasource-hikaricp/README.md similarity index 54% rename from integrations/cdi/datasource-hikaricp/README.adoc rename to integrations/cdi/datasource-hikaricp/README.md index ae3e115bf..508054957 100644 --- a/integrations/cdi/datasource-hikaricp/README.adoc +++ b/integrations/cdi/datasource-hikaricp/README.md @@ -1,15 +1,12 @@ -= Helidon Hikari Connection Pool `DataSource` CDI Integration +# Helidon Hikari Connection Pool `DataSource` CDI Integration The Helidon Hikari Connection Pool `DataSource` CDI Integration -project supplies a -http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi[CDI portable -extension] that lets the end user inject -https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html[`DataSource`] +project supplies a [CDI portable extension](http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi) + that lets the end user inject [`DataSource`](https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html) objects into her CDI-based application. The `DataSource` objects are -backed by the http://brettwooldridge.github.io/HikariCP/[Hikari -connection pool]. +backed by the [Hikari connection pool](http://brettwooldridge.github.io/HikariCP/). -== Installation +## Installation Ensure that the Helidon Hikari Connection Pool `DataSource` CDI Integration project and its runtime dependencies are present on your @@ -17,8 +14,7 @@ application's runtime classpath. For Maven users, your `` stanza should look like this: -[source,xml] ----- +```xml io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp @@ -26,26 +22,23 @@ For Maven users, your `` stanza should look like this: 1.0.0 runtime ----- +``` -== Usage +## Usage If you want to use a `DataSource` named `orders` in your application -code, simply inject it in the -http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#injection_and_resolution[usual, -idiomatic CDI way]. Here is a field injection example: +code, simply inject it in the [usual, idiomatic CDI way](http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#injection_and_resolution). + Here is a field injection example: -[source,java] ----- +```java @Inject @Named("orders") private DataSource ordersDataSource; ----- - +``` + And here is a constructor injection example: -[source,java] ----- +```java private final DataSource ds; @Inject @@ -53,46 +46,41 @@ public YourConstructor(@Named("orders") DataSource ds) { super(); this.ds = ds; } ----- - +``` + The Helidon Hikari Connection Pool `DataSource` CDI Integration -project will satisfy this injection point with a -https://static.javadoc.io/com.zaxxer/HikariCP/2.7.8/com/zaxxer/hikari/HikariDataSource.html[`HikariDataSource`] -in -http://docs.jboss.org/cdi/api/2.0/javax/enterprise/context/ApplicationScoped.html[application -scope]. +project will satisfy this injection point with a [`HikariDataSource`](https://static.javadoc.io/com.zaxxer/HikariCP/2.7.8/com/zaxxer/hikari/HikariDataSource.html) +in [application scope](http://docs.jboss.org/cdi/api/2.0/javax/enterprise/context/ApplicationScoped.html). To create the backing connection pool, the Helidon Hikari Connection Pool `DataSource` CDI Integration project will use -https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/index.html?overview-summary.html[MicroProfile -Config] to locate its configuration. -https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--[Property -names] that start with `javax.sql.DataSource.`_dataSourceName_`.` will +[MicroProfile Config](https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/index.html?overview-summary.html) to locate its configuration. +[Property names](https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--) + that start with `javax.sql.DataSource.`_dataSourceName_`.` will be parsed, and the remaining portion of each such name will be treated as a -https://github.com/brettwooldridge/HikariCP/blob/dev/README.md#configuration-knobs-baby[Hikari -connection pool property]. +[Hikari connection pool property](https://github.com/brettwooldridge/HikariCP/blob/dev/README.md#configuration-knobs-baby). So, for example, a System property with a name like this: ----- +``` javax.sql.DataSource.orders.dataSourceClassName ----- - +``` + ...set to a value of: ----- +``` org.h2.jdbcx.JdbcDataSource ----- - +``` + ...together with other similarly-named properties will result ultimately in a Hikari connection pool named `orders` with a `dataSourceClassName` property set to `org.h2.jdbcx.JdbcDataSource`, injectable via: -[source,java] ----- + +```java @Inject @Named("orders") private DataSource ordersDataSource; ----- +``` diff --git a/integrations/cdi/datasource-hikaricp/pom.xml b/integrations/cdi/datasource-hikaricp/pom.xml index 299094db0..86751eb52 100644 --- a/integrations/cdi/datasource-hikaricp/pom.xml +++ b/integrations/cdi/datasource-hikaricp/pom.xml @@ -39,19 +39,16 @@ io.helidon.integrations.cdi helidon-integrations-cdi-datasource - ${project.version} compile io.helidon.serviceconfiguration helidon-serviceconfiguration-config-source - ${project.version} compile io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp - ${project.version} compile @@ -87,7 +84,6 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime true @@ -116,7 +112,6 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} test diff --git a/integrations/cdi/datasource-ucp/pom.xml b/integrations/cdi/datasource-ucp/pom.xml index ebd651d97..66ecaf4d0 100644 --- a/integrations/cdi/datasource-ucp/pom.xml +++ b/integrations/cdi/datasource-ucp/pom.xml @@ -38,13 +38,11 @@ io.helidon.serviceconfiguration helidon-serviceconfiguration-config-source - ${project.version} compile ${project.groupId} helidon-integrations-cdi-datasource - ${project.version} compile @@ -86,7 +84,6 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime true @@ -115,7 +112,6 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} test diff --git a/integrations/cdi/datasource/pom.xml b/integrations/cdi/datasource/pom.xml index 3709b8b47..a4ff1f1c5 100644 --- a/integrations/cdi/datasource/pom.xml +++ b/integrations/cdi/datasource/pom.xml @@ -63,7 +63,6 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime true diff --git a/integrations/cdi/eclipselink-cdi/README.adoc b/integrations/cdi/eclipselink-cdi/README.adoc deleted file mode 100644 index ac2b7d49b..000000000 --- a/integrations/cdi/eclipselink-cdi/README.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Helidon EclipseLink CDI Integration - -The Helidon EclipseLink Integration project contains a -https://www.eclipse.org/eclipselink/api/2.7/org/eclipse/persistence/platform/server/ServerPlatform.html[`ServerPlatform`] -implementation for use with Helidon's link:../jpa-cdi[JPA CDI integration]. - -= Usage - -Ensure that this library is on your application's runtime classpath. diff --git a/integrations/cdi/eclipselink-cdi/README.md b/integrations/cdi/eclipselink-cdi/README.md new file mode 100644 index 000000000..57541aefa --- /dev/null +++ b/integrations/cdi/eclipselink-cdi/README.md @@ -0,0 +1,9 @@ +# Helidon EclipseLink CDI Integration + +The Helidon EclipseLink Integration project contains a +[`ServerPlatform`](https://www.eclipse.org/eclipselink/api/2.7/org/eclipse/persistence/platform/server/ServerPlatform.html) +implementation for use with Helidon's [JPA CDI integration](../jpa-cdi). + +## Usage + +Ensure that this library is on your application's runtime classpath. diff --git a/integrations/cdi/eclipselink-cdi/pom.xml b/integrations/cdi/eclipselink-cdi/pom.xml index 894e9565f..c2d891162 100644 --- a/integrations/cdi/eclipselink-cdi/pom.xml +++ b/integrations/cdi/eclipselink-cdi/pom.xml @@ -49,13 +49,11 @@ ${project.groupId} helidon-integrations-cdi-datasource-hikaricp - ${project.version} test io.helidon.microprofile.config helidon-microprofile-config - ${project.version} test diff --git a/integrations/cdi/jedis-cdi/README.adoc b/integrations/cdi/jedis-cdi/README.md similarity index 56% rename from integrations/cdi/jedis-cdi/README.adoc rename to integrations/cdi/jedis-cdi/README.md index c8a29eb14..acb9dce22 100644 --- a/integrations/cdi/jedis-cdi/README.adoc +++ b/integrations/cdi/jedis-cdi/README.md @@ -1,47 +1,42 @@ -= Helidon Jedis CDI Integration +# Helidon Jedis CDI Integration -The Helidon Jedis CDI Integration project supplies a -http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi[CDI portable -extension] that lets the end user inject various -https://github.com/xetorthio/jedis#jedis[Jedis] objects into her -CDI-based application. +The Helidon Jedis CDI Integration project supplies a[CDI portable +extension](http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#spi) that lets the + end user inject various [Jedis](https://github.com/xetorthio/jedis#jedis) + objects into her CDI-based application. -== Installation +## Installation Ensure that the Helidon Jedis CDI Integration project and its runtime dependencies are present on your application's runtime classpath. For Maven users, your `` stanza should look like this: -[source,xml] ----- +```xml io.helidon.integrations.cdi helidon-integrations-cdi-jedis 1.0.0 runtime ----- +``` == Usage -If you want to use a -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html[`JedisPool`] -named `orders` in your application code, simply inject it in the -http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#injection_and_resolution[usual, -idiomatic CDI way]. Here is a field injection example: +If you want to use a [`JedisPool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html) +named `orders` in your application code, simply inject it in the[usual, +idiomatic CDI way](http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#injection_and_resolution). + Here is a field injection example: -[source,java] ----- +```java @Inject @Named("orders") private JedisPool ordersPool; ----- +``` And here is a constructor injection example: -[source,java] ----- +```java private final JedisPool ordersPool; @Inject @@ -49,55 +44,50 @@ public YourConstructor(@Named("orders") JedisPool pool) { super(); this.ordersPool = pool; } ----- +``` The Helidon Jedis CDI Integration project will satisfy this injection -point with a -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html[`JedisPool`] -that it will create in -http://docs.jboss.org/cdi/api/2.0/javax/enterprise/context/ApplicationScoped.html[application -scope]. +point with a [`JedisPool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html) +that it will create in [application scope](http://docs.jboss.org/cdi/api/2.0/javax/enterprise/context/ApplicationScoped.html). -To create it, the Helidon Jedis CDI Integration project will use -https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/index.html?overview-summary.html[MicroProfile -Config] to locate its configuration. -https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--[Property -names] that start with `redis.clients.jedis.JedisPool.`_instanceName_`.` will -be parsed, and the remaining portion of each such name will be treated -as a Java Bean or constructor property of `JedisPool`. +To create it, the Helidon Jedis CDI Integration project will use [MicroProfile +Config](https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/index.html?overview-summary.html) + to locate its configuration. [Property +names](https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--) + that start with `redis.clients.jedis.JedisPool.`_instanceName_`.` will be + parsed, and the remaining portion of each such name will be treated as a Java + Bean or constructor property of `JedisPool`. So, for example, a System property with a name like this: ----- +``` redis.clients.jedis.JedisPool.orders.port ----- +``` ...set to a value of: ----- +``` 6379 ----- +``` ...together with other similarly-named properties will result ultimately in a `JedisPool` object injectable under the instance name of `orders` with a `port` property set to `6379` like so: -[source,java] ----- +```java @Inject @Named("orders") private JedisPool pool; ----- +``` Property names that start with `redis.clients.jedis.JedisPool.instanceName.` are parsed, and the remaining portion of each name is treated as a Java Bean property of - https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html[`JedisPool`], - or as a primitive value accepted by - https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html#JedisPool-org.apache.commons.pool2.impl.GenericObjectPoolConfig-java.lang.String-int-int-java.lang.String-int-boolean-javax.net.ssl.SSLSocketFactory-javax.net.ssl.SSLParameters-javax.net.ssl.HostnameVerifier-[its - most specific constructor]. Because the `JedisPool` class inherits - from the - https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/util/Pool.html[`Pool`] +[`JedisPool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html), + or as a primitive value accepted by[its + most specific constructor]( https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html#JedisPool-org.apache.commons.pool2.impl.GenericObjectPoolConfig-java.lang.String-int-int-java.lang.String-int-boolean-javax.net.ssl.SSLSocketFactory-javax.net.ssl.SSLParameters-javax.net.ssl.HostnameVerifier-). + Because the `JedisPool` class inherits from the +[`Pool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/util/Pool.html) class, its writable Java Bean properties are available as well. Accordingly, the `JedisPool` properties that can be set are as @@ -114,20 +104,15 @@ used in application code: * `redis.clients.jedis.JedisPool.instanceName.ssl` Any documentation for these properties that exists may be found in the -javadocs for the -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html[`JedisPool`] -and -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/util/Pool.html[`Pool`] -classes. +javadocs for the [`JedisPool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPool.html) +and [`Pool`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/util/Pool.html) classes. For advanced configuration use cases, it is also possible to configure -the -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPoolConfig.html[`JedisPoolConfig`] +the[`JedisPoolConfig`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPoolConfig.html) object used by the Helidon Jedis CDI Integration project to create -`JedisPool` instances. In this case, -https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--[property -names] that start with -`redis.clients.jedis.JedisPoolConfig.`_instanceName_`.` will be +`JedisPool` instances. In this case, [property +names](https://static.javadoc.io/org.eclipse.microprofile.config/microprofile-config-api/1.3/org/eclipse/microprofile/config/Config.html#getPropertyNames--) + that start with `redis.clients.jedis.JedisPoolConfig.`_instanceName_`.` will be parsed, and the remaining portion of each such name will be treated as a Java Bean or constructor property of `JedisPool` (or of its superclasses). @@ -157,9 +142,7 @@ actual named used in application code: * `redis.clients.jedis.JedisPoolConfig.instanceName.timeBetweenEvictionRunsMillis` Any documentation for these properties that exists may be found in the -javadocs for the -https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPoolConfig.html[`JedisPoolConfig`], -https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html[`GenericObjectPoolConfig`] -and -https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/BaseObjectPoolConfig.html[`BaseObjectPoolConfig`] +javadocs for the [`JedisPoolConfig`](https://static.javadoc.io/redis.clients/jedis/2.9.0/redis/clients/jedis/JedisPoolConfig.html), +[`GenericObjectPoolConfig`](https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/GenericObjectPoolConfig.html) +and [`BaseObjectPoolConfig`](https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/BaseObjectPoolConfig.html) classes. \ No newline at end of file diff --git a/integrations/cdi/jedis-cdi/pom.xml b/integrations/cdi/jedis-cdi/pom.xml index c76e2466f..6920f5740 100644 --- a/integrations/cdi/jedis-cdi/pom.xml +++ b/integrations/cdi/jedis-cdi/pom.xml @@ -64,7 +64,6 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} runtime true diff --git a/integrations/cdi/jpa-cdi/README.adoc b/integrations/cdi/jpa-cdi/README.md similarity index 76% rename from integrations/cdi/jpa-cdi/README.adoc rename to integrations/cdi/jpa-cdi/README.md index 2da949ad8..2dfdf944d 100644 --- a/integrations/cdi/jpa-cdi/README.adoc +++ b/integrations/cdi/jpa-cdi/README.md @@ -1,4 +1,4 @@ -= Helidon JPA CDI Integration +# Helidon JPA CDI Integration The Helidon JPA CDI Integration project performs the provider-independent work of integrating JPA into standalone CDI @@ -10,18 +10,17 @@ To function properly, this project also requires: * a JPA-provider-specific library to assist the JPA provider in determining what kind of environment it is running in, such as the - link:../eclipselink-cdi[`eclipselink-cdi` project] + [`eclipselink-cdi` project](../eclipselink-cdi) * a library capable of integrating `DataSource` instances into CDI, - such as the link:../datasource-hikaricp[`datasource-hikaricp` - project] + such as the [`datasource-hikaricp` project](../datasource-hikaricp) * a suitable JDBC-compliant database driver library -== Installation +## Installation Ensure that the Helidon JPA CDI Integration project and its runtime dependencies are present on your application's runtime classpath. Please see the -link:../../../examples/integrations/cdi/jpa/[`examples/integrations/cdi/jpa`] +[`examples/integrations/cdi/jpa`](../../../examples/integrations/cdi/jpa/) project for a working `pom.xml` file that uses this project. diff --git a/integrations/cdi/jpa-cdi/pom.xml b/integrations/cdi/jpa-cdi/pom.xml index c4f42da4e..6d0fbd3fd 100644 --- a/integrations/cdi/jpa-cdi/pom.xml +++ b/integrations/cdi/jpa-cdi/pom.xml @@ -63,25 +63,21 @@ ${project.groupId} helidon-integrations-cdi-jta-weld - ${project.version} test ${project.groupId} helidon-integrations-cdi-datasource-hikaricp - ${project.version} test ${project.groupId} helidon-integrations-cdi-eclipselink - ${project.version} test io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} test @@ -116,16 +112,14 @@ - ${project.groupId} + io.helidon.integrations.cdi helidon-integrations-cdi-delegates - ${project.version} compile - ${project.groupId} + io.helidon.integrations.cdi helidon-integrations-cdi-reference-counted-context - ${project.version} compile diff --git a/integrations/cdi/jpa-weld/README.adoc b/integrations/cdi/jpa-weld/README.adoc deleted file mode 100644 index 645a4e2da..000000000 --- a/integrations/cdi/jpa-weld/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ -= Helidon JPA Weld Integration - -CAUTION: This project is now superfluous, deprecated and slated for -eventual removal. Please simply use the link:../jpa-cdi[`jpa-cdi`] -project instead. diff --git a/integrations/cdi/jpa-weld/README.md b/integrations/cdi/jpa-weld/README.md new file mode 100644 index 000000000..9fa0447e6 --- /dev/null +++ b/integrations/cdi/jpa-weld/README.md @@ -0,0 +1,5 @@ +# Helidon JPA Weld Integration + +CAUTION: This project is now superfluous, deprecated and slated for +eventual removal. Please simply use the [`jpa-cdi`](../jpa-cdi) +project instead. diff --git a/integrations/cdi/jpa-weld/pom.xml b/integrations/cdi/jpa-weld/pom.xml index 7dd93dd35..acdb113df 100644 --- a/integrations/cdi/jpa-weld/pom.xml +++ b/integrations/cdi/jpa-weld/pom.xml @@ -70,25 +70,21 @@ ${project.groupId} helidon-integrations-cdi-jta-weld - ${project.version} test ${project.groupId} helidon-integrations-cdi-datasource-hikaricp - ${project.version} test ${project.groupId} helidon-integrations-cdi-eclipselink - ${project.version} test io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} test @@ -96,7 +92,6 @@ ${project.groupId} helidon-integrations-cdi-jpa - ${project.version} runtime diff --git a/integrations/cdi/jta-cdi/README.adoc b/integrations/cdi/jta-cdi/README.md similarity index 79% rename from integrations/cdi/jta-cdi/README.adoc rename to integrations/cdi/jta-cdi/README.md index 8aad4ce79..4bf765491 100644 --- a/integrations/cdi/jta-cdi/README.adoc +++ b/integrations/cdi/jta-cdi/README.md @@ -1,4 +1,4 @@ -= Helidon JTA CDI Integration +# Helidon JTA CDI Integration The Helidon JTA CDI Integration project performs the CDI-provider-agnostic work of integrating a JTA implementation into standalone CDI @@ -9,13 +9,13 @@ standalone CDI applications. To function properly, this project also requires: * a CDI-provider-specific counterpart, such as the - link:../jta-weld[`jta-weld` project] + [`jta-weld` project](../jta-weld) -== Installation +## Installation Ensure that the Helidon JTA CDI Integration project and its runtime dependencies are present on your application's runtime classpath. Please see the -link:../../../examples/integrations/cdi/jpa/[`examples/integrations/cdi/jpa`] +[`examples/integrations/cdi/jpa`](../../../examples/integrations/cdi/jpa/) project for a working `pom.xml` file that uses this project. diff --git a/integrations/cdi/jta-weld/README.adoc b/integrations/cdi/jta-weld/README.md similarity index 79% rename from integrations/cdi/jta-weld/README.adoc rename to integrations/cdi/jta-weld/README.md index fbcc8d9d8..d000ac897 100644 --- a/integrations/cdi/jta-weld/README.adoc +++ b/integrations/cdi/jta-weld/README.md @@ -1,4 +1,4 @@ -= Helidon JTA Weld Integration +# Helidon JTA Weld Integration The Helidon JTA Weld Integration project performs the CDI-provider-specific work of integrating a JTA implementation into @@ -9,14 +9,14 @@ overall JTA support for standalone CDI applications. To function properly, this project also requires: * a CDI-provider-agnostic counterpart, such as the - link:../jta-cdi[`jta-cdi` project] + [`jta-cdi` project](../jta-cdi) -== Installation +## Installation Ensure that the Helidon JTA Weld Integration project and its runtime dependencies are present on your application's runtime classpath. Please see the -link:../../../examples/integrations/cdi/jpa/[`examples/integrations/cdi/jpa`] +[`examples/integrations/cdi/jpa`](../../../examples/integrations/cdi/jpa/) project for a working `pom.xml` file that uses this project. diff --git a/integrations/cdi/jta-weld/pom.xml b/integrations/cdi/jta-weld/pom.xml index ed063b629..3f966da73 100644 --- a/integrations/cdi/jta-weld/pom.xml +++ b/integrations/cdi/jta-weld/pom.xml @@ -62,7 +62,6 @@ io.helidon.integrations.cdi helidon-integrations-cdi-jta - ${project.version} runtime + + + maven.oracle.com + https://maven.oracle.com + default + + true + + + false + + + diff --git a/integrations/serviceconfiguration/serviceconfiguration-ucp-localhost/pom.xml b/integrations/serviceconfiguration/serviceconfiguration-ucp-localhost/pom.xml index 4c9d5af74..13a5997a3 100644 --- a/integrations/serviceconfiguration/serviceconfiguration-ucp-localhost/pom.xml +++ b/integrations/serviceconfiguration/serviceconfiguration-ucp-localhost/pom.xml @@ -43,7 +43,6 @@ ${project.groupId} helidon-serviceconfiguration-ucp - ${project.version} compile diff --git a/integrations/serviceconfiguration/serviceconfiguration-ucp/pom.xml b/integrations/serviceconfiguration/serviceconfiguration-ucp/pom.xml index 67e8844ea..492688d01 100644 --- a/integrations/serviceconfiguration/serviceconfiguration-ucp/pom.xml +++ b/integrations/serviceconfiguration/serviceconfiguration-ucp/pom.xml @@ -43,7 +43,6 @@ ${project.groupId} helidon-serviceconfiguration-api - ${project.version} compile diff --git a/javadocs/pom.xml b/javadocs/pom.xml index 002a8c9f3..f4e3b5225 100644 --- a/javadocs/pom.xml +++ b/javadocs/pom.xml @@ -158,227 +158,185 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-access-log - ${project.version} io.helidon.media.jackson helidon-media-jackson-common - ${project.version} io.helidon.media.jackson helidon-media-jackson-server - ${project.version} io.helidon.media.jsonb helidon-media-jsonb-common - ${project.version} io.helidon.media.jsonb helidon-media-jsonb-server - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-common - ${project.version} io.helidon.metrics helidon-metrics-prometheus - ${project.version} io.helidon.config helidon-config-etcd - ${project.version} io.helidon.config helidon-config-git - ${project.version} io.helidon.config helidon-config-testing - ${project.version} io.helidon.config helidon-config-object-mapping - ${project.version} io.helidon.config helidon-config-encryption - ${project.version} io.helidon.security helidon-security - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.security.providers helidon-security-providers-google-login - ${project.version} io.helidon.security.providers helidon-security-providers-jwt - ${project.version} io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} io.helidon.security.providers helidon-security-providers-http-sign - ${project.version} io.helidon.security.integration helidon-security-integration-jersey - ${project.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.security helidon-security-annotations - ${project.version} io.helidon.security.providers helidon-security-providers-abac - ${project.version} io.helidon.security.abac helidon-security-abac-time - ${project.version} io.helidon.security.abac helidon-security-abac-role - ${project.version} io.helidon.security.abac helidon-security-abac-scope - ${project.version} io.helidon.security.abac helidon-security-abac-policy - ${project.version} io.helidon.security.abac helidon-security-abac-policy-el - ${project.version} io.helidon.security helidon-security-jwt - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.helidon.tracing helidon-tracing-zipkin - ${project.version} io.helidon.tracing helidon-tracing-jersey-client - ${project.version} io.helidon.tracing helidon-tracing-jersey - ${project.version} io.helidon.tracing helidon-tracing-jaeger - ${project.version} io.helidon.microprofile.bundles helidon-microprofile-1.2 - ${project.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} io.helidon.grpc helidon-grpc-client - ${project.version} io.helidon.grpc helidon-grpc-core - ${project.version} io.helidon.grpc helidon-grpc-metrics - ${project.version} io.helidon.grpc helidon-grpc-server - ${project.version} io.helidon.openapi helidon-openapi - ${project.version} @@ -389,97 +347,78 @@ io.helidon.serviceconfiguration helidon-serviceconfiguration-api - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-config-source - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp-accs - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp-localhost - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-hikaricp - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp-accs - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp-localhost - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-ucp - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-system-kubernetes - ${project.version} io.helidon.serviceconfiguration helidon-serviceconfiguration-system-oracle-accs - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource-hikaricp - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-datasource-ucp - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-delegates - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-eclipselink - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-hibernate - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-jedis - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-oci-objectstorage - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-reference-counted-context - ${project.version} javax.transaction @@ -488,22 +427,18 @@ io.helidon.integrations.cdi helidon-integrations-cdi-jpa - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-jpa-weld - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-jta - ${project.version} io.helidon.integrations.cdi helidon-integrations-cdi-jta-weld - ${project.version} diff --git a/jersey/common/pom.xml b/jersey/common/pom.xml index 0b318b256..570db540c 100644 --- a/jersey/common/pom.xml +++ b/jersey/common/pom.xml @@ -32,13 +32,11 @@ io.helidon.jersey helidon-jersey-server - ${project.version} provided io.helidon.common helidon-common - ${project.version} org.junit.jupiter @@ -56,4 +54,4 @@ test - \ No newline at end of file + diff --git a/media/common/pom.xml b/media/common/pom.xml index a62d03d6f..14937bf55 100644 --- a/media/common/pom.xml +++ b/media/common/pom.xml @@ -32,17 +32,14 @@ io.helidon.common helidon-common-http - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.helidon.common helidon-common-mapper - ${project.version} org.junit.jupiter diff --git a/media/jackson/common/pom.xml b/media/jackson/common/pom.xml index 4dafbbad7..9df4e6be8 100644 --- a/media/jackson/common/pom.xml +++ b/media/jackson/common/pom.xml @@ -38,12 +38,10 @@ io.helidon.common helidon-common-http - ${project.version} io.helidon.media helidon-media-common - ${project.version} org.junit.jupiter diff --git a/media/jackson/server/pom.xml b/media/jackson/server/pom.xml index d5c5e2833..13bea7f3f 100644 --- a/media/jackson/server/pom.xml +++ b/media/jackson/server/pom.xml @@ -52,12 +52,10 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jackson helidon-media-jackson-common - ${project.version} org.junit.jupiter @@ -72,7 +70,6 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test diff --git a/media/jsonb/common/pom.xml b/media/jsonb/common/pom.xml index 601ce1b15..a52193ebe 100644 --- a/media/jsonb/common/pom.xml +++ b/media/jsonb/common/pom.xml @@ -32,12 +32,10 @@ io.helidon.common helidon-common-http - ${project.version} io.helidon.media helidon-media-common - ${project.version} org.eclipse diff --git a/media/jsonb/server/pom.xml b/media/jsonb/server/pom.xml index 2f059d613..f1217aa66 100644 --- a/media/jsonb/server/pom.xml +++ b/media/jsonb/server/pom.xml @@ -40,12 +40,10 @@ io.helidon.media.jsonb helidon-media-jsonb-common - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} org.junit.jupiter @@ -60,7 +58,6 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test diff --git a/media/jsonp/common/pom.xml b/media/jsonp/common/pom.xml index 8061e90e2..f3a64bb1a 100644 --- a/media/jsonp/common/pom.xml +++ b/media/jsonp/common/pom.xml @@ -32,12 +32,10 @@ io.helidon.common helidon-common-http - ${project.version} io.helidon.media helidon-media-common - ${project.version} org.glassfish @@ -54,4 +52,4 @@ test - \ No newline at end of file + diff --git a/media/jsonp/server/pom.xml b/media/jsonp/server/pom.xml index 8a3921dac..cb55c43a6 100644 --- a/media/jsonp/server/pom.xml +++ b/media/jsonp/server/pom.xml @@ -36,17 +36,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-common - ${project.version} org.junit.jupiter @@ -66,8 +63,7 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test - \ No newline at end of file + diff --git a/metrics/metrics/pom.xml b/metrics/metrics/pom.xml index 6a778d478..a8db2a73d 100644 --- a/metrics/metrics/pom.xml +++ b/metrics/metrics/pom.xml @@ -51,7 +51,7 @@ - + @@ -77,37 +77,32 @@ + org.eclipse.microprofile.metrics microprofile-metrics-api - - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-metrics - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/metrics/prometheus/pom.xml b/metrics/prometheus/pom.xml index d8d31c65a..4d7ed4c62 100644 --- a/metrics/prometheus/pom.xml +++ b/metrics/prometheus/pom.xml @@ -33,7 +33,6 @@ io.helidon.webserver helidon-webserver - ${project.version} io.prometheus @@ -57,7 +56,6 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test diff --git a/metrics2/metrics2/pom.xml b/metrics2/metrics2/pom.xml index 516f9c3fa..ca267af04 100644 --- a/metrics2/metrics2/pom.xml +++ b/metrics2/metrics2/pom.xml @@ -82,17 +82,15 @@ - + io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-metrics - ${project.version} org.eclipse.microprofile.metrics @@ -102,23 +100,19 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test io.helidon.microprofile.config helidon-microprofile-config - ${project.version} runtime diff --git a/microprofile/access-log/pom.xml b/microprofile/access-log/pom.xml index 6dafbb118..5a9f55187 100644 --- a/microprofile/access-log/pom.xml +++ b/microprofile/access-log/pom.xml @@ -34,14 +34,12 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.webserver helidon-webserver-access-log - ${project.version} - \ No newline at end of file + diff --git a/microprofile/bundles/helidon-microprofile-1.0/pom.xml b/microprofile/bundles/helidon-microprofile-1.0/pom.xml index 654094c1f..21506e806 100644 --- a/microprofile/bundles/helidon-microprofile-1.0/pom.xml +++ b/microprofile/bundles/helidon-microprofile-1.0/pom.xml @@ -33,7 +33,6 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} diff --git a/microprofile/bundles/helidon-microprofile-1.1/pom.xml b/microprofile/bundles/helidon-microprofile-1.1/pom.xml index d03a3bf5c..4b175d622 100644 --- a/microprofile/bundles/helidon-microprofile-1.1/pom.xml +++ b/microprofile/bundles/helidon-microprofile-1.1/pom.xml @@ -33,7 +33,6 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} javax.interceptor @@ -48,12 +47,10 @@ io.helidon.microprofile.config helidon-microprofile-config - ${project.version} io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} diff --git a/microprofile/bundles/helidon-microprofile-1.2/pom.xml b/microprofile/bundles/helidon-microprofile-1.2/pom.xml index 479059505..2bebe0c7d 100644 --- a/microprofile/bundles/helidon-microprofile-1.2/pom.xml +++ b/microprofile/bundles/helidon-microprofile-1.2/pom.xml @@ -33,37 +33,30 @@ io.helidon.microprofile.bundles helidon-microprofile-1.1 - ${project.version} io.helidon.microprofile.health helidon-microprofile-health - ${project.version} io.helidon.health helidon-health-checks - ${project.version} io.helidon.microprofile.metrics helidon-microprofile-metrics - ${project.version} io.helidon.microprofile helidon-microprofile-fault-tolerance - ${project.version} io.helidon.microprofile.jwt helidon-microprofile-jwt-auth-cdi - ${project.version} io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} diff --git a/microprofile/bundles/helidon-microprofile-2.2/pom.xml b/microprofile/bundles/helidon-microprofile-2.2/pom.xml index f079b1dd8..dbf415b1b 100644 --- a/microprofile/bundles/helidon-microprofile-2.2/pom.xml +++ b/microprofile/bundles/helidon-microprofile-2.2/pom.xml @@ -33,22 +33,18 @@ io.helidon.microprofile.bundles helidon-microprofile-1.2 - ${project.version} io.helidon.microprofile.openapi helidon-microprofile-openapi - ${project.version} io.helidon.microprofile.rest-client helidon-microprofile-rest-client - ${project.version} io.helidon.microprofile.tracing helidon-microprofile-tracing - ${project.version} diff --git a/microprofile/bundles/helidon-microprofile-3.0/pom.xml b/microprofile/bundles/helidon-microprofile-3.0/pom.xml index b792eb4b5..f62a0ac25 100644 --- a/microprofile/bundles/helidon-microprofile-3.0/pom.xml +++ b/microprofile/bundles/helidon-microprofile-3.0/pom.xml @@ -33,27 +33,16 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} io.helidon.microprofile.metrics helidon-microprofile-metrics - - org.eclipse.microprofile.metrics - microprofile-metrics-api - io.helidon.microprofile.metrics helidon-microprofile-metrics2 - ${project.version} - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} diff --git a/microprofile/config/config-cdi/pom.xml b/microprofile/config/config-cdi/pom.xml index 0087d151e..ff5570fce 100644 --- a/microprofile/config/config-cdi/pom.xml +++ b/microprofile/config/config-cdi/pom.xml @@ -43,12 +43,10 @@ io.helidon.microprofile.config helidon-microprofile-config - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test @@ -65,8 +63,8 @@ io.helidon.microprofile.config helidon-microprofile-config - ${project.version} tests + ${project.version} test-jar test diff --git a/microprofile/config/config/pom.xml b/microprofile/config/config/pom.xml index ef378a0d3..1d4d12da3 100644 --- a/microprofile/config/config/pom.xml +++ b/microprofile/config/config/pom.xml @@ -41,17 +41,14 @@ io.helidon.bundles helidon-bundles-config - ${project.version} io.helidon.config helidon-config-encryption - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/fault-tolerance/pom.xml b/microprofile/fault-tolerance/pom.xml index eb027e29a..dab1ffd2e 100644 --- a/microprofile/fault-tolerance/pom.xml +++ b/microprofile/fault-tolerance/pom.xml @@ -61,13 +61,11 @@ io.helidon.common helidon-common-metrics - ${project.version} org.eclipse.microprofile.metrics microprofile-metrics-api - - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} provided @@ -91,17 +89,14 @@ io.helidon.common helidon-common-configurable - ${project.version} io.helidon.microprofile.config helidon-microprofile-config - ${project.version} io.helidon.microprofile.server helidon-microprofile-server - ${project.version} org.jboss.weld.se @@ -117,7 +112,6 @@ io.helidon.microprofile.metrics helidon-microprofile-metrics - ${project.version} provided diff --git a/microprofile/health/pom.xml b/microprofile/health/pom.xml index e5a26611e..7b9f7b372 100644 --- a/microprofile/health/pom.xml +++ b/microprofile/health/pom.xml @@ -38,13 +38,11 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} provided io.helidon.health helidon-health - ${project.version} org.eclipse.microprofile.config @@ -57,7 +55,6 @@ io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/jwt-auth/jwt-auth-cdi/pom.xml b/microprofile/jwt-auth/jwt-auth-cdi/pom.xml index 60d123642..4ebdbe31d 100644 --- a/microprofile/jwt-auth/jwt-auth-cdi/pom.xml +++ b/microprofile/jwt-auth/jwt-auth-cdi/pom.xml @@ -39,12 +39,10 @@ io.helidon.microprofile.jwt helidon-microprofile-jwt-auth - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/jwt-auth/jwt-auth/pom.xml b/microprofile/jwt-auth/jwt-auth/pom.xml index 75e0214f6..01cdb7f83 100644 --- a/microprofile/jwt-auth/jwt-auth/pom.xml +++ b/microprofile/jwt-auth/jwt-auth/pom.xml @@ -36,44 +36,36 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.security helidon-security-jwt - ${project.version} io.helidon.security helidon-security - ${project.version} io.helidon.security.integration helidon-security-integration-jersey - ${project.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} compile io.helidon.config helidon-config - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} compile io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/metrics/pom.xml b/microprofile/metrics/pom.xml index aebf1a2a1..36d55707e 100644 --- a/microprofile/metrics/pom.xml +++ b/microprofile/metrics/pom.xml @@ -43,32 +43,22 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.microprofile.config helidon-microprofile-config - ${project.version} io.helidon.common helidon-common-metrics - ${project.version} io.helidon.metrics helidon-metrics - ${project.version} - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics-api} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/metrics2/pom.xml b/microprofile/metrics2/pom.xml index 264f6f456..d1642e71f 100644 --- a/microprofile/metrics2/pom.xml +++ b/microprofile/metrics2/pom.xml @@ -43,27 +43,18 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.microprofile.config helidon-microprofile-config - ${project.version} io.helidon.metrics helidon-metrics2 - ${project.version} - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/oidc/pom.xml b/microprofile/oidc/pom.xml index eb8ed3a0e..1f60db55d 100644 --- a/microprofile/oidc/pom.xml +++ b/microprofile/oidc/pom.xml @@ -37,22 +37,18 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.microprofile helidon-microprofile-security - ${project.version} io.helidon.security.providers helidon-security-providers-oidc - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/openapi/pom.xml b/microprofile/openapi/pom.xml index 9c0d186b4..994f01dd2 100644 --- a/microprofile/openapi/pom.xml +++ b/microprofile/openapi/pom.xml @@ -75,12 +75,10 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.openapi helidon-openapi - ${project.version} org.junit.jupiter @@ -104,4 +102,4 @@ - \ No newline at end of file + diff --git a/microprofile/rest-client/pom.xml b/microprofile/rest-client/pom.xml index d0e401c19..d1e706cdd 100644 --- a/microprofile/rest-client/pom.xml +++ b/microprofile/rest-client/pom.xml @@ -39,12 +39,10 @@ io.helidon.common helidon-common-context - ${project.version} io.helidon.jersey helidon-jersey-client - ${project.version} org.glassfish.jersey.ext.microprofile @@ -94,4 +92,4 @@ - \ No newline at end of file + diff --git a/microprofile/security/pom.xml b/microprofile/security/pom.xml index 8fae83061..de8c26a7f 100644 --- a/microprofile/security/pom.xml +++ b/microprofile/security/pom.xml @@ -37,27 +37,22 @@ io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.bundles helidon-bundles-security - ${project.version} io.helidon.security.integration helidon-security-integration-jersey - ${project.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/server/pom.xml b/microprofile/server/pom.xml index 3b3cd9fc2..23ed9fed3 100644 --- a/microprofile/server/pom.xml +++ b/microprofile/server/pom.xml @@ -49,7 +49,6 @@ io.helidon.microprofile.config helidon-microprofile-config - ${project.version} org.jboss.weld.se @@ -67,17 +66,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.webserver helidon-webserver-jersey - ${project.version} io.helidon.common helidon-common-service-loader - ${project.version} @@ -93,12 +89,10 @@ io.helidon.jersey helidon-jersey-media-jsonp - ${project.version} io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/microprofile/tests/arquillian/pom.xml b/microprofile/tests/arquillian/pom.xml index 8e3b8d91f..dcbd11591 100644 --- a/microprofile/tests/arquillian/pom.xml +++ b/microprofile/tests/arquillian/pom.xml @@ -42,22 +42,18 @@ org.jboss.arquillian.testenricher arquillian-testenricher-cdi - 1.4.0.Final org.jboss.arquillian.container arquillian-container-test-spi - 1.4.0.Final org.jboss.arquillian.protocol arquillian-protocol-servlet - 1.4.0.Final io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.health @@ -68,7 +64,6 @@ junit junit - 4.12 diff --git a/microprofile/tests/tck/pom.xml b/microprofile/tests/tck/pom.xml index 56c1e1cfb..53932bf96 100644 --- a/microprofile/tests/tck/pom.xml +++ b/microprofile/tests/tck/pom.xml @@ -42,26 +42,12 @@ tck-rest-client - - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - - - org.testng testng test - - org.eclipse.microprofile.metrics - microprofile-metrics-api - test - diff --git a/microprofile/tests/tck/tck-config/pom.xml b/microprofile/tests/tck/tck-config/pom.xml index 6541e5132..e29551cfa 100644 --- a/microprofile/tests/tck/tck-config/pom.xml +++ b/microprofile/tests/tck/tck-config/pom.xml @@ -33,7 +33,7 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} + test org.eclipse.microprofile.config diff --git a/microprofile/tests/tck/tck-fault-tolerance/pom.xml b/microprofile/tests/tck/tck-fault-tolerance/pom.xml index 76bdbede5..ce2fafa80 100644 --- a/microprofile/tests/tck/tck-fault-tolerance/pom.xml +++ b/microprofile/tests/tck/tck-fault-tolerance/pom.xml @@ -34,27 +34,19 @@ io.helidon.microprofile.tests helidon-arquillian ${project.version} + test io.helidon.microprofile.bundles helidon-microprofile-3.0 - test io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} test - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics-api} - test - - javax.activation javax.activation-api diff --git a/microprofile/tests/tck/tck-jwt-auth/pom.xml b/microprofile/tests/tck/tck-jwt-auth/pom.xml index 48dffc479..b388b1321 100644 --- a/microprofile/tests/tck/tck-jwt-auth/pom.xml +++ b/microprofile/tests/tck/tck-jwt-auth/pom.xml @@ -52,7 +52,7 @@ org.jboss.arquillian.container arquillian-container-test-spi - 1.4.0.Final + test @@ -71,4 +71,4 @@ - \ No newline at end of file + diff --git a/microprofile/tests/tck/tck-metrics/pom.xml b/microprofile/tests/tck/tck-metrics/pom.xml index 8855af0e5..62a379ae7 100644 --- a/microprofile/tests/tck/tck-metrics/pom.xml +++ b/microprofile/tests/tck/tck-metrics/pom.xml @@ -45,7 +45,6 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} test @@ -61,13 +60,13 @@ org.eclipse.microprofile.metrics microprofile-metrics-api - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} test org.eclipse.microprofile.metrics microprofile-metrics-rest-tck - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} test @@ -79,7 +78,7 @@ org.eclipse.microprofile.metrics microprofile-metrics-api-tck - ${version.lib.microprofile-metrics-api} + ${version.lib.microprofile-metrics1-api} test diff --git a/microprofile/tests/tck/tck-openapi/pom.xml b/microprofile/tests/tck/tck-openapi/pom.xml index e1156de88..0e5a9890c 100644 --- a/microprofile/tests/tck/tck-openapi/pom.xml +++ b/microprofile/tests/tck/tck-openapi/pom.xml @@ -50,12 +50,12 @@ org.eclipse.microprofile.openapi microprofile-openapi-api - ${version.lib.microprofile-openapi-api} + test org.eclipse.microprofile.openapi microprofile-openapi-tck - ${version.lib.microprofile-openapi-api} + test org.glassfish diff --git a/microprofile/tests/tck/tck-opentracing/pom.xml b/microprofile/tests/tck/tck-opentracing/pom.xml index 265adfe53..31c175d1c 100644 --- a/microprofile/tests/tck/tck-opentracing/pom.xml +++ b/microprofile/tests/tck/tck-opentracing/pom.xml @@ -18,16 +18,19 @@ + 4.0.0 tck-project io.helidon.microprofile.tests 1.2.2-SNAPSHOT - 4.0.0 - tck-opentracing Helidon Microprofile Tests TCK Opentracing + + 2.9.0 + + io.helidon.microprofile.tests @@ -46,6 +49,7 @@ org.glassfish.jersey.media jersey-media-json-jackson + test javax.xml.bind @@ -79,6 +83,40 @@ opentracing-mock test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson.tck.version} + test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-base + ${jackson.tck.version} + test + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.tck.version} + test + + + com.fasterxml.jackson.core + jackson-core + ${jackson.tck.version} + test + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson.tck.version} + test + @@ -94,4 +132,4 @@ - \ No newline at end of file + diff --git a/microprofile/tests/tck/tck-rest-client/pom.xml b/microprofile/tests/tck/tck-rest-client/pom.xml index f2e37bb8b..d2d1caeb9 100644 --- a/microprofile/tests/tck/tck-rest-client/pom.xml +++ b/microprofile/tests/tck/tck-rest-client/pom.xml @@ -68,7 +68,6 @@ uk.co.deliverymind wiremock-maven-plugin - 2.7.0 test-compile @@ -84,4 +83,4 @@ - \ No newline at end of file + diff --git a/microprofile/tracing/pom.xml b/microprofile/tracing/pom.xml index 5192d4bd3..ab3d73fa7 100644 --- a/microprofile/tracing/pom.xml +++ b/microprofile/tracing/pom.xml @@ -18,13 +18,12 @@ + 4.0.0 helidon-microprofile-project io.helidon.microprofile 1.2.2-SNAPSHOT - 4.0.0 - io.helidon.microprofile.tracing helidon-microprofile-tracing Helidon Microprofile Tracing @@ -44,17 +43,14 @@ io.helidon.tracing helidon-tracing-jersey - ${project.version} io.helidon.microprofile.server helidon-microprofile-server - ${project.version} io.helidon.jersey helidon-jersey-common - ${project.version} org.eclipse.microprofile.opentracing @@ -69,13 +65,11 @@ io.helidon.microprofile.config helidon-microprofile-config-cdi - ${project.version} test io.helidon.microprofile.bundles internal-test-libs - ${project.version} test diff --git a/openapi/pom.xml b/openapi/pom.xml index 37c9d36da..1b1d6ecfb 100644 --- a/openapi/pom.xml +++ b/openapi/pom.xml @@ -38,7 +38,6 @@ io.helidon.webserver helidon-webserver - ${project.version} io.smallrye @@ -47,12 +46,10 @@ io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} io.helidon.config helidon-config - ${project.version} org.jboss @@ -85,9 +82,8 @@ io.helidon.config helidon-config-yaml - ${project.version} test - \ No newline at end of file + diff --git a/parent/pom.xml b/parent/pom.xml new file mode 100644 index 000000000..502bb54eb --- /dev/null +++ b/parent/pom.xml @@ -0,0 +1,150 @@ + + + + + 4.0.0 + io.helidon + helidon-parent + 1.2.2-SNAPSHOT + pom + + Helidon Parent + Java libraries for writing microservices + + https://helidon.io + + + Oracle Corporation + http://www.oracle.com/ + + + 2018 + + + + Apache 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + + scm:git:git@github.com:oracle/helidon.git + scm:git:git@github.com:oracle/helidon.git + HEAD + https://github.com/oracle/helidon + + + + + ossrh + Internal Helidon Release Repository + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + Tomas Langer + tomas.langer@oracle.com + Oracle Corporation + + + Tim Quinn + tim.quinn@oracle.com + Oracle Corporation + + + Romain Grecourt + romain.grecourt@oracle.com + Oracle Corporation + + + Laird Nelson + laird.nelson@oracle.com + Oracle Corporation + + + Santiago Pericas-Geertsen + santiago.pericasgeertsen@oracle.com + Oracle Corporation + + + Bryan Atsatt + bryan.atsatt@oracle.com + Oracle Corporation + + + Paul Parkinson + paul.parkinson@oracle.com + Oracle Corporation + + + Joe Di Pol + joe.dipol@oracle.com + Oracle Corporation + + + Dmitry Kornilov + dmitry.kornilov@oracle.com + Oracle Corporation + + + + + 3.1.0 + 2.8.2 + 3.0.0-M1 + 1.6.7 + + + + + + + org.apache.maven.plugins + maven-clean-plugin + ${version.plugin.clean} + + + org.apache.maven.plugins + maven-deploy-plugin + ${version.plugin.deploy} + + + org.apache.maven.plugins + maven-install-plugin + ${version.plugin.install} + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${version.plugin.nexus-staging} + + ossrh + https://oss.sonatype.org/ + true + true + ${maven.deploy.skip} + + + + + + diff --git a/pom.xml b/pom.xml index 9dcf27236..137097df6 100644 --- a/pom.xml +++ b/pom.xml @@ -20,71 +20,18 @@ 4.0.0 - io.helidon + + io.helidon + helidon-3rdparty + 1.2.2-SNAPSHOT + ./3rdparty/pom.xml + helidon-project - 1.2.2-SNAPSHOT pom Helidon Project - Java libraries for writing microservices - https://helidon.io - - - Oracle Corporation - http://www.oracle.com/ - - - 2018 - - - - Apache 2.0 - https://www.apache.org/licenses/LICENSE-2.0 - - - - - - Tomas Langer - tomas.langer@oracle.com - Oracle Corporation - - - Tim Quinn - tim.quinn@oracle.com - Oracle Corporation - - - Romain Grecourt - romain.grecourt@oracle.com - Oracle Corporation - - - Laird Nelson - laird.nelson@oracle.com - Oracle Corporation - - - Santiago Pericas-Geertsen - santiago.pericasgeertsen@oracle.com - Oracle Corporation - - - Bryan Atsatt - bryan.atsatt@oracle.com - Oracle Corporation - - - - - scm:git:git@github.com:oracle/helidon.git - scm:git:git@github.com:oracle/helidon.git - HEAD - https://github.com/oracle/helidon - - all UTF-8 @@ -103,94 +50,23 @@ Changing these version requires approval for a new third party dependency! --> - 1.2.0 - 1.3.1 - 4.5.5 1.4.0.Final 2.0.0.Final 1.5.4.1 6.0 - 0.31.0 - 2.0 8.18 - 2.7.4 - 3.0.0 - 3.0.0 - 2.16.0 - 1.23.0 - 19.2.0 2.4.14 - 1.22.1 - 25.0-jre - 1.4.197 - 1.3 - 5.4.4.Final - 2.7.8 - 1 - - 2.9.9 - 2.9.9.20190807 - 0.34.0 - 2.2.2 - 2.1.1.Final - 2.3.0 - 2.3.0.1 - 2.3.2 - 2.1 - 7.6.0.Final - 2.9.0 - 2.29.1 4.9.0.201710071750-r - 1.19 - 1.0.1 - 1.1.2 - 1.1.2 3.0.2 - 5.1.0 - 1.3 - 1.3 - 2.0.1 - 1.1.1 - 1.1 - 2.0.1 - 1.1.2 - 2.0 - 1.3.1 - 1.3.3 - 2.23.4 - 8.0.11 - 5.9.3.Final - 4.1.39.Final - 2.0.25.Final - 1.5.2 - 19.3.0.0 - 0.31.0 - 0.0.12 - 2.2 - 0.6.0 - 3.5.1 - 1.0.2 - 3.1.5.RELEASE + 2.0.25.Final 0.9.1 0.1.0 2.0.8 - 1.7.26 - 1.1.1 - 1.24 - 3.0.0-M3 3.1.12 + 3.0.0-M3 6.13.1 - 1.2 - 1.3.3 - 19.3.0.0 - 2.0.1.Final - 3.1.1.Final - 2.6.0 2.12.5 5.0.11 - 1.5.18 - 1.1.0 - 1.0.3 3.14.1 3.1.6 - com.fasterxml.jackson.core - jackson-annotations - ${version.lib.jackson} - - - io.jaegertracing - jaeger-client - ${version.lib.jaegertracing} - - - io.projectreactor - reactor-core - ${version.lib.reactor} - - - io.opentracing - opentracing-util - ${version.lib.opentracing} - - - io.opentracing - opentracing-api - ${version.lib.opentracing} - - - io.opentracing - opentracing-noop - ${version.lib.opentracing} - io.opentracing opentracing-mock ${version.lib.opentracing} - test - - - javax.xml.bind - jaxb-api - ${version.lib.jaxb-api} - - - com.sun.xml.bind - jaxb-core - ${version.lib.jaxb-core} - - - com.sun.xml.bind - jaxb-impl - ${version.lib.jaxb-impl} - - - javax.ws.rs - javax.ws.rs-api - ${version.lib.jaxrs-api} - - - javax.enterprise - cdi-api - ${version.lib.cdi-api} - - - javax.el - javax.el-api - ${version.lib.el-api} - - - javax.annotation - javax.annotation-api - ${version.lib.annotation-api} - - - javax.inject - javax.inject - ${version.lib.inject} - - - javax.json - javax.json-api - ${version.lib.jsonp-api} - - - jakarta.json.bind - jakarta.json.bind-api - ${version.lib.jsonb-api} - - - org.glassfish - javax.json - ${version.lib.jsonp-impl} - - - - org.glassfish - javax.el - ${version.lib.el-impl} - - - io.netty - netty-handler - ${version.lib.netty} - - - io.netty - netty-codec-dns - ${version.lib.netty} - - - io.netty - netty-resolver-dns - ${version.lib.netty} - - - io.netty - netty-codec-http - ${version.lib.netty} - - - io.netty - netty-codec-http2 - ${version.lib.netty} - - - org.eclipse - yasson - ${version.lib.yasson} - - - - - com.typesafe - config - ${version.lib.typesafe-config} - - - org.yaml - snakeyaml - ${version.lib.snakeyaml} com.github.akarnokd @@ -982,55 +683,10 @@ restito ${version.lib.restito} - - org.mousio - etcd4j - ${version.lib.etcd4j} - - - io.grpc - grpc-core - ${version.lib.grpc} - - - io.grpc - grpc-context - ${version.lib.grpc} - - - io.grpc - grpc-protobuf - ${version.lib.grpc} - - - io.grpc - grpc-stub - ${version.lib.grpc} - - - io.grpc - grpc-services - ${version.lib.grpc} - - - io.grpc - grpc-netty - ${version.lib.grpc} - io.netty netty-tcnative-boringssl-static - ${version.netty.tcnative} - - - io.opentracing.contrib - opentracing-grpc - ${version.lib.opentracing.grpc} - - - com.google.protobuf - protobuf-java - ${version.lib.protobuf.java} + ${version.lib.netty.tcnative} org.eclipse.jgit @@ -1042,13 +698,6 @@ org.eclipse.jgit.junit ${version.lib.jgit} - - - - io.zipkin.reporter2 - zipkin-sender-urlconnection - ${version.lib.zipkin} - io.zipkin.zipkin2 zipkin-junit @@ -1059,124 +708,32 @@ bedrock-testing-support ${version.lib.bedrock} - - com.google.guava - guava - ${version.lib.guava} - - - io.prometheus - simpleclient - ${version.lib.prometheus} - com.github.spotbugs spotbugs-annotations ${version.lib.spotbugs-annotations} - - io.opentracing.brave - brave-opentracing - ${version.lib.brave-opentracing} - - - org.reactivestreams - reactive-streams - ${version.lib.reactivestreams} - org.reactivestreams reactive-streams-tck ${version.lib.reactivestreams} - - - - - org.apache.httpcomponents - httpclient - ${version.lib.apache-httpclient} - - - - com.google.api-client - google-api-client - ${version.lib.google-api-client} - - - - org.apache.httpcomponents - httpclient - - - - com.google.guava - guava-jdk5 - - - - com.fasterxml.jackson.core - jackson-core - - - - com.google.code.findbugs - jsr305 - - - com.google.code.findbugs jsr305 ${version.lib.jsr305} - - - - org.jboss.weld - weld-core-bom - ${version.lib.weld} - pom - import - - - org.jboss.weld.se - weld-se-core - ${version.lib.weld} - - - - org.codehaus.groovy - groovy-all - - - org.codehaus.groovy groovy-all ${version.lib.groovy-all} - - org.eclipse.microprofile.config - microprofile-config-api - ${version.lib.microprofile-config-api} - - - org.eclipse.microprofile.health - microprofile-health-api - ${version.lib.microprofile-health} - org.eclipse.microprofile.health microprofile-health-tck ${version.lib.microprofile-health} - - org.eclipse.microprofile.jwt - microprofile-jwt-auth-api - ${version.lib.microprofile-jwt} - org.eclipse.microprofile.jwt microprofile-jwt-auth-tck @@ -1187,23 +744,12 @@ microprofile-jwt-auth-tck ${version.lib.microprofile-jwt} test-jar - test - - - org.eclipse.microprofile.fault-tolerance - microprofile-fault-tolerance-api - ${version.lib.microprofile-fault-tolerance-api} org.eclipse.microprofile.fault-tolerance microprofile-fault-tolerance-tck ${version.lib.microprofile-fault-tolerance-api} - - org.eclipse.microprofile.opentracing - microprofile-opentracing-api - ${version.lib.microprofile-tracing} - org.eclipse.microprofile.opentracing microprofile-opentracing-tck @@ -1214,45 +760,15 @@ microprofile-opentracing-tck-rest-client ${version.lib.microprofile-tracing} - - org.eclipse.microprofile.rest.client - microprofile-rest-client-api - ${version.lib.microprofile-rest-client} - org.eclipse.microprofile.rest.client microprofile-rest-client-tck ${version.lib.microprofile-rest-client} - com.netflix.hystrix - hystrix-core - ${version.lib.hystrix} - - - net.jodah - failsafe - ${version.lib.failsafe} - - - org.jboss - jandex - ${version.lib.jandex} - - - org.slf4j - slf4j-api - ${version.lib.slf4j} - - - org.slf4j - slf4j-jdk14 - ${version.lib.slf4j} - - - org.slf4j - slf4j-simple - ${version.lib.slf4j} + org.eclipse.microprofile.openapi + microprofile-openapi-tck + ${version.lib.microprofile-openapi-api} org.testng @@ -1269,6 +785,11 @@ arquillian-testenricher-cdi ${version.lib.arquillian} + + org.jboss.arquillian.container + arquillian-container-test-spi + ${version.lib.arquillian} + org.jboss.arquillian.protocol arquillian-protocol-servlet @@ -1292,7 +813,7 @@ org.eclipse.microprofile.config microprofile-config-tck - ${version.lib.microprofile-config-tck} + ${version.lib.microprofile-config} - - jakarta.persistence - jakarta.persistence-api - ${version.lib.jakarta-persistence-api} - - - javax.persistence - javax.persistence-api - ${version.lib.persistence-api} - - - javax.transaction - javax.transaction-api - ${version.lib.transaction-api} - - - javax.validation - validation-api - ${version.lib.validation-api} - - - com.h2database - h2 - ${version.lib.h2} - - - - com.oracle.jdbc - ojdbc8 - ${version.lib.ojdbc8} - - - com.oracle.jdbc - ucp - ${version.lib.ucp} - jar - - - mysql - mysql-connector-java - ${version.lib.mysql-connector-java} - - - com.oracle.oci.sdk - oci-java-sdk-objectstorage - ${version.lib.oci-java-sdk-objectstorage} - pom - - - com.zaxxer - HikariCP - ${version.lib.hikaricp} - - - redis.clients - jedis - ${version.lib.jedis} - - - org.eclipse.persistence - org.eclipse.persistence.jpa - ${version.lib.eclipselink} - - - org.hibernate - hibernate-core - ${version.lib.hibernate} - - - org.jboss.narayana.jta - cdi - ${version.lib.narayana} - - - org.jboss.spec.javax.resource - jboss-connector-api_1.7_spec - - - sun.jdk - jconsole - - - - - org.jboss - jboss-transaction-spi - ${version.lib.jboss-transaction-spi} - - - org.jboss.spec.javax.resource - jboss-connector-api_1.7_spec - - - - - org.graalvm.sdk - graal-sdk - ${version.lib.graalvm} - - - com.oracle.substratevm - svm - ${version.lib.graalvm} - - - - - org.mockito - mockito-core - ${version.lib.mockito} - - - org.junit.jupiter - junit-jupiter-api - ${version.lib.junit} - - - org.junit.jupiter - junit-jupiter-params - ${version.lib.junit} - - - org.junit.jupiter - junit-jupiter-engine - ${version.lib.junit} - - - org.hamcrest - hamcrest-all - ${version.lib.hamcrest} - - - org.hamcrest - hamcrest-core - ${version.lib.hamcrest} - - - org.openjdk.jmh - jmh-core - ${version.lib.jmh} - - - org.openjdk.jmh - jmh-generator-annprocess - ${version.lib.jmh} - - - javax.activation - javax.activation-api - ${version.lib.activation-api} - com.squareup.okhttp3 okhttp diff --git a/security/abac/policy-el/pom.xml b/security/abac/policy-el/pom.xml index d3f98ff35..69a1fa426 100644 --- a/security/abac/policy-el/pom.xml +++ b/security/abac/policy-el/pom.xml @@ -37,7 +37,6 @@ io.helidon.security.abac helidon-security-abac-policy - ${project.version} javax.el diff --git a/security/abac/policy/pom.xml b/security/abac/policy/pom.xml index 639df4e3e..fd8c9b638 100644 --- a/security/abac/policy/pom.xml +++ b/security/abac/policy/pom.xml @@ -37,7 +37,6 @@ io.helidon.security.providers helidon-security-providers-abac - ${project.version} org.junit.jupiter diff --git a/security/abac/role/pom.xml b/security/abac/role/pom.xml index d2ad14f22..3343bcf2e 100644 --- a/security/abac/role/pom.xml +++ b/security/abac/role/pom.xml @@ -37,17 +37,14 @@ io.helidon.security.providers helidon-security-providers-abac - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} test diff --git a/security/abac/scope/pom.xml b/security/abac/scope/pom.xml index e5ab93a1c..5cc5b01fc 100644 --- a/security/abac/scope/pom.xml +++ b/security/abac/scope/pom.xml @@ -37,7 +37,6 @@ io.helidon.security.providers helidon-security-providers-abac - ${project.version} org.junit.jupiter diff --git a/security/abac/time/pom.xml b/security/abac/time/pom.xml index b354e90bd..1db06bdc4 100644 --- a/security/abac/time/pom.xml +++ b/security/abac/time/pom.xml @@ -37,7 +37,6 @@ io.helidon.security.providers helidon-security-providers-abac - ${project.version} org.junit.jupiter diff --git a/security/annotations/pom.xml b/security/annotations/pom.xml index 7b2e7d449..8a1ee7fb9 100644 --- a/security/annotations/pom.xml +++ b/security/annotations/pom.xml @@ -33,7 +33,6 @@ io.helidon.security helidon-security - ${project.version} diff --git a/security/integration/common/pom.xml b/security/integration/common/pom.xml index 2668e3a7a..7024ac914 100644 --- a/security/integration/common/pom.xml +++ b/security/integration/common/pom.xml @@ -33,12 +33,10 @@ io.helidon.security helidon-security - ${project.version} io.helidon.tracing helidon-tracing-config - ${project.version} - \ No newline at end of file + diff --git a/security/integration/grpc/pom.xml b/security/integration/grpc/pom.xml index 9e8c3cff7..41f02cefd 100644 --- a/security/integration/grpc/pom.xml +++ b/security/integration/grpc/pom.xml @@ -33,34 +33,28 @@ io.helidon.security helidon-security - ${project.version} io.helidon.security.integration helidon-security-integration-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.grpc helidon-grpc-server - ${project.version} provided io.helidon.security helidon-security-util - ${project.version} io.helidon.grpc helidon-grpc-client - ${project.version} test @@ -70,37 +64,31 @@ io.helidon.security.integration helidon-security-integration-webserver - ${project.version} test io.helidon.security.integration helidon-security-integration-jersey-client - ${project.version} test io.helidon.security.providers helidon-security-providers-http-auth - ${project.version} test io.helidon.security.providers helidon-security-providers-abac - ${project.version} test io.helidon.config helidon-config-encryption - ${project.version} test io.helidon.bundles helidon-bundles-config - ${project.version} test @@ -116,7 +104,6 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test diff --git a/security/integration/jersey-client/pom.xml b/security/integration/jersey-client/pom.xml index 7d2230060..5d6351edd 100644 --- a/security/integration/jersey-client/pom.xml +++ b/security/integration/jersey-client/pom.xml @@ -31,27 +31,22 @@ io.helidon.security helidon-security - ${project.version} io.helidon.security.integration helidon-security-integration-common - ${project.version} io.helidon.tracing helidon-tracing-config - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.jersey helidon-jersey-common - ${project.version} javax.ws.rs @@ -62,12 +57,10 @@ io.helidon.jersey helidon-jersey-client provided - ${project.version} io.helidon.webclient helidon-webclient-jaxrs - ${project.version} org.junit.jupiter @@ -80,4 +73,4 @@ test - \ No newline at end of file + diff --git a/security/integration/jersey/pom.xml b/security/integration/jersey/pom.xml index 285f12ae7..0e1b4059c 100644 --- a/security/integration/jersey/pom.xml +++ b/security/integration/jersey/pom.xml @@ -33,42 +33,34 @@ io.helidon.security helidon-security - ${project.version} io.helidon.security.integration helidon-security-integration-common - ${project.version} io.helidon.tracing helidon-tracing-config - ${project.version} io.helidon.security helidon-security-annotations - ${project.version} io.helidon.security helidon-security-util - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.jersey helidon-jersey-common - ${project.version} io.helidon.common helidon-common-service-loader - ${project.version} javax.ws.rs @@ -79,18 +71,15 @@ io.helidon.jersey helidon-jersey-client provided - ${project.version} io.helidon.webclient helidon-webclient-jaxrs - ${project.version} io.helidon.jersey helidon-jersey-server provided - ${project.version} io.opentracing @@ -104,7 +93,6 @@ io.helidon.bundles helidon-bundles-config - ${project.version} test @@ -136,13 +124,11 @@ io.helidon.webserver helidon-webserver - ${project.version} test io.helidon.webserver helidon-webserver-jersey - ${project.version} test diff --git a/security/integration/webserver/pom.xml b/security/integration/webserver/pom.xml index 44a5c7683..574e7f55d 100644 --- a/security/integration/webserver/pom.xml +++ b/security/integration/webserver/pom.xml @@ -33,28 +33,23 @@ io.helidon.security helidon-security - ${project.version} io.helidon.security.integration helidon-security-integration-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} provided io.helidon.security helidon-security-util - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.security helidon-security-jwt - ${project.version} io.helidon.jersey helidon-jersey-client - ${project.version} io.helidon.jersey helidon-jersey-media-jsonp - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} test diff --git a/security/providers/oidc/pom.xml b/security/providers/oidc/pom.xml index 99bc0ff9a..376c26897 100644 --- a/security/providers/oidc/pom.xml +++ b/security/providers/oidc/pom.xml @@ -37,59 +37,48 @@ io.helidon.security helidon-security - ${project.version} io.helidon.security helidon-security-jwt - ${project.version} io.helidon.security.providers helidon-security-providers-oidc-common - ${project.version} io.helidon.security.abac helidon-security-abac-scope - ${project.version} io.helidon.security.providers helidon-security-providers-common - ${project.version} io.helidon.security.integration helidon-security-integration-webserver - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} test io.helidon.jersey helidon-jersey-client - ${project.version} provided io.helidon.jersey helidon-jersey-media-jsonp - ${project.version} provided diff --git a/security/security/pom.xml b/security/security/pom.xml index 3fc5b31ad..eb6a0fb02 100644 --- a/security/security/pom.xml +++ b/security/security/pom.xml @@ -37,27 +37,22 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-configurable - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.helidon.security helidon-security-util - ${project.version} io.helidon.config helidon-config - ${project.version} io.opentracing @@ -66,7 +61,6 @@ io.helidon.bundles helidon-bundles-config - ${project.version} test diff --git a/security/util/pom.xml b/security/util/pom.xml index 546e0b2bb..ee0af4cd0 100644 --- a/security/util/pom.xml +++ b/security/util/pom.xml @@ -37,17 +37,14 @@ io.helidon.common helidon-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.bundles helidon-bundles-config - ${project.version} test diff --git a/tests/apps/bookstore/bookstore-mp/pom.xml b/tests/apps/bookstore/bookstore-mp/pom.xml index 5f5bb8901..43bb6adfd 100644 --- a/tests/apps/bookstore/bookstore-mp/pom.xml +++ b/tests/apps/bookstore/bookstore-mp/pom.xml @@ -19,13 +19,12 @@ 4.0.0 - - io.helidon.tests.apps.bookstore - helidon-tests-apps-bookstore-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml - io.helidon.tests.apps.bookstore.bookstore-mp bookstore-mp @@ -33,107 +32,12 @@ io.helidon.tests.apps.bookstore.mp.Main - 8 - ${maven.compiler.source} - libs - ${project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 - -Dfile.encoding=UTF-8 - - ${project.artifactId} - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - false - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-dockerfile - process-resources - - copy-resources - - - ${project.build.directory} - - - true - src/main/docker - - Dockerfile - - - - true - src/main/k8s - - app.yaml - - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ${libs.classpath.prefix} - ${mainClass} - - - - - - org.jboss.jandex - jandex-maven-plugin - - - make-index - - jandex - - process-classes - - - - - - io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} org.glassfish.jersey.media @@ -166,4 +70,27 @@ test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + diff --git a/tests/apps/bookstore/bookstore-se/pom.xml b/tests/apps/bookstore/bookstore-se/pom.xml index a1f3c560f..1742dbd88 100644 --- a/tests/apps/bookstore/bookstore-se/pom.xml +++ b/tests/apps/bookstore/bookstore-se/pom.xml @@ -18,118 +18,21 @@ --> - - io.helidon.tests.apps.bookstore - helidon-tests-apps-bookstore-project - 1.2.2-SNAPSHOT - - 4.0.0 - + + io.helidon.applications + helidon-se + 1.2.2-SNAPSHOT + ../../../../applications/se/pom.xml + io.helidon.tests.apps.bookstore.bookstore-se bookstore-se - jar Helidon SE Bookstore io.helidon.tests.apps.bookstore.se.Main - 8 - ${maven.compiler.source} - libs - ${project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 - -Dfile.encoding=UTF-8 - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - false - - - - - - org.apache.maven.plugins - maven-resources-plugin - - - copy-dockerfile - process-resources - - copy-resources - - - ${project.build.directory} - - - true - src/main/docker - - Dockerfile - - - - true - src/main/k8s - - app.yaml - - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${libs.classpath.prefix} - ${mainClass} - - - - - - - - - - - io.helidon - helidon-bom - ${project.version} - pom - import - - - - io.helidon.bundles @@ -151,21 +54,13 @@ io.helidon.metrics helidon-metrics2 - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - runtime - io.helidon.media.jsonb helidon-media-jsonb-server - ${project.version} io.helidon.media.jackson helidon-media-jackson-server - ${project.version} io.helidon.tests.apps.bookstore.common @@ -185,7 +80,22 @@ com.squareup.okhttp3 okhttp + 3.14.1 test + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + diff --git a/tests/functional/bookstore/pom.xml b/tests/functional/bookstore/pom.xml index 323af4c57..a4e5ad2da 100644 --- a/tests/functional/bookstore/pom.xml +++ b/tests/functional/bookstore/pom.xml @@ -19,13 +19,11 @@ 4.0.0 - io.helidon.tests.functional helidon-tests-functional-project 1.2.2-SNAPSHOT - io.helidon.tests.functional.bookstore helidon-tests-functional-bookstore @@ -76,7 +74,6 @@ io.helidon.media.jsonp helidon-media-jsonp-server - ${project.version} test diff --git a/tests/functional/context-propagation/pom.xml b/tests/functional/context-propagation/pom.xml index 2af131b35..9de00013a 100644 --- a/tests/functional/context-propagation/pom.xml +++ b/tests/functional/context-propagation/pom.xml @@ -18,12 +18,12 @@ + 4.0.0 helidon-tests-functional-project io.helidon.tests.functional 1.2.2-SNAPSHOT - 4.0.0 helidon-tests-functional-context-propagation Functional Test: Helidon Context Propagation @@ -32,12 +32,10 @@ io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.junit.jupiter @@ -54,11 +52,5 @@ junit-jupiter-params test - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - test - - \ No newline at end of file + diff --git a/tests/functional/jax-rs-subresource/pom.xml b/tests/functional/jax-rs-subresource/pom.xml index 7a90e77da..3ddc63957 100644 --- a/tests/functional/jax-rs-subresource/pom.xml +++ b/tests/functional/jax-rs-subresource/pom.xml @@ -18,13 +18,12 @@ + 4.0.0 helidon-tests-functional-project io.helidon.tests.functional 1.2.2-SNAPSHOT - 4.0.0 - helidon-tests-functional-jax-rs-subresource Functional Test: JAX-RS Subresources @@ -32,12 +31,10 @@ io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.junit.jupiter @@ -54,11 +51,5 @@ junit-jupiter-params test - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - runtime - diff --git a/tests/functional/multiport/pom.xml b/tests/functional/multiport/pom.xml index 09da2671f..051c184f7 100644 --- a/tests/functional/multiport/pom.xml +++ b/tests/functional/multiport/pom.xml @@ -18,13 +18,12 @@ + 4.0.0 helidon-tests-functional-project io.helidon.tests.functional 1.2.2-SNAPSHOT - 4.0.0 - helidon-tests-functional-multiport Functional Test: Multiport with MP @@ -32,12 +31,10 @@ io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} io.helidon.config helidon-config-yaml - ${project.version} org.junit.jupiter @@ -54,11 +51,5 @@ junit-jupiter-params test - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics2-api} - runtime - diff --git a/tests/integration/health/mp-disabled/pom.xml b/tests/integration/health/mp-disabled/pom.xml index bcab1cdee..1cf5ac77a 100644 --- a/tests/integration/health/mp-disabled/pom.xml +++ b/tests/integration/health/mp-disabled/pom.xml @@ -19,20 +19,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - io.helidon.tests.integration.health - helidon-tests-integration-health-project + io.helidon.applications + helidon-mp 1.2.2-SNAPSHOT + ../../../../applications/mp/pom.xml - + io.helidon.tests.integration.health heldion-tests-integration-health-disabled + Helidon Integration Test Health Disabled io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} org.junit.jupiter @@ -47,7 +47,6 @@ io.helidon.jersey helidon-jersey-client - ${project.version} test diff --git a/tests/integration/health/pom.xml b/tests/integration/health/pom.xml index bd9ad998f..24b601e3d 100644 --- a/tests/integration/health/pom.xml +++ b/tests/integration/health/pom.xml @@ -24,13 +24,10 @@ io.helidon.tests.integration helidon-tests-integration 1.2.2-SNAPSHOT - ../pom.xml - - pom - io.helidon.tests.integration.health helidon-tests-integration-health-project + pom Helidon Tests Integration Health Project @@ -38,7 +35,6 @@ - mp-disabled \ No newline at end of file diff --git a/tests/integration/mp-security-client/pom.xml b/tests/integration/mp-security-client/pom.xml index 34b4e2193..a0d758914 100644 --- a/tests/integration/mp-security-client/pom.xml +++ b/tests/integration/mp-security-client/pom.xml @@ -18,13 +18,14 @@ - - helidon-tests-integration - io.helidon.tests.integration - 1.2.2-SNAPSHOT - 4.0.0 - + + io.helidon.applications + helidon-mp + 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + + io.helidon.tests.integration helidon-tests-integration-mp-security-client Integration Test: MP Security with client @@ -32,7 +33,6 @@ io.helidon.microprofile.bundles helidon-microprofile-3.0 - ${project.version} org.junit.jupiter @@ -45,4 +45,4 @@ test - \ No newline at end of file + diff --git a/tests/integration/native-image/se-1/pom.xml b/tests/integration/native-image/se-1/pom.xml index 75fb63523..b80d46d66 100644 --- a/tests/integration/native-image/se-1/pom.xml +++ b/tests/integration/native-image/se-1/pom.xml @@ -19,15 +19,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - io.helidon.tests.integration - helidon-tests-integration-native-image + io.helidon.applications + helidon-se 1.2.2-SNAPSHOT - ../pom.xml + ../../../../applications/se/pom.xml - - + io.helidon.tests.integration helidon-tests-native-image-se-1 @@ -57,120 +55,9 @@ - 1.0.10 io.helidon.tests.integration.nativeimage.se1.Se1Main - ${mainClass} - 8 - ${maven.compiler.source} - libs - ${project.build.directory}/${libs.classpath.prefix} - UTF-8 - UTF-8 - -Dfile.encoding=UTF-8 - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.junit.platform - junit-platform-surefire-provider - 1.1.0 - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.9 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - ${libs.classpath.prefix} - ${mainClass} - false - - - - - - io.helidon.build-tools - helidon-maven-plugin - ${helidon.plugin.version} - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${copied.libs.dir} - false - false - true - true - runtime - test - - - - - - - - - - - io.helidon - helidon-bom - ${project.version} - pom - import - - - org.junit.jupiter - junit-jupiter-api - 5.1.0 - - - org.junit.jupiter - junit-jupiter-engine - 5.1.0 - - - - io.helidon.webserver @@ -237,30 +124,4 @@ - - - native-image - - - - io.helidon.build-tools - helidon-maven-plugin - - - - native-image - - - - - - - - - io.helidon.integrations.graal - helidon-graal-native-image-extension - - - - - \ No newline at end of file + diff --git a/tests/integration/native-image/static-content/pom.xml b/tests/integration/native-image/static-content/pom.xml index aa0639a78..95969ae01 100644 --- a/tests/integration/native-image/static-content/pom.xml +++ b/tests/integration/native-image/static-content/pom.xml @@ -16,19 +16,18 @@ --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 io.helidon.tests.integration helidon-tests-integration-native-image 1.2.2-SNAPSHOT - 4.0.0 - + io.helidon.tests.integration helidon-tests-native-image-static-content Static content jar file to use in other tests (to make sure we access a jar file and not a path). - \ No newline at end of file diff --git a/tests/integration/zipkin-mp-2.2/pom.xml b/tests/integration/zipkin-mp-2.2/pom.xml index 668c4cf8d..0f483ac01 100644 --- a/tests/integration/zipkin-mp-2.2/pom.xml +++ b/tests/integration/zipkin-mp-2.2/pom.xml @@ -18,13 +18,14 @@ - - helidon-tests-integration - io.helidon.tests.integration - 1.2.2-SNAPSHOT - 4.0.0 - + + io.helidon.applications + helidon-mp + 1.2.2-SNAPSHOT + ../../../applications/mp/pom.xml + + io.helidon.tests.integration helidon-tests-integration-zipkin-mp-2-2 Integration Test: Zipkin with MP @@ -32,18 +33,21 @@ io.helidon.microprofile.bundles helidon-microprofile-2.2 - ${project.version} - - - - org.eclipse.microprofile.metrics - microprofile-metrics-api - ${version.lib.microprofile-metrics-api} io.helidon.tracing helidon-tracing-zipkin - ${project.version} + + + org.jboss + jandex + runtime + true + + + javax.activation + javax.activation-api + runtime org.junit.jupiter @@ -56,4 +60,27 @@ test - \ No newline at end of file + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-libs + + + + + org.jboss.jandex + jandex-maven-plugin + + + make-index + + + + + + diff --git a/tracing/config/pom.xml b/tracing/config/pom.xml index fbf713474..ddcefdebd 100644 --- a/tracing/config/pom.xml +++ b/tracing/config/pom.xml @@ -36,17 +36,14 @@ io.helidon.common helidon-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common-context - ${project.version} org.junit.jupiter @@ -61,9 +58,8 @@ io.helidon.config helidon-config-yaml - ${project.version} test - \ No newline at end of file + diff --git a/tracing/jaeger/pom.xml b/tracing/jaeger/pom.xml index 34529d295..c2fc9596d 100644 --- a/tracing/jaeger/pom.xml +++ b/tracing/jaeger/pom.xml @@ -40,17 +40,14 @@ io.helidon.common helidon-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.opentracing @@ -83,8 +80,7 @@ io.helidon.config helidon-config-yaml - ${project.version} test - \ No newline at end of file + diff --git a/tracing/jersey-client/pom.xml b/tracing/jersey-client/pom.xml index bd87bf951..cb65037b5 100644 --- a/tracing/jersey-client/pom.xml +++ b/tracing/jersey-client/pom.xml @@ -40,32 +40,26 @@ io.helidon.common helidon-common - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.helidon.tracing helidon-tracing-config - ${project.version} io.helidon.common helidon-common-context - ${project.version} io.helidon.webclient helidon-webclient-jaxrs - ${project.version} io.helidon.jersey helidon-jersey-client - ${project.version} provided diff --git a/tracing/jersey/pom.xml b/tracing/jersey/pom.xml index e5efc3784..d4e5dbe83 100644 --- a/tracing/jersey/pom.xml +++ b/tracing/jersey/pom.xml @@ -36,33 +36,27 @@ io.helidon.tracing helidon-tracing - ${project.version} io.helidon.tracing helidon-tracing-jersey-client - ${project.version} io.helidon.jersey helidon-jersey-common - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.webserver helidon-webserver - ${project.version} provided io.helidon.jersey helidon-jersey-server - ${project.version} provided diff --git a/tracing/tests/it-tracing-client-zipkin/pom.xml b/tracing/tests/it-tracing-client-zipkin/pom.xml index 9567a7473..4a8bfd27a 100644 --- a/tracing/tests/it-tracing-client-zipkin/pom.xml +++ b/tracing/tests/it-tracing-client-zipkin/pom.xml @@ -50,19 +50,16 @@ io.helidon.webserver helidon-webserver - ${project.version} test io.helidon.tracing helidon-tracing-zipkin - ${project.version} test io.helidon.tracing helidon-tracing-jersey-client - ${project.version} test @@ -81,4 +78,4 @@ test - \ No newline at end of file + diff --git a/tracing/tracing/pom.xml b/tracing/tracing/pom.xml index 8c45bbe9c..20b4a40e9 100644 --- a/tracing/tracing/pom.xml +++ b/tracing/tracing/pom.xml @@ -36,17 +36,14 @@ io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-service-loader - ${project.version} io.helidon.config helidon-config - ${project.version} io.opentracing diff --git a/tracing/zipkin/pom.xml b/tracing/zipkin/pom.xml index 3a03af48b..bf849f90d 100644 --- a/tracing/zipkin/pom.xml +++ b/tracing/zipkin/pom.xml @@ -36,17 +36,14 @@ io.helidon.common helidon-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.tracing helidon-tracing - ${project.version} io.opentracing @@ -90,7 +87,6 @@ io.helidon.config helidon-config-yaml - ${project.version} test diff --git a/webclient/jaxrs/pom.xml b/webclient/jaxrs/pom.xml index de6f05f15..04d9df411 100644 --- a/webclient/jaxrs/pom.xml +++ b/webclient/jaxrs/pom.xml @@ -32,22 +32,18 @@ io.helidon.jersey helidon-jersey-client - ${project.version} io.helidon.common helidon-common-context - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common-configurable - ${project.version} - \ No newline at end of file + diff --git a/webserver/access-log/pom.xml b/webserver/access-log/pom.xml index ad4e4b0eb..565eb4a54 100644 --- a/webserver/access-log/pom.xml +++ b/webserver/access-log/pom.xml @@ -36,7 +36,6 @@ io.helidon.webserver helidon-webserver - ${project.version} org.junit.jupiter @@ -54,4 +53,4 @@ test - \ No newline at end of file + diff --git a/webserver/jersey/pom.xml b/webserver/jersey/pom.xml index e96a052af..019568be1 100644 --- a/webserver/jersey/pom.xml +++ b/webserver/jersey/pom.xml @@ -37,17 +37,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.opentracing @@ -56,7 +53,6 @@ io.helidon.jersey helidon-jersey-server - ${project.version} io.projectreactor @@ -65,13 +61,11 @@ io.helidon.webserver helidon-webserver-test-support - ${project.version} test io.helidon.jersey helidon-jersey-client - ${project.version} test diff --git a/webserver/test-support/pom.xml b/webserver/test-support/pom.xml index c58f1fc89..2670b0a00 100644 --- a/webserver/test-support/pom.xml +++ b/webserver/test-support/pom.xml @@ -33,17 +33,14 @@ io.helidon.webserver helidon-webserver - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-reactive - ${project.version} io.projectreactor diff --git a/webserver/webserver/pom.xml b/webserver/webserver/pom.xml index c564d2816..b9de89b7f 100644 --- a/webserver/webserver/pom.xml +++ b/webserver/webserver/pom.xml @@ -52,32 +52,26 @@ io.helidon.common helidon-common-reactive - ${project.version} io.helidon.common helidon-common - ${project.version} io.helidon.common helidon-common-http - ${project.version} io.helidon.media helidon-media-common - ${project.version} io.helidon.config helidon-config - ${project.version} io.helidon.common helidon-common-key-util - ${project.version} io.opentracing @@ -94,7 +88,6 @@ io.helidon.tracing helidon-tracing-config - ${project.version} io.netty @@ -136,13 +129,11 @@ io.helidon.config helidon-config-hocon - ${project.version} test io.helidon.config helidon-config-yaml - ${project.version} test