diff --git a/.gitignore b/.gitignore index be21168..ccf6332 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,15 @@ -# use glob syntax. -syntax: glob -.gradle/ +secrets.xlvals +kubernetes/build +kubernetes/.gradle -# Build output -#src/downloads/ -build/ -out/ -target/ -bin/ -test-output/ -.cache -# Maven -pom.xml - -# Eclipse -.metadata/ -.settings/ -.classpath -.project -.pydevproject -.scala_dependencies - -# IntelliJ +###################### +# Intellij +###################### .idea/ *.iml -*.ipr *.iws -*.log -s101plugin.state - -# Mac -.DS_Store - -# Cloud Provisioning -scenarios/cloud/src/runtime/keys/* +*.ipr +*.ids +*.orig +classes/ +out/ \ No newline at end of file diff --git a/.xebialabs/wrapper.conf b/.xebialabs/wrapper.conf new file mode 100755 index 0000000..10c68e3 --- /dev/null +++ b/.xebialabs/wrapper.conf @@ -0,0 +1,2 @@ +CLI_BASE_URL="https://s3.amazonaws.com/xl-cli/bin" +CLI_VERSION="8.5.0-alpha.20" \ No newline at end of file diff --git a/README.md b/README.md index feb4534..c8789ee 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,21 @@ -# A microservice e-commerce application demo +## e-commerce microservice application on AWS EKS -There is a version of this app with Consul as registry instead of JHipster Registry in the [consul branch](https://github.com/xebialabs/e-commerce-microservice/tree/consul) +The blueprint deploys an e-commerce microservice created using JHipster to AWS EKS. +XL deploy does the provisioning and deployment, while XL release orchestrates everything. -The stack is based on JHipster microservice architecture. Below are the componenets +### Prerequisites. -![Architecture][arch-image] +1. Git clone [https://github.com/xebialabs/e-commerce-microservice/tree/blueprint-demo](https://github.com/xebialabs/e-commerce-microservice/tree/blueprint-demo) +2. Generate the blueprint with `xl blueprint -t aws/microservice-ecommerce` -## Store app: -This is the Gateway to the mircoservices. Refer [this](https://github.com/xebialabs/e-commerce-microservice/store/README.md) +To deploy this blueprint with XL Platform follow the below steps -## Invoice app: +1. Move the `kubernetes` folder from the root directory into the xebialabs folder created by blueprint +2. Apply the generated yaml configurations -This is one of the mircoservices. Refer [this](https://github.com/xebialabs/e-commerce-microservice/invoice/README.md) + ``` + xl apply -f xebialabs.yaml + ``` -## Notification app: - -This is one of the mircoservices. Refer [this](https://github.com/xebialabs/e-commerce-microservice/notification/README.md) - - -## Docker compose files: - -The complete docker compose setup for the stack. Refer [this](https://github.com/xebialabs/e-commerce-microservice/docker-compose/README-DOCKER-COMPOSE.md) - -## Kubernetes files: - -The complete Kubernetes setup for the stack. Refer [this](https://github.com/xebialabs/e-commerce-microservice/xl-platform/kubernetes/README.md) - -## Xl Platform files: - -The complete XL-Platform setup for the stack. Refer [this](https://github.com/xebialabs/e-commerce-microservice/xl-platform/) - -## XLD files -XLD as-code yaml files that import the whole setup into an XLD instance. Mircorservices have dependencies on each other. Deploying store service will deploy also all other services. - - -[arch-image]: https://raw.githubusercontent.com/xebialabs/e-commerce-microservice/master/arch.png +3. Go to XL Release and look for the e-commerce-release-pipeline and start a new release from it. \ No newline at end of file diff --git a/cloudformation/cfn-secret-provider.zip b/cloudformation/cfn-secret-provider.zip new file mode 100644 index 0000000..4022922 Binary files /dev/null and b/cloudformation/cfn-secret-provider.zip differ diff --git a/xl-platform/cloudformation/eks-master.yaml b/cloudformation/eks-master.yaml similarity index 87% rename from xl-platform/cloudformation/eks-master.yaml rename to cloudformation/eks-master.yaml index 0ae6a94..dc9d932 100644 --- a/xl-platform/cloudformation/eks-master.yaml +++ b/cloudformation/eks-master.yaml @@ -1,10 +1,12 @@ --- AWSTemplateFormatVersion: '2010-09-09' -Description: 'Amazon EKS - Master for E-commerce Microservices Application' +Description: 'Amazon EKS - Master for Microservices Application' Parameters: - - VPCStack: + ProjectName: + Type: String + Default: "app" + VPCStackName: Type: String Description: VPC Stack Name Default: "eks-vpc" @@ -35,12 +37,12 @@ Resources: GroupDescription: Cluster communication with worker nodes VpcId: Fn::ImportValue: - !Sub "${VPCStack}-VPCID" + !Sub "${VPCStackName}-VPCID" Cluster: Type: "AWS::EKS::Cluster" Properties: - Name: "ecommerce-master" + Name: !Sub "${ProjectName}-master" Version: "1.10" RoleArn: !GetAtt ClusterRole.Arn ResourcesVpcConfig: @@ -48,9 +50,9 @@ Resources: - !Ref ClusterControlPlaneSecurityGroup SubnetIds: - Fn::ImportValue: - !Sub "${VPCStack}-subnetAID" + !Sub "${VPCStackName}-subnetAID" - Fn::ImportValue: - !Sub "${VPCStack}-subnetBID" + !Sub "${VPCStackName}-subnetBID" Outputs: ClusterName: @@ -86,4 +88,4 @@ Outputs: Description: ClusterControlPlaneSecurityGroup Export: Name: - Fn::Sub: "${AWS::StackName}-ClusterControlPlaneSecurityGroup" + Fn::Sub: "${AWS::StackName}-ClusterControlPlaneSecurityGroup" \ No newline at end of file diff --git a/xl-platform/cloudformation/eks-user.yaml b/cloudformation/eks-user.yaml similarity index 91% rename from xl-platform/cloudformation/eks-user.yaml rename to cloudformation/eks-user.yaml index 6825300..c94ca1f 100644 --- a/xl-platform/cloudformation/eks-user.yaml +++ b/cloudformation/eks-user.yaml @@ -2,22 +2,24 @@ AWSTemplateFormatVersion: '2010-09-09' Description: "Amazon EKS - KeyPair and User" Parameters: + ProjectName: + Type: String + Default: "app" S3BucketPrefix: Type: String - Default: 'binxio-public' CFNCustomProviderZipFileName: Type: String - Default: 'lambdas/cfn-secret-provider-0.12.2.zip' - Username: + Default: 'cfn-secret-provider.zip' + UserStackName: Type: String - Default: 'eks-ecommerce' + Default: 'eks-user' Resources: EksUser: Type: AWS::IAM::User Properties: - UserName: !Sub '${Username}' + UserName: !Sub '${UserStackName}' LambdaPolicy: Type: AWS::IAM::Policy DependsOn: @@ -72,7 +74,7 @@ Resources: Properties: Description: CloudFormation Custom:Secret implementation Code: - S3Bucket: !Sub '${S3BucketPrefix}-${AWS::Region}' + S3Bucket: !Ref 'S3BucketPrefix' S3Key: !Ref 'CFNCustomProviderZipFileName' FunctionName: 'binxio-cfn-secret-provider' Handler: secrets.handler @@ -106,7 +108,7 @@ Resources: Outputs: Username: - Value: !Sub '${Username}' + Value: !Sub '${UserStackName}' Description: EKS Username Export: Name: !Sub '${AWS::StackName}-user' @@ -116,7 +118,7 @@ Outputs: Export: Name: !Sub '${AWS::StackName}-user-arn' KeyPairName: - Value: !Sub '${Username}' + Value: !Sub '${UserStackName}' Description: KeyPair name for EKS Worker nodes Export: Name: !Sub '${AWS::StackName}-keypair' diff --git a/xl-platform/cloudformation/eks-vpc.yaml b/cloudformation/eks-vpc.yaml similarity index 87% rename from xl-platform/cloudformation/eks-vpc.yaml rename to cloudformation/eks-vpc.yaml index e8a6797..eaa21da 100644 --- a/xl-platform/cloudformation/eks-vpc.yaml +++ b/cloudformation/eks-vpc.yaml @@ -1,13 +1,19 @@ --- AWSTemplateFormatVersion: '2010-09-09' -Description: 'Amazon EKS - VPC for E-commerce Microservices Application' +Description: 'Amazon EKS - VPC for Microservices Application' Parameters: + ProjectName: + Type: String + Default: "app" AvailabilityZones: Description: 'List of Availability Zones to use for the subnets in the VPC. Note: The logical order is preserved.' Type: List - Default: 'eu-west-1a, eu-west-1b' + VPCStackName: + Type: String + Description: VPC Stack Name + Default: "eks-vpc" Resources: InternetGateway: @@ -15,7 +21,7 @@ Resources: Properties: Tags: - Key: Name - Value: 'eks-ecommerce' + Value: !Sub "eks-${ProjectName}" VPC: Type: AWS::EC2::VPC Properties: @@ -25,7 +31,7 @@ Resources: InstanceTenancy: default Tags: - Key: Name - Value: ecommerce-eks-vpc + Value: !Sub "${ProjectName}-${VPCStackName}" AttachGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: @@ -45,7 +51,7 @@ Resources: - Ref: AvailabilityZones Tags: - Key: Name - Value: ecommerce-eks-vpc-a + Value: !Sub "${ProjectName}-${VPCStackName}-a" subnetB: Type: AWS::EC2::Subnet Properties: @@ -58,7 +64,7 @@ Resources: - Ref: AvailabilityZones Tags: - Key: Name - Value: ecommerce-eks-vpc-b + Value: !Sub "${ProjectName}-${VPCStackName}-b" subnetARouteTable: Type: AWS::EC2::RouteTable Properties: diff --git a/xl-platform/cloudformation/eks-workers.yaml b/cloudformation/eks-workers.yaml similarity index 78% rename from xl-platform/cloudformation/eks-workers.yaml rename to cloudformation/eks-workers.yaml index 4b181a6..45967ad 100644 --- a/xl-platform/cloudformation/eks-workers.yaml +++ b/cloudformation/eks-workers.yaml @@ -1,11 +1,12 @@ ---- AWSTemplateFormatVersion: '2010-09-09' -Description: 'Amazon EKS - Workers for E-commerce Microservices Application' +Description: 'Amazon EKS - Workers for Microservices Application' + +## The XLD infrastructure and environment are created via XLD Cloudformation plugin here Metadata: XLD::Infrastructure: - - id: "EKS" + - id: "{ProjectName}/eks-{ProjectName}" type: "core.Directory" - - id: "EKS/EKS-CLUSTER" + - id: "{ProjectName}/eks-{ProjectName}/eks-cluster" type: "k8s.Master" apiServerURL: "{ClusterEndpoint}" skipTLS: "true" @@ -13,49 +14,55 @@ Metadata: clusterName: "{ClusterName}" accessKey: "dummy" accessSecret: "dummy" - - id: "EKS/EKS-CLUSTER/kube-system" + - id: "{ProjectName}/eks-{ProjectName}/eks-cluster/kube-system" type: "k8s.Namespace" namespaceName: "kube-system" XLD::Environments: - - id: "AWS-EKS-DICT" - type: "udm.Dictionary" - entries: + - id: "{ProjectName}/aws-eks-{ProjectName}-dictionary" + type: "udm.Dictionary" + entries: NODES_ROLE_ARN: "{NodeInstanceRole}" EKS_USER: "{EksUser}" EKS_USER_ARN: "{EksUserArn}" CLUSTER_ENDPOINT: "{ClusterEndpoint}" - - id: "AWS-EKS" - type: "udm.Environment" - members: - - ci ref: "Infrastructure/EKS/EKS-CLUSTER" - - id: "AWS-PREREQUISITE" - type: "udm.Environment" - members: - - ci ref: "Infrastructure/EKS/EKS-CLUSTER/kube-system" - dictionaries: - - ci ref: "Environments/AWS-EKS-DICT" -Parameters: + - id: "{ProjectName}/aws-eks-{ProjectName}" + type: "udm.Environment" + members: + - ci ref: "Infrastructure/{ProjectName}/eks-{ProjectName}/eks-cluster" + - id: "{ProjectName}/AWS-PREREQUISITE" + type: "udm.Environment" + members: + - ci ref: "Infrastructure/{ProjectName}/eks-{ProjectName}/eks-cluster/kube-system" + dictionaries: + - ci ref: "Environments/{ProjectName}/aws-eks-{ProjectName}-dictionary" - VPCStack: +Mappings: + RegionMap: + us-west-2: + "AmiId": "ami-0f54a2f7d2e9c88b3" + us-east-1: + "AmiId": "ami-0a0b913ef3249b655" + us-east-2: + "AmiId": "ami-0958a76db2d150238" + eu-west-1: + "AmiId": "ami-00c3b2d35bddd4f5c" + +Parameters: + ProjectName: + Type: String + Default: "app" + VPCStackName: Type: String Description: VPC Stack Name Default: "eks-vpc" - - UserStack: + UserStackName: Type: String Description: User Stack Name Default: "eks-user" - - ClusterStack: + ClusterStackName: Type: String Description: Cluster Stack Name Default: "eks-master" - - NodeImageId: - Type: AWS::EC2::Image::Id - Description: AMI id for the node instances. - Default: ami-0c7a4976cb6fafd3a - NodeInstanceType: Description: EC2 instance type for the node instances Type: String @@ -117,46 +124,38 @@ Parameters: - p3.8xlarge - p3.16xlarge ConstraintDescription: Must be a valid EC2 instance type - NodeAutoScalingGroupMinSize: Type: Number Description: Minimum size of Node Group ASG. Default: 1 - NodeAutoScalingGroupMaxSize: Type: Number Description: Maximum size of Node Group ASG. Default: 3 - NodeVolumeSize: Type: Number Description: Node volume size Default: 20 - ClusterName: Description: The cluster name provided when the cluster was created. If it is incorrect, nodes will not be able to join the cluster. Type: String - Default: "ecommerce-master" - + Default: app-master BootstrapArguments: Description: Arguments to pass to the bootstrap script. See files/bootstrap.sh in https://github.com/awslabs/amazon-eks-ami Default: "" Type: String - NodeGroupName: Description: Unique identifier for the Node Group. Type: String - Default: "one" + Default: app Resources: - NodeInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: "/" Roles: - !Ref NodeInstanceRole - NodeInstanceRole: Type: AWS::IAM::Role Properties: @@ -174,18 +173,16 @@ Resources: - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly - NodeSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for all nodes in the cluster VpcId: Fn::ImportValue: - !Sub "${VPCStack}-VPCID" + !Sub "${VPCStackName}-VPCID" Tags: - Key: !Sub "kubernetes.io/cluster/${ClusterName}" Value: 'owned' - NodeSecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress DependsOn: NodeSecurityGroup @@ -196,7 +193,6 @@ Resources: IpProtocol: '-1' FromPort: 0 ToPort: 65535 - NodeSecurityGroupFromControlPlaneIngress: Type: AWS::EC2::SecurityGroupIngress DependsOn: NodeSecurityGroup @@ -205,11 +201,10 @@ Resources: GroupId: !Ref NodeSecurityGroup SourceSecurityGroupId: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterControlPlaneSecurityGroup" + !Sub "${ClusterStackName}-ClusterControlPlaneSecurityGroup" IpProtocol: tcp FromPort: 1025 ToPort: 65535 - ControlPlaneEgressToNodeSecurityGroup: Type: AWS::EC2::SecurityGroupEgress DependsOn: NodeSecurityGroup @@ -217,12 +212,11 @@ Resources: Description: Allow the cluster control plane to communicate with worker Kubelet and pods GroupId: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterControlPlaneSecurityGroup" + !Sub "${ClusterStackName}-ClusterControlPlaneSecurityGroup" DestinationSecurityGroupId: !Ref NodeSecurityGroup IpProtocol: tcp FromPort: 1025 ToPort: 65535 - NodeSecurityGroupFromControlPlaneOn443Ingress: Type: AWS::EC2::SecurityGroupIngress DependsOn: NodeSecurityGroup @@ -231,11 +225,10 @@ Resources: GroupId: !Ref NodeSecurityGroup SourceSecurityGroupId: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterControlPlaneSecurityGroup" + !Sub "${ClusterStackName}-ClusterControlPlaneSecurityGroup" IpProtocol: tcp FromPort: 443 ToPort: 443 - ControlPlaneEgressToNodeSecurityGroupOn443: Type: AWS::EC2::SecurityGroupEgress DependsOn: NodeSecurityGroup @@ -243,12 +236,11 @@ Resources: Description: Allow the cluster control plane to communicate with pods running extension API servers on port 443 GroupId: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterControlPlaneSecurityGroup" + !Sub "${ClusterStackName}-ClusterControlPlaneSecurityGroup" DestinationSecurityGroupId: !Ref NodeSecurityGroup IpProtocol: tcp FromPort: 443 ToPort: 443 - ClusterControlPlaneSecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress DependsOn: NodeSecurityGroup @@ -256,12 +248,11 @@ Resources: Description: Allow pods to communicate with the cluster API Server GroupId: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterControlPlaneSecurityGroup" + !Sub "${ClusterStackName}-ClusterControlPlaneSecurityGroup" SourceSecurityGroupId: !Ref NodeSecurityGroup IpProtocol: tcp ToPort: 443 FromPort: 443 - NodeGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: @@ -271,9 +262,9 @@ Resources: MaxSize: !Ref NodeAutoScalingGroupMaxSize VPCZoneIdentifier: - Fn::ImportValue: - !Sub "${VPCStack}-subnetAID" + !Sub "${VPCStackName}-subnetAID" - Fn::ImportValue: - !Sub "${VPCStack}-subnetBID" + !Sub "${VPCStackName}-subnetBID" Tags: - Key: Name Value: !Sub "${ClusterName}-${NodeGroupName}-Node" @@ -285,17 +276,16 @@ Resources: AutoScalingRollingUpdate: MinInstancesInService: '1' MaxBatchSize: '1' - NodeLaunchConfig: Type: AWS::AutoScaling::LaunchConfiguration Properties: AssociatePublicIpAddress: 'true' IamInstanceProfile: !Ref NodeInstanceProfile - ImageId: !Ref NodeImageId + ImageId: !FindInMap ["RegionMap", Ref: "AWS::Region", "AmiId"] InstanceType: !Ref NodeInstanceType KeyName: Fn::ImportValue: - !Sub "${UserStack}-keypair" + !Sub "${UserStackName}-keypair" SecurityGroups: - !Ref NodeSecurityGroup BlockDeviceMappings: @@ -316,22 +306,25 @@ Resources: --region ${AWS::Region} Outputs: + ProjectName: + Description: The name of the project + Value: !Sub '${ProjectName}' NodeInstanceRole: Description: The node instance role Value: !GetAtt NodeInstanceRole.Arn EksUser: Value: Fn::ImportValue: - !Sub "${UserStack}-user" + !Sub "${UserStackName}-user" EksUserArn: Value: Fn::ImportValue: - !Sub "${UserStack}-user-arn" + !Sub "${UserStackName}-user-arn" ClusterEndpoint: Value: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterEndpoint" + !Sub "${ClusterStackName}-ClusterEndpoint" ClusterName: Value: Fn::ImportValue: - !Sub "${ClusterStack}-ClusterName" \ No newline at end of file + !Sub "${ClusterStackName}-ClusterName" \ No newline at end of file diff --git a/xl-platform/aws-auth-cm.yaml b/kubernetes/aws-auth-cm.yaml similarity index 93% rename from xl-platform/aws-auth-cm.yaml rename to kubernetes/aws-auth-cm.yaml index 117c34b..14f8c37 100644 --- a/xl-platform/aws-auth-cm.yaml +++ b/kubernetes/aws-auth-cm.yaml @@ -14,4 +14,4 @@ data: - userarn: ##EKS_USER_ARN## username: ##EKS_USER## groups: - - system:masters + - system:masters \ No newline at end of file diff --git a/kubernetes/build.gradle b/kubernetes/build.gradle new file mode 100644 index 0000000..0fe4e05 --- /dev/null +++ b/kubernetes/build.gradle @@ -0,0 +1,24 @@ +import org.apache.tools.ant.filters.ReplaceTokens +buildscript { + repositories { + jcenter() + } +} + +apply plugin: 'java' + + +if (!hasProperty('imageTag')) { + ext.imageTag = "latest" +} + + +task sourcesForRelease(type: Copy) { + outputs.upToDateWhen { false } + from 'store' + exclude "build" + into 'build/store' + filter(ReplaceTokens, tokens: [IMAGE_TAG: project.imageTag]) +} + + diff --git a/xl-platform/kubernetes/console/jhipster-console.yml b/kubernetes/console/jhipster-console.yml similarity index 100% rename from xl-platform/kubernetes/console/jhipster-console.yml rename to kubernetes/console/jhipster-console.yml diff --git a/xl-platform/kubernetes/console/jhipster-dashboard-console.yml b/kubernetes/console/jhipster-dashboard-console.yml similarity index 100% rename from xl-platform/kubernetes/console/jhipster-dashboard-console.yml rename to kubernetes/console/jhipster-dashboard-console.yml diff --git a/xl-platform/kubernetes/console/jhipster-elasticsearch.yml b/kubernetes/console/jhipster-elasticsearch.yml similarity index 100% rename from xl-platform/kubernetes/console/jhipster-elasticsearch.yml rename to kubernetes/console/jhipster-elasticsearch.yml diff --git a/xl-platform/kubernetes/console/jhipster-logstash.yml b/kubernetes/console/jhipster-logstash.yml similarity index 100% rename from xl-platform/kubernetes/console/jhipster-logstash.yml rename to kubernetes/console/jhipster-logstash.yml diff --git a/xl-platform/kubernetes/console/jhipster-zipkin.yml b/kubernetes/console/jhipster-zipkin.yml similarity index 100% rename from xl-platform/kubernetes/console/jhipster-zipkin.yml rename to kubernetes/console/jhipster-zipkin.yml diff --git a/xl-platform/kubernetes/console/logstash-config.yml b/kubernetes/console/logstash-config.yml similarity index 100% rename from xl-platform/kubernetes/console/logstash-config.yml rename to kubernetes/console/logstash-config.yml diff --git a/kubernetes/gradle/wrapper/gradle-wrapper.jar b/kubernetes/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..758de96 Binary files /dev/null and b/kubernetes/gradle/wrapper/gradle-wrapper.jar differ diff --git a/kubernetes/gradle/wrapper/gradle-wrapper.properties b/kubernetes/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..115e6ac --- /dev/null +++ b/kubernetes/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/kubernetes/gradlew b/kubernetes/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/kubernetes/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/kubernetes/gradlew.bat b/kubernetes/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/kubernetes/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/xl-platform/kubernetes/invoice/invoice-deployment.yml b/kubernetes/invoice/invoice-deployment.yml similarity index 98% rename from xl-platform/kubernetes/invoice/invoice-deployment.yml rename to kubernetes/invoice/invoice-deployment.yml index 11f7f90..8f67260 100644 --- a/xl-platform/kubernetes/invoice/invoice-deployment.yml +++ b/kubernetes/invoice/invoice-deployment.yml @@ -35,6 +35,7 @@ spec: containers: - name: invoice-app image: xebialabsunsupported/ecommerce-invoice + imagePullPolicy: Always env: - name: SPRING_PROFILES_ACTIVE value: "prod,swagger" diff --git a/xl-platform/kubernetes/invoice/invoice-mysql.yml b/kubernetes/invoice/invoice-mysql.yml similarity index 100% rename from xl-platform/kubernetes/invoice/invoice-mysql.yml rename to kubernetes/invoice/invoice-mysql.yml diff --git a/xl-platform/kubernetes/invoice/invoice-service.yml b/kubernetes/invoice/invoice-service.yml similarity index 100% rename from xl-platform/kubernetes/invoice/invoice-service.yml rename to kubernetes/invoice/invoice-service.yml diff --git a/xl-platform/kubernetes/notification/notification-deployment.yml b/kubernetes/notification/notification-deployment.yml similarity index 98% rename from xl-platform/kubernetes/notification/notification-deployment.yml rename to kubernetes/notification/notification-deployment.yml index be59329..3e693ca 100644 --- a/xl-platform/kubernetes/notification/notification-deployment.yml +++ b/kubernetes/notification/notification-deployment.yml @@ -35,6 +35,7 @@ spec: containers: - name: notification-app image: xebialabsunsupported/ecommerce-notification + imagePullPolicy: Always env: - name: SPRING_PROFILES_ACTIVE value: "prod,swagger" diff --git a/xl-platform/kubernetes/notification/notification-mongodb.yml b/kubernetes/notification/notification-mongodb.yml similarity index 100% rename from xl-platform/kubernetes/notification/notification-mongodb.yml rename to kubernetes/notification/notification-mongodb.yml diff --git a/xl-platform/kubernetes/notification/notification-service.yml b/kubernetes/notification/notification-service.yml similarity index 100% rename from xl-platform/kubernetes/notification/notification-service.yml rename to kubernetes/notification/notification-service.yml diff --git a/xl-platform/kubernetes/registry/application-configmap.yml b/kubernetes/registry/application-configmap.yml similarity index 100% rename from xl-platform/kubernetes/registry/application-configmap.yml rename to kubernetes/registry/application-configmap.yml diff --git a/xl-platform/kubernetes/registry/jhipster-registry.yml b/kubernetes/registry/jhipster-registry.yml similarity index 100% rename from xl-platform/kubernetes/registry/jhipster-registry.yml rename to kubernetes/registry/jhipster-registry.yml diff --git a/xl-platform/kubernetes/store/store-deployment.yml b/kubernetes/store/store-deployment.yml similarity index 96% rename from xl-platform/kubernetes/store/store-deployment.yml rename to kubernetes/store/store-deployment.yml index 3b85953..357231f 100644 --- a/xl-platform/kubernetes/store/store-deployment.yml +++ b/kubernetes/store/store-deployment.yml @@ -34,7 +34,8 @@ spec: done containers: - name: store-app - image: xebialabsunsupported/ecommerce-store:8.5.0 + image: xebialabsunsupported/ecommerce-store:@IMAGE_TAG@ + imagePullPolicy: Always env: - name: SPRING_PROFILES_ACTIVE value: "prod,swagger" diff --git a/xl-platform/kubernetes/store/store-mysql.yml b/kubernetes/store/store-mysql.yml similarity index 100% rename from xl-platform/kubernetes/store/store-mysql.yml rename to kubernetes/store/store-mysql.yml diff --git a/xl-platform/kubernetes/store/store-service.yml b/kubernetes/store/store-service.yml similarity index 100% rename from xl-platform/kubernetes/store/store-service.yml rename to kubernetes/store/store-service.yml diff --git a/store/Jenkinsfile b/store/Jenkinsfile index 0cae3f3..e1c6404 100644 --- a/store/Jenkinsfile +++ b/store/Jenkinsfile @@ -1,64 +1,95 @@ #!/usr/bin/env groovy +pipeline { + agent any + environment { + XL_VALUE_BUILD_ID = "1.0.${env.BUILD_ID}" -node { - stage('checkout') { - checkout scm + XL_DEPLOY_URL = "http://xl-deploy:4516" + XL_DEPLOY_CREDENTIALS = credentials("xld-credentials") } - stage('check java') { - sh "java -version" - } - - stage('clean') { - sh "chmod +x gradlew" - sh "./gradlew clean --no-daemon" - } - - stage('npm install') { - sh "./gradlew npmInstall -PnodeInstall --no-daemon" - } - - stage('backend tests') { - try { - sh "./gradlew test -PnodeInstall --no-daemon" - } catch(err) { - throw err - } finally { - junit '**/build/**/TEST-*.xml' + stages { + stage ("checkout") { + steps { + checkout scm + } } - } + stage ("check java") { + steps { + sh "java -version" + } + } + stage ("clean") { + steps { + echo "Clean Done" + // sh "cd store && chmod +x ./gradlew" + // sh "cd store && ./gradlew clean --no-daemon" + } + } + stage ("npm install") { + steps { + sh "cd store && ./gradlew npmInstall -PnodeInstall --no-daemon" + } + } + stage ("backend tests") { + steps { + echo "Backend tests Done" + // try { + // sh "cd store && ./gradlew test -PnodeInstall --no-daemon" + // } catch(err) { + // throw err + // } finally { + // junit '**/build/**/TEST-*.xml' + // } + } + } + stage ("frontend tests") { + steps { + echo "Frontend tests Done" - stage('frontend tests') { - try { - sh "./gradlew npm_test -PnodeInstall --no-daemon" - } catch(err) { - throw err - } finally { - junit '**/build/test-results/jest/TESTS-*.xml' + // try { + // sh "cd store && ./gradlew npm_test -PnodeInstall --no-daemon" + // } catch(err) { + // throw err + // } finally { + // junit '**/build/test-results/jest/TESTS-*.xml' + // } + } + } + stage ("packaging") { + steps { + sh "cd store && ./gradlew bootWar -x test -Pprod -PnodeInstall --no-daemon" + archiveArtifacts artifacts: '**/build/libs/*.war', fingerprint: true + } } - } - stage('packaging') { - sh "./gradlew bootWar -x test -Pprod -PnodeInstall --no-daemon" - archiveArtifacts artifacts: '**/build/libs/*.war', fingerprint: true - } - stage('quality analysis') { - withSonarQubeEnv('sonar') { - sh "./gradlew sonarqube --no-daemon" + stage ("build and publish docker") { + steps { + script { + def dockerImage + stage ("build docker") { + sh "cp -R store/src/main/docker store/build/" + sh "cp store/build/libs/*.war store/build/docker/" + dockerImage = docker.build('xebialabsunsupported/ecommerce-store', 'store/build/docker') + } + stage ("publish docker") { + docker.withRegistry('https://index.docker.io/v1/', 'docker-login') { + dockerImage.tag("1.0.${env.BUILD_ID}") + dockerImage.push("1.0.${env.BUILD_ID}") + } + } + } + } } - } - def dockerImage - stage('build docker') { - sh "cp -R src/main/docker build/" - sh "cp build/libs/*.war build/docker/" - dockerImage = docker.build('xebialabsunsupported/store', 'build/docker') - } - stage('publish docker') { - docker.withRegistry('https://registry.hub.docker.com', 'docker-login') { - dockerImage.push 'latest' + stage ("push xld package") { + steps { + sh "cd kubernetes && ./gradlew clean sourcesForRelease -PimageTag=1.0.${env.BUILD_ID} --no-daemon" + sh "./xlw apply -f xebialabs/xld-kubernetes-apps.yaml" + } } + } } diff --git a/store/package-lock.json b/store/package-lock.json index f07e11d..d8c1544 100644 --- a/store/package-lock.json +++ b/store/package-lock.json @@ -573,15 +573,6 @@ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -648,23 +639,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "requires": { - "file-type": "^3.1.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - } - } - }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -1289,12 +1263,6 @@ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "dev": true }, - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true - }, "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -1317,12 +1285,6 @@ "tweetnacl": "^0.14.3" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1338,97 +1300,6 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, - "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - }, - "dependencies": { - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", @@ -1441,16 +1312,6 @@ "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", "dev": true }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", @@ -1809,17 +1670,6 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -1836,12 +1686,6 @@ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -1860,32 +1704,6 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "dev": true, - "requires": { - "file-type": "^3.1.0", - "readable-stream": "^2.0.2", - "uuid": "^2.0.1", - "vinyl": "^1.0.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -2056,44 +1874,12 @@ "rsvp": "^3.3.3" } }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -2444,12 +2230,6 @@ "simple-swizzle": "^0.2.2" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", @@ -2613,16 +2393,6 @@ "write-file-atomic": "^2.3.0" } }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, "connect": { "version": "3.6.6", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", @@ -2661,12 +2431,6 @@ "date-now": "^0.1.4" } }, - "console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2799,15 +2563,6 @@ "elliptic": "^6.0.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", @@ -3111,17 +2866,6 @@ "array-find-index": "^1.0.1" } }, - "cwebp-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cwebp-bin/-/cwebp-bin-4.0.0.tgz", - "integrity": "sha1-7it/YzPTQm+1K7QF+m8uyLYolPQ=", - "dev": true, - "requires": { - "bin-build": "^2.2.0", - "bin-wrapper": "^3.0.1", - "logalot": "^2.0.0" - } - }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -3223,23 +2967,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -3249,340 +2976,108 @@ "mimic-response": "^1.0.0" } }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "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-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "kind-of": "^6.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "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": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "kind-of": "^6.0.0" } }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "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": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - } - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "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 + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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 } } }, @@ -3889,75 +3384,12 @@ "is-obj": "^1.0.0" } }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - } - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true - } - } - }, "drange": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/drange/-/drange-1.0.2.tgz", "integrity": "sha512-bve7maXvfKW+vcsRpP8gzEDzkTg8O6AoCGvi/52pnllzhl/nmex8XLrHOUEQ42Z8GshcyftvG+E4s5vcd/qo0Q==", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -3976,24 +3408,6 @@ "stream-shift": "^1.0.0" } }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "dev": true, - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - }, - "dependencies": { - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - } - } - }, "easy-extender": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", @@ -4430,45 +3844,6 @@ "safe-buffer": "^5.1.1" } }, - "exec-buffer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "p-finally": "^1.0.0", - "pify": "^3.0.0", - "rimraf": "^2.5.4", - "tempfile": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", - "dev": true, - "requires": { - "async-each-series": "^1.1.0", - "object-assign": "^4.1.0" - }, - "dependencies": { - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true - } - } - }, "exec-sh": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", @@ -4499,101 +3874,10 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "dev": true, - "requires": { - "meow": "^3.1.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true } } }, @@ -4735,25 +4019,6 @@ } } }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "dev": true, - "requires": { - "mime-db": "^1.28.0" - } - }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "dev": true, - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - } - }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -4807,17 +4072,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -5222,15 +4476,6 @@ } } }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "fecha": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", @@ -5275,35 +4520,12 @@ } } }, - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", - "dev": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -5386,100 +4608,6 @@ "pinkie-promise": "^2.0.0" } }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "dev": true, - "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, "first-chunk-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", @@ -6772,15 +5900,6 @@ "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", "dev": true }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "dev": true, - "requires": { - "rc": "^1.1.2" - } - }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -6808,157 +5927,56 @@ "assert-plus": "^1.0.0" } }, - "gh-got": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", - "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", - "dev": true, - "requires": { - "got": "^7.0.0", - "is-plain-obj": "^1.1.0" - } - }, - "gifsicle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", - "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", - "dev": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "github-username": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", - "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", - "dev": true, - "requires": { - "gh-got": "^6.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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.0" - } - }, - "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-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.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "^6.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" } }, "glob-to-regexp": { @@ -7010,15 +6028,6 @@ } } }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", @@ -7047,12 +6056,6 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, "grouped-queue": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", @@ -7074,18 +6077,6 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "gulp-decompress": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", - "dev": true, - "requires": { - "archive-type": "^3.0.0", - "decompress": "^3.0.0", - "gulp-util": "^3.0.1", - "readable-stream": "^2.0.2" - } - }, "gulp-filter": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", @@ -7097,116 +6088,6 @@ "streamfilter": "^1.0.5" } }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "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.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "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 - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, "handle-thing": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", @@ -7397,15 +6278,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -8139,192 +7011,20 @@ "ieee754": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "image-webpack-loader": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/image-webpack-loader/-/image-webpack-loader-4.3.1.tgz", - "integrity": "sha512-Qk4gAuN0+aRJsIK2tRvEPR7ZVQ8MWVSt5N4R7FXpkEST9eehclhfZbPGUXdnBfPNzuB6N/h9DluUR4B/TFxPpw==", - "dev": true, - "requires": { - "imagemin": "^5.3.1", - "imagemin-gifsicle": "^5.2.0", - "imagemin-mozjpeg": "^7.0.0", - "imagemin-optipng": "^5.2.1", - "imagemin-pngquant": "^5.1.0", - "imagemin-svgo": "^6.0.0", - "imagemin-webp": "^4.1.0", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "imagemin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", - "integrity": "sha1-8Zwu7h5xumxlWMUV+fyWaAGJptQ=", - "dev": true, - "requires": { - "file-type": "^4.1.0", - "globby": "^6.1.0", - "make-dir": "^1.0.0", - "p-pipe": "^1.1.0", - "pify": "^2.3.0", - "replace-ext": "^1.0.0" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - } - } - }, - "imagemin-gifsicle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", - "integrity": "sha512-K01m5QuPK+0en8oVhiOOAicF7KjrHlCZxS++mfLI2mV/Ksfq/Y9nCXCWDz6jRv13wwlqe5T7hXT+ji2DnLc2yQ==", - "dev": true, - "requires": { - "exec-buffer": "^3.0.0", - "gifsicle": "^3.0.0", - "is-gif": "^1.0.0" - } - }, - "imagemin-mozjpeg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-7.0.0.tgz", - "integrity": "sha1-2SZHf8bvXzp2ikIi97LYCNPrpWg=", - "dev": true, - "requires": { - "execa": "^0.8.0", - "is-jpg": "^1.0.0", - "mozjpeg": "^5.0.0" - }, - "dependencies": { - "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.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "imagemin-optipng": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", - "integrity": "sha1-0i2kEsCfX/AKQzmWC5ioix2+hpU=", - "dev": true, - "requires": { - "exec-buffer": "^3.0.0", - "is-png": "^1.0.0", - "optipng-bin": "^3.0.0" - } - }, - "imagemin-pngquant": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-5.1.0.tgz", - "integrity": "sha512-RtIUPbp8/HYX5EKY6p/L1NLKnkxNj37I92IFNsrptzBVql8FqBgPra9DO/eUgE4EWx+zq6ih4a/Y9YhF3pNM5A==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "is-png": "^1.0.0", - "is-stream": "^1.1.0", - "pngquant-bin": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "imagemin-svgo": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", - "integrity": "sha512-xwjBZQKpbkklHtJYnCOwRJjTRJA/nR0hQzKMh+CUZRvm/L0QwKKPJQ9tkPWQHrg+cydPu2i1vLgHuy2E0hKEkg==", - "dev": true, - "requires": { - "buffer-from": "^0.1.1", - "is-svg": "^2.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "buffer-from": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "dev": true - } - } + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true }, - "imagemin-webp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/imagemin-webp/-/imagemin-webp-4.1.0.tgz", - "integrity": "sha1-7/0AFg2EVrlcveX9JsMtZLAxgGI=", - "dev": true, - "requires": { - "cwebp-bin": "^4.0.0", - "exec-buffer": "^3.0.0", - "is-cwebp-readable": "^2.0.1" - } + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, "immediate": { "version": "3.0.6", @@ -8629,27 +7329,12 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", "dev": true }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "dev": true, - "requires": { - "is-relative": "^0.1.0" - } - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -8700,12 +7385,6 @@ "builtin-modules": "^1.0.0" } }, - "is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", - "dev": true - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -8735,15 +7414,6 @@ "rgba-regex": "^1.0.0" } }, - "is-cwebp-readable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz", - "integrity": "sha1-r7k7DAq9CiUQEBauM66ort+SbSY=", - "dev": true, - "requires": { - "file-type": "^4.3.0" - } - }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -8835,12 +7505,6 @@ "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", "dev": true }, - "is-gif": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", - "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", - "dev": true - }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -8850,24 +7514,6 @@ "is-extglob": "^1.0.0" } }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true - }, - "is-jpg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.0.tgz", - "integrity": "sha1-KVnBfnNDDbOCZNp1uQ3VTy2G2hw=", - "dev": true - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -8960,12 +7606,6 @@ } } }, - "is-png": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", - "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", - "dev": true - }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -8984,12 +7624,6 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -9005,12 +7639,6 @@ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true - }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -9049,51 +7677,24 @@ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", "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.0" - } - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, - "is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -9106,12 +7707,6 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "is-zip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -10342,21 +8937,6 @@ "dev": true, "optional": true }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -11052,59 +9632,17 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -11168,18 +9706,6 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -11212,17 +9738,6 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -11252,12 +9767,6 @@ "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", "dev": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -11276,55 +9785,6 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - } - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - }, - "dependencies": { - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - } - } - }, "lodash.tonumber": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz", @@ -11388,28 +9848,6 @@ } } }, - "logalot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", - "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "dev": true, - "requires": { - "figures": "^1.3.5", - "squeak": "^1.0.0" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - } - } - }, "logform": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/logform/-/logform-1.9.1.tgz", @@ -11491,100 +9929,6 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, - "lpad-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", - "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "indent-string": "^2.1.0", - "longest": "^1.0.0", - "meow": "^3.3.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -12015,12 +10359,6 @@ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", @@ -12258,17 +10596,6 @@ "run-queue": "^1.0.3" } }, - "mozjpeg": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-5.0.0.tgz", - "integrity": "sha1-uGccSSRWijY94AP/L9OXq4P3UsU=", - "dev": true, - "requires": { - "bin-build": "^2.2.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -12296,54 +10623,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, "mute-stream": { @@ -12570,12 +10853,6 @@ "semver": "^5.3.0" } }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true - }, "nomnom": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", @@ -12622,24 +10899,6 @@ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "npm-path": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", @@ -12961,27 +11220,6 @@ } } }, - "optipng-bin": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", - "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", - "dev": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -12997,12 +11235,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -13046,15 +11278,6 @@ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, - "p-event": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", - "dev": true, - "requires": { - "p-timeout": "^1.1.1" - } - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -13085,27 +11308,6 @@ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, - "p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", @@ -13321,12 +11523,6 @@ "sha.js": "^2.4.8" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13461,284 +11657,6 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "pngquant-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-4.0.0.tgz", - "integrity": "sha512-jhjMp87bvaUeQOfNaPhSKx3tLCEwRaAycgDpIhMflgFr2+vYhw4ZrcK06eQeYg4OprXPanFljXLl5VuuAP2IHw==", - "dev": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^3.0.0", - "execa": "^0.10.0", - "logalot": "^2.0.0" - }, - "dependencies": { - "bin-build": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", - "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", - "dev": true, - "requires": { - "decompress": "^4.0.0", - "download": "^6.2.2", - "execa": "^0.7.0", - "p-map-series": "^1.0.0", - "tempfile": "^2.0.0" - }, - "dependencies": { - "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.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "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 - } - } - }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "dev": true, - "requires": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" - } - }, - "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.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - } - } - }, - "download": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", - "dev": true, - "requires": { - "caw": "^2.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.0.0", - "ext-name": "^5.0.0", - "file-type": "5.2.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^7.0.0", - "make-dir": "^1.0.0", - "p-event": "^1.0.0", - "pify": "^3.0.0" - }, - "dependencies": { - "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 - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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 - } - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true - }, - "filenamify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.0.0.tgz", - "integrity": "sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "dev": true, - "requires": { - "npm-conf": "^1.1.0" - } - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "requires": { - "is-natural-number": "^4.0.1" - } - } - } - }, "popper.js": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.4.tgz", @@ -14362,12 +12280,6 @@ "object-assign": "^4.1.1" } }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, "protractor": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.0.tgz", @@ -14664,26 +12576,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "react": { "version": "16.4.2", "resolved": "https://registry.npmjs.org/react/-/react-16.4.2.tgz", @@ -14927,16 +12819,6 @@ "react-transition-group": "^2.3.1" } }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, "read-chunk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", @@ -16345,29 +14227,9 @@ }, "scoped-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", - "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", - "dev": true - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "requires": { - "commander": "~2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true }, "select-hose": { "version": "2.0.0", @@ -16419,21 +14281,6 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true - }, - "semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -17071,24 +14918,6 @@ } } }, - "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.0.0" - } - }, - "sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", - "dev": true, - "requires": { - "sort-keys": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -17197,12 +15026,6 @@ } } }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, "spawn-sync": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", @@ -17311,44 +15134,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "squeak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", - "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "console-stream": "^0.1.1", - "lpad-align": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "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.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.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 - } - } - }, "srcset": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", @@ -17413,12 +15198,6 @@ "integrity": "sha512-H89UNKr1rQJvI1c/PIR3kiAMBV23yvR7LItZiV74HWZwzt7f3YHuujJ9nJZlt58WlFox7XQsOahexwk7nTe69A==", "dev": true }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -17462,16 +15241,6 @@ "readable-stream": "^2.0.2" } }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -17623,53 +15392,6 @@ "integrity": "sha1-4cuRuG3kMlQNE9stqOga4NTi7L8=", "dev": true }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "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.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "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 - } - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -17682,21 +15404,6 @@ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, "stripcomment-loader": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stripcomment-loader/-/stripcomment-loader-0.1.0.tgz", @@ -17755,42 +15462,6 @@ } } }, - "sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "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.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.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 - } - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -18039,34 +15710,6 @@ "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "dev": true, - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - } - }, "terser": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/terser/-/terser-3.8.2.tgz", @@ -18374,28 +16017,12 @@ "xtend": "~4.0.1" } }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, "thunky": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", "dev": true }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -18432,26 +16059,6 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.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.0" - } - } - } - }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -18591,15 +16198,6 @@ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -19197,16 +16795,6 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, - "unbzip2-stream": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", - "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", - "dev": true, - "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - } - }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", @@ -19278,16 +16866,6 @@ "imurmurhash": "^0.1.4" } }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -19358,12 +16936,6 @@ "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", "dev": true }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", @@ -19434,15 +17006,6 @@ "prepend-http": "^1.0.1" } }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", @@ -19510,12 +17073,6 @@ "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "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", @@ -19565,16 +17122,6 @@ "replace-ext": "0.0.1" } }, - "vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "readable-stream": "^2.0.0" - } - }, "vinyl-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", @@ -19589,49 +17136,6 @@ "vinyl": "^1.1.0" } }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - } - } - }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -19659,15 +17163,6 @@ "makeerror": "1.0.x" } }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "dev": true, - "requires": { - "wrap-fn": "^0.1.0" - } - }, "warning": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", @@ -21657,23 +19152,6 @@ "strip-ansi": "^3.0.1" } }, - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "requires": { - "co": "3.1.0" - }, - "dependencies": { - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -21810,16 +19288,6 @@ "camelcase": "^3.0.0" } }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.0.1" - } - }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", diff --git a/store/package.json b/store/package.json index 7231c94..37cb7c7 100644 --- a/store/package.json +++ b/store/package.json @@ -73,7 +73,6 @@ "http-proxy-middleware": "0.18.0", "husky": "0.14.3", "identity-obj-proxy": "3.0.0", - "image-webpack-loader": "4.3.1", "jest": "23.5.0", "jest-junit": "5.1.0", "jest-sonar-reporter": "2.0.0", diff --git a/store/src/main/webapp/app/app.scss b/store/src/main/webapp/app/app.scss index b37d7ec..cca5dcc 100644 --- a/store/src/main/webapp/app/app.scss +++ b/store/src/main/webapp/app/app.scss @@ -3,7 +3,7 @@ // Import Bootstrap source files from node_modules @import 'node_modules/bootstrap/scss/bootstrap'; body { - background: #fafafa; + background: red; margin: 0; } diff --git a/xebialabs.yaml b/xebialabs.yaml new file mode 100644 index 0000000..1a16077 --- /dev/null +++ b/xebialabs.yaml @@ -0,0 +1,8 @@ +apiVersion: xl/v1 +kind: Import +metadata: + imports: + - xebialabs/xld-infra-env.yaml + - xebialabs/xld-cloudformation-apps.yaml + - xebialabs/xlr-pipeline-ci-cd.yaml + - xebialabs/xlr-pipeline-destroy.yaml diff --git a/xebialabs/.gitignore b/xebialabs/.gitignore new file mode 100644 index 0000000..81f5150 --- /dev/null +++ b/xebialabs/.gitignore @@ -0,0 +1 @@ +secrets.xlvals \ No newline at end of file diff --git a/xebialabs/README.md b/xebialabs/README.md new file mode 100644 index 0000000..6b05d05 --- /dev/null +++ b/xebialabs/README.md @@ -0,0 +1,20 @@ +## e-commerce microservice application on AWS EKS + +The blueprint deploys an e-commerce microservice created using JHipster to AWS EKS. +XL deploy does the provisioning and deployment, while XL release orchestrates everything. + +### Prerequisites. + +1. Git clone [https://github.com/xebialabs/e-commerce-microservice/tree/blueprint-demo](https://github.com/xebialabs/e-commerce-microservice/tree/blueprint-demo) +2. Generate the blueprint with `xl blueprint -t aws/microservice-ecommerce` + + +To deploy this blueprint with XL Platform follow the below steps + +1. Apply the generated yaml configurations + + ``` + xl apply -f xebialabs.yaml + ``` + +2. Go to XL Release and look for the e-commerce2-release-pipeline and start a new release from it. \ No newline at end of file diff --git a/xebialabs/values.xlvals b/xebialabs/values.xlvals new file mode 100644 index 0000000..ce0d02c --- /dev/null +++ b/xebialabs/values.xlvals @@ -0,0 +1,9 @@ +AWSRegion = eu-west-1 +AppName = e-commerce2 +ClusterEndpoint = +ClusterName = e-commerce2 +Namespace = xl-demo +ProvisionCluster = true +StoreAdminPassword = admin +StoreAdminUsername = admin +UseAWSCredentialsFromSystem = true diff --git a/xebialabs/xld-cloudformation-apps.yaml b/xebialabs/xld-cloudformation-apps.yaml new file mode 100644 index 0000000..fec5668 --- /dev/null +++ b/xebialabs/xld-cloudformation-apps.yaml @@ -0,0 +1,128 @@ +apiVersion: xl-deploy/v1 +kind: Applications +spec: +- name: e-commerce-2 + type: core.Directory + children: + + - name: EKS-LAMBDA + type: core.Directory + children: + ### create S3 bucket ### + - name: e-commerce-2-lambda-bucket + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: s3-bucket-e-commerce-2-lambda + type: aws.s3.BucketSpec + bucketName: e-commerce-2-lambda + region: eu-west-1 + ### upload the artifacts to S3 bucket ### + - name: e-commerce-2-lambda-artifacts + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-lambda-artifacts + type: aws.s3.File + file: !file ../cloudformation/cfn-secret-provider.zip + acl: bucket-owner-full-control + scanPlaceholders: false +# Provision EKS cluster using Cloudformation templates + - name: EKS-CLOUDFORMATION + type: core.Directory + children: + - name: e-commerce-2-cloudformation-eks-user + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-eks-user + type: aws.cloudformation.Template + file: !file ../cloudformation/eks-user.yaml + capabilities: + - CAPABILITY_IAM + - CAPABILITY_NAMED_IAM + inputVariables: + ProjectName: e-commerce-2 + UserStackName: e-commerce-2-eks-user + S3BucketPrefix: e-commerce-2-lambda + - name: e-commerce-2-cloudformation-eks-vpc + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-eks-vpc + type: aws.cloudformation.Template + file: !file ../cloudformation/eks-vpc.yaml + capabilities: + - CAPABILITY_IAM + - CAPABILITY_NAMED_IAM + inputVariables: + ProjectName: e-commerce-2 + VPCStackName: e-commerce-2-eks-vpc + AvailabilityZones: eu-west-1a, eu-west-1b + - name: e-commerce-2-cloudformation-eks-master + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-eks-master + type: aws.cloudformation.Template + file: !file ../cloudformation/eks-master.yaml + capabilities: + - CAPABILITY_IAM + - CAPABILITY_NAMED_IAM + inputVariables: + ProjectName: e-commerce-2 + VPCStackName: e-commerce-2-eks-vpc + - name: e-commerce-2-cloudformation-eks-workers + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-eks-workers + type: aws.cloudformation.Template + file: !file ../cloudformation/eks-workers.yaml + capabilities: + - CAPABILITY_IAM + - CAPABILITY_NAMED_IAM + inputVariables: + ProjectName: e-commerce-2 + VPCStackName: e-commerce-2-eks-vpc + UserStackName: e-commerce-2-eks-user + ClusterStackName: e-commerce-2-eks-master + ClusterName: e-commerce-2-master + NodeGroupName: e-commerce-2 + - name: e-commerce-2-k8s-configmap + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-aws-auth + type: k8s.ResourcesFile + file: !file ../kubernetes/aws-auth-cm.yaml + delimiters: "## ##" + + - name: K8S + type: core.Directory + +# Provision K8s namespace + children: + - name: e-commerce-2-namespace + type: udm.Application + children: + - name: '1.0.0' + type: udm.DeploymentPackage + deployables: + - name: xl-demo + type: k8s.NamespaceSpec + namespaceName: 'xl-demo' \ No newline at end of file diff --git a/xebialabs/xld-infra-env.yaml b/xebialabs/xld-infra-env.yaml new file mode 100644 index 0000000..d3af5b3 --- /dev/null +++ b/xebialabs/xld-infra-env.yaml @@ -0,0 +1,27 @@ +# Provision AWS EKS cluster +apiVersion: xl-deploy/v1 +kind: Infrastructure +spec: +- name: e-commerce-2 + type: core.Directory + children: + - name: aws-e-commerce-2 + type: aws.Cloud + accesskey: !value AWSAccessKey + accessSecret: !value AWSAccessSecret + children: + - name: eks-cloudformation + type: aws.cloudformation.Stack + region: eu-west-1 +--- +apiVersion: xl-deploy/v1 +kind: Environments +spec: +- name: e-commerce-2 + type: core.Directory + children: + - name: aws-cloudformation-e-commerce-2 + type: udm.Environment + members: + - Infrastructure/e-commerce-2/aws-e-commerce-2 + - Infrastructure/e-commerce-2/aws-e-commerce-2/eks-cloudformation \ No newline at end of file diff --git a/xebialabs/xld-kubernetes-apps.yaml b/xebialabs/xld-kubernetes-apps.yaml new file mode 100644 index 0000000..7ff4159 --- /dev/null +++ b/xebialabs/xld-kubernetes-apps.yaml @@ -0,0 +1,84 @@ +apiVersion: xl-deploy/v1 +kind: Applications +spec: +- name: e-commerce-2 + type: core.Directory + children: + - name: K8S + type: core.Directory + children: + - name: e-commerce-2-invoice-mysql + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-invoice-mysql + type: k8s.ResourcesFile + file: !file ../kubernetes/invoice/invoice-mysql.yml + - name: e-commerce-2-store-mysql + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-store-mysql + type: k8s.ResourcesFile + file: !file ../kubernetes/store/store-mysql.yml + - name: e-commerce-2-notification-mongodb + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-notification-mongodb + type: k8s.ResourcesFile + file: !file ../kubernetes/notification/notification-mongodb.yml + - name: e-commerce-2-registry + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-application-config + type: k8s.ResourcesFile + file: !file ../kubernetes/registry/application-configmap.yml + - name: e-commerce-2-jhipster-registry + type: k8s.ResourcesFile + file: !file ../kubernetes/registry/jhipster-registry.yml + - name: e-commerce-2-invoice + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-invoice-deployment + type: k8s.ResourcesFile + file: !file ../kubernetes/invoice/invoice-deployment.yml + - name: e-commerce-2-invoice-svc + type: k8s.ResourcesFile + file: !file ../kubernetes/invoice/invoice-service.yml + - name: e-commerce-2-notification + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-invoice-notification + type: k8s.ResourcesFile + file: !file ../kubernetes/notification/notification-deployment.yml + - name: e-commerce-2-notification-svc + type: k8s.ResourcesFile + file: !file ../kubernetes/notification/notification-service.yml + - name: e-commerce-2-store + type: udm.Application + children: + - name: !value BUILD_ID + type: udm.DeploymentPackage + deployables: + - name: e-commerce-2-store-deployment + type: k8s.ResourcesFile + file: !file ../kubernetes/build/store/store-deployment.yml + - name: e-commerce-2-store-svc + type: k8s.ResourcesFile + file: !file ../kubernetes/store/store-service.yml \ No newline at end of file diff --git a/xebialabs/xlr-pipeline-ci-cd.yaml b/xebialabs/xlr-pipeline-ci-cd.yaml new file mode 100644 index 0000000..fd8a620 --- /dev/null +++ b/xebialabs/xlr-pipeline-ci-cd.yaml @@ -0,0 +1,255 @@ +apiVersion: xl-release/v1 +kind: Templates +spec: +- name: e-commerce-2 + type: xlrelease.Folder + children: + - name: e-commerce-2-ci-cd + type: xlrelease.Release + description: | + This XL Release template shows how to deploy an application, based on microservices architecture, to AWS EKS using XL Deploy. + tags: + - AWS + - EKS + - e-commerce-2 + scriptUsername: !value XL_RELEASE_USERNAME + scriptUserPassword: !value XL_RELEASE_PASSWORD + variables: + - key: control + type: xlrelease.MapStringStringVariable + requiresValue: false + showOnReleaseStart: false + value: + namespace: xl-demo + serviceName: store + - key: lbHostnameOrIp + type: xlrelease.StringVariable + requiresValue: false + showOnReleaseStart: false + - key: AWSaccessKey + type: xlrelease.StringVariable + requiresValue: true + showOnReleaseStart: false + value: !value AWSAccessKey + - key: AWSaccessSecret + type: xlrelease.StringVariable + requiresValue: true + showOnReleaseStart: false + value: !value AWSAccessSecret + - key: store-admin-username + type: xlrelease.StringVariable + requiresValue: true + showOnReleaseStart: false + value: admin + - key: store-admin-password + type: xlrelease.StringVariable + requiresValue: true + showOnReleaseStart: false + value: admin + - key: xld-admin-password + type: xlrelease.PasswordStringVariable + requiresValue: true + showOnReleaseStart: false + value: !value XL_DEPLOY_PASSWORD + phases: + + # Provision Infra + - name: Provision Infrastructure + color: '#ff9e3b' + type: xlrelease.Phase + tasks: + - name: Provision Lambda artifacts + type: xlrelease.SequentialGroup + tasks: + - name: Create S3 bucket for lambda artifacts + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-LAMBDA/e-commerce-2-lambda-bucket/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Upload lambda artifacts to S3 + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-LAMBDA/e-commerce-2-lambda-artifacts/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Provision AWS VPC and IAM resources + type: xlrelease.ParallelGroup + tasks: + - name: Provision AWS IAM resources + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-CLOUDFORMATION/e-commerce-2-cloudformation-eks-user/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Provision AWS VPC + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-CLOUDFORMATION/e-commerce-2-cloudformation-eks-vpc/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Provision AWS EKS cluster + type: xlrelease.SequentialGroup + tasks: + - name: Provision EKS master node + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-CLOUDFORMATION/e-commerce-2-cloudformation-eks-master/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Provision EKS workers nodes + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-CLOUDFORMATION/e-commerce-2-cloudformation-eks-workers/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-cloudformation-e-commerce-2 + - name: Add accessKey to EKS cluster CI + type: xld.UpdateCIProperty + server: XL Deploy + ciID: Infrastructure/e-commerce-2/eks-e-commerce-2/eks-cluster + ciProperty: accessKey + propertyValue: ${AWSaccessKey} + - name: Add accessSecret to EKS cluster CI + type: xld.UpdateCIProperty + server: XL Deploy + ciID: Infrastructure/e-commerce-2/eks-e-commerce-2/eks-cluster + ciProperty: accessSecret + propertyValue: ${AWSaccessSecret} + - name: Provision EKS config map for workers + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/EKS-CLOUDFORMATION/e-commerce-2-k8s-configmap/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/AWS-PREREQUISITE + + - name: Build e-commerce-2 application + type: xlrelease.Phase + tasks: + - name: Build e-commerce-2 store docker image + type: jenkins.Build + jenkinsServer: jenkins + jobName: devops-as-code-eks-blueprint + owner: admin + variableMapping: + pythonScript.buildNumber: ${buildNumber} + - name: Deploy e-commerce-2 application + type: xlrelease.Phase + tasks: + + - name: Deploy xl-demo namespace + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-namespace/1.0.0 + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + + - name: Deploy stateful services + type: xlrelease.ParallelGroup + tasks: + - name: Deploy invoice mysql svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-invoice-mysql/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy store mysql svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-store-mysql/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy notification mongodb svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-notification-mongodb/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy stateless services + type: xlrelease.SequentialGroup + tasks: + - name: Deploy registry svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-registry/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy microservices + type: xlrelease.ParallelGroup + tasks: + - name: Deploy invoice svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-invoice/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy notification svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-notification/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Deploy store svc + type: xldeploy.Deploy + server: XL Deploy + deploymentPackage: e-commerce-2/K8S/e-commerce-2-store/1.0.${buildNumber} + deploymentEnvironment: Environments/e-commerce-2/aws-eks-e-commerce-2 + - name: Test + type: xlrelease.Phase + tasks: + - name: Get Store service public URL + type: xlrelease.SequentialGroup + tasks: + - name: Get Store k8s service specs + type: xldeploy.Controltask + server: XL Deploy + numberOfContinueRetrials: 100 + pollingInterval: 10 + + ciId: Infrastructure/e-commerce-2/eks-e-commerce-2/eks-cluster + + taskName: describeService + variableMapping: + pythonScript.xlDeployTaskId: ${taskId} + pythonScript.parameters: ${control} + - name: Parse Store k8s service + type: webhook.XmlWebhook + URL: !format '%XL_DEPLOY_URL%/deployit/tasks/v2/export' + method: GET + username: !value XL_DEPLOY_USERNAME + xPathExpression: "/list/task[@id=\"${taskId}\"]//log/text()" + variableMapping: + pythonScript.result: ${taskOutput} + pythonScript.password: ${xld-admin-password} + - name: Get Store k8s service ip or hostname + type: xlrelease.ScriptTask + script: | + import re + m = re.search('hostname:(.*)\nip:([0-9.]+|None)', releaseVariables['taskOutput']) + ipHostname = [m.group(1),m.group(2)] + for item in ipHostname: + if "None" not in item: + releaseVariables['lbHostnameOrIp'] = item + # end of script + - name: Check e-commerce-2 application status + type: xlrelease.ScriptTask + script: | + import urllib2 + import json + import time + + time.sleep(60) + token_url = 'http://${lbHostnameOrIp}:8080/jhipster-registry/api/authenticate' + instances_url = 'http://${lbHostnameOrIp}:8080/jhipster-registry/api/eureka/applications' + values = {"password": "${store-admin-password}", + "rememberMe": "false", + "username": "${store-admin-username}" } + + + def make_req(url, body=None, token=None): + req = urllib2.Request(url, json.dumps(body) if body else None, headers={'Content-type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer %s' % token}) + opener = urllib2.build_opener() + response = opener.open(req) + return json.loads(response.read()) + + token = make_req(token_url, body=values)['id_token'] + resp = make_req(instances_url, token=token) + if len(resp['applications']) == 4: + print "All instances are registered" + else: + print "Not all instances are registered. Only {0} are registered".format(len(resp['applications'])) + exit(1) + # end of script + - name: Verify application + type: xlrelease.GateTask + team: Release Admin + description: | + The e-commerce-2 app is now live on EKS! + Check out the web site and complete this task when done. + + URL => http://${lbHostnameOrIp}:8080 \ No newline at end of file diff --git a/xebialabs/xlr-pipeline-destroy.yaml b/xebialabs/xlr-pipeline-destroy.yaml new file mode 100644 index 0000000..ce437e0 --- /dev/null +++ b/xebialabs/xlr-pipeline-destroy.yaml @@ -0,0 +1,104 @@ +apiVersion: xl-release/v1 +kind: Templates +spec: +- name: e-commerce-2 + type: xlrelease.Folder + children: + - name: e-commerce-2-destroy + type: xlrelease.Release + description: | + This XL Release template shows how to undeploy an application, based on microservices architecture, to AWS EKS using XL Deploy. + tags: + - AWS + - EKS + - e-commerce-2 + scriptUsername: !value XL_RELEASE_USERNAME + scriptUserPassword: !value XL_RELEASE_PASSWORD + phases: + - name: Undeploy Application + type: xlrelease.Phase + tasks: + - name: Undeploy stateless services + type: xlrelease.ParallelGroup + tasks: + - name: Undeploy registry svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-registry + - name: Undeploy invoice svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-invoice + - name: Undeploy notification svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-notification + - name: Undeploy store svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-store + - name: Undeploy stateful services + type: xlrelease.ParallelGroup + tasks: + - name: Undeploy invoice mysql svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-invoice-mysql + - name: Undeploy store mysql svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-store-mysql + - name: Undeploy notification mongodb svc + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-notification-mongodb + + # Un-provision namespace + - name: Undeploy xl-demo namespace + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-eks-e-commerce-2/e-commerce-2-namespace + + + # De-provision Infra + - name: Deprovision Infrastructure + color: '#ff9e3b' + type: xlrelease.Phase + tasks: + - name: Deprovision AWS EKS cluster + type: xlrelease.SequentialGroup + tasks: + - name: Deprovision EKS config map for workers + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/AWS-PREREQUISITE/e-commerce-2-k8s-configmap + - name: Deprovision EKS workers nodes + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-cloudformation-eks-workers + - name: Deprovision EKS master node + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-cloudformation-eks-master + - name: Delete artifacts from S3 + type: xlrelease.SequentialGroup + tasks: + - name: Delete artifacts from S3 + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-lambda-artifacts + - name: Delete S3 bucket + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-lambda-bucket + - name: Deprovision AWS VPC and IAM resources + type: xlrelease.ParallelGroup + tasks: + - name: Deprovision AWS IAM resources + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-cloudformation-eks-user + - name: Deprovision AWS VPC + type: xldeploy.Undeploy + server: XL Deploy + deployedApplication: Environments/e-commerce-2/aws-cloudformation-e-commerce-2/e-commerce-2-cloudformation-eks-vpc \ No newline at end of file diff --git a/xl-platform/awsconfig2xld.py b/xl-platform/awsconfig2xld.py deleted file mode 100755 index 5e5d5c5..0000000 --- a/xl-platform/awsconfig2xld.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -import getpass -import sys -import configparser -import os -import yaml - -# -# Util -# -def print_as_yaml(dict): - print(yaml.safe_dump(dict, default_flow_style=False)) - -# Hack to properly print Yaml -# https://stackoverflow.com/questions/45004464/yaml-dump-adding-unwanted-newlines-in-multiline-strings -yaml.SafeDumper.org_represent_str = yaml.SafeDumper.represent_str -def repr_str(dumper, data): - if '\n' in data: - return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|') - return dumper.org_represent_str(data) -yaml.add_representer(str, repr_str, Dumper=yaml.SafeDumper) - -# -# Create XLD YAML from AWS credentials and config -# - -def aws_credentials_to_infrastructure(credentialsfile): - # Read AWS credentials file - credentials = configparser.ConfigParser() - credentials.read(credentialsfile) - - # Build CIs for XL Deploy - return { - 'apiVersion': 'xl-deploy/v1beta1', - 'kind': 'Infrastructure', - 'spec': [ - { - 'name': 'AWS', - 'type': 'aws.Cloud', - 'accesskey': credentials['default']['aws_access_key_id'], - 'accessSecret': credentials['default']['aws_secret_access_key'] - } - ] - } - -def aws_config_to_environment(configfile, infrastructure): - # Read AWS config file - config = configparser.ConfigParser() - config.read(configfile) - - # Build CIs for XL Deploy - return { - 'apiVersion': 'xl-deploy/v1beta1', - 'kind': 'Environments', - 'spec': [ - { - 'name': 'AWS-DICT', - 'type': 'udm.Dictionary', - 'entries': { - 'region': config['default']['region'], - 'username': getpass.getuser() - } - }, - { - 'name': 'AWS', - 'type': 'udm.Environment', - 'members': [ - '~Infrastructure/' + infrastructure['spec'][0]['name'] - ], - 'dictionaries': [ - '~Environments/AWS-DICT' - ] - } - ] - } - - return environment - - -# Converts AWS credentials and config files to XL Deploy objects -credentialsfile = sys.argv[1] if len(sys.argv) > 1 else os.path.join(os.path.expanduser('~'), '.aws/credentials') -infrastructure = aws_credentials_to_infrastructure(credentialsfile) - -configfile = sys.argv[2] if len(sys.argv) > 2 else os.path.join(os.path.expanduser('~'), '.aws/config') -environment = aws_config_to_environment(configfile, infrastructure) - -# Print YAML -print_as_yaml(infrastructure) -print("---") -print_as_yaml(environment) diff --git a/xl-platform/cloudformation/README.MD b/xl-platform/cloudformation/README.MD deleted file mode 100644 index 15bc9b4..0000000 --- a/xl-platform/cloudformation/README.MD +++ /dev/null @@ -1,73 +0,0 @@ -## Provision EKS with official AWS docs approach -1. Download and configure aws-cli with your credentials and profile configuration. -2. Create VPC, Subnet(s), Security Group, Route(s) and add them to RouteTable(s) or use existent ones. -3. Create Amazon EKS service IAM role to apply to your cluster. -4. Create Amazon EKS Cluster (kubernetes master) from Amazon EKS console. -5. Download and install kubectl. -6. Download and install aws-iam-authenticator. You're required to pass up to 5 steps. -7. Configure kubectl by editing kubeconfig file to connect to EKS master using aws-iam-authenticator as a token generator. -8. Launch worker nodes from CloudFormation template and provide custom parameters. -9. Download and edit ConfigMap with required values. -10. Deploy ConfigMap via kubectl so worker nodes can join EKS cluster. - -## Provision EKS with CloudFormation - -You may provision all required parts from CloudFormation: -- Create EKS cluster user: -``` -aws cloudformation create-stack --stack-name eks-user --template-body file://eks-user.yaml --capabilities "CAPABILITY_NAMED_IAM" -``` -- Create VPC and related network resources: -``` -aws cloudformation create-stack --stack-name eks-vpc --template-body file://eks-vpc.yaml -``` -- Create EKS cluster master: -``` -aws cloudformation create-stack --stack-name eks-master --template-body file://eks-master.yaml --capabilities "CAPABILITY_IAM" -``` -- Create EKS worker nodes: -``` -aws cloudformation create-stack --stack-name eks-workers --template-body file://eks-workers.yaml --capabilities "CAPABILITY_IAM" -``` - -- After all 4 stacks are created EKS is ready but we need to add a ConfigMap to EKS cluster so the nodes can join the cluster: - -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: aws-auth - namespace: kube-system -data: - mapRoles: | - - rolearn: - username: system:node:{{EC2PrivateDNSName}} - groups: - - system:bootstrappers - - system:nodes - mapUsers: | - - userarn: - username: - groups: - - system:masters - -``` - -**rolearn** is output on the **eks-workers** cloudformation stack. - -## Provision EKS with XL Deploy - -You may easily provision and deploy application(i.e. microservice application) through XL Deploy. Specify secrets file with your AWS IAM user credentials inside and upload template to XL Deploy: -``` -xl apply --secret-file=secrets.file -f xld-ecommerce-microservice.yaml -``` - -## EKS use case (internal usage) -- xl apply infra (aws.cloud and aws.aws.cloudformation.Stack, and env with aws.cloudformation.Stack in it) -- xl apply eks stuff (all cloudformation stacks ) -- deploy the eks stuf (will end up provisioning all needed infra and will create in xld the k8s.Master) -- xl apply config map and deploy tlhe config map so nodes can connect to master (herer we need nodeRole ARN and username and user ARN ) -- xl apply xld-ecommerce-stateful-svc -- xl apply xld-ecommerce-stateless-svc -- deploy store app - diff --git a/xl-platform/getip-ecommerce b/xl-platform/getip-ecommerce deleted file mode 100755 index 41e3e9c..0000000 --- a/xl-platform/getip-ecommerce +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -SGID=$(aws ec2 describe-security-groups --filter "Name=group-name,Values=`whoami`-ecommerce-ecs-security-group" --output text --query 'SecurityGroups[0].GroupId') -PUBIP=$(aws ec2 describe-network-interfaces --filter="Name=group-id,Values=$SGID" --output text --query 'NetworkInterfaces[0].Association.PublicIp') -echo "Access Gateway at http://$PUBIP:8080" -echo "Access Registry at http://$PUBIP:8761" - -# The open command only works on macOS -if [ `uname -s` == "Darwin" ]; then - open "http://$PUBIP" -fi diff --git a/xl-platform/kubernetes/.yo-rc.json b/xl-platform/kubernetes/.yo-rc.json deleted file mode 100644 index 9d17a38..0000000 --- a/xl-platform/kubernetes/.yo-rc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "generator-jhipster": { - "appsFolders": [ - "invoice", - "notification", - "online-store" - ], - "directoryPath": "../../", - "clusteredDbApps": [], - "serviceDiscoveryType": "eureka", - "jwtSecretKey": "NWJhN2MyYmEzYWY5ZmE4NmE1ODVkOTFmNzFkOTBmMDE0ZGEyOGZkZDgyZDhkMmIwNGYzZDU0YTY5OGU2OGY1YjcwZmJjYzIyZGMzOTlmNDA5NjdlODI5N2NiYmJjM2ZhMzNkYQ==", - "dockerRepositoryName": "xebialabsunsupported", - "dockerPushCommand": "docker push", - "kubernetesNamespace": "xl-demo", - "kubernetesServiceType": "LoadBalancer", - "monitoring": "elk", - "istio": "no", - "istioRoute": false - } -} \ No newline at end of file diff --git a/xl-platform/kubernetes/README.md b/xl-platform/kubernetes/README.md deleted file mode 100644 index 3e7ee22..0000000 --- a/xl-platform/kubernetes/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# JHipster generated kubernetes configuration - -## Preparation - -You will need to push your image to a registry. If you have not done so, use the following commands to tag and push the images: - -``` -$ docker image tag ecommerce-invoice xebialabsunsupported/ecommerce-invoice -$ docker push xebialabsunsupported/ecommerce-invoice -$ docker image tag ecommerce-notification xebialabsunsupported/ecommerce-notification -$ docker push xebialabsunsupported/ecommerce-notification -$ docker image tag ecommerce-store xebialabsunsupported/ecommerce-store -$ docker push xebialabsunsupported/ecommerce-store -``` - -## Deployment - -You can deploy all your apps by running the below bash command: - -``` -./kubectl-apply.sh -``` - -## Exploring your services - - -Use these commands to find your application's IP addresses: - -``` -$ kubectl get svc store -n xl-demo -``` - -## Scaling your deployments - -You can scale your apps using - -``` -$ kubectl scale deployment --replicas -n xl-demo -``` - -## zero-downtime deployments - -The default way to update a running app in kubernetes, is to deploy a new image tag to your docker registry and then deploy it using - -``` -$ kubectl set image deployment/-app = -n xl-demo -``` - -Using livenessProbes and readinessProbe allows you to tell kubernetes about the state of your apps, in order to ensure availablity of your services. You will need minimum 2 replicas for every app deployment, you want to have zero-downtime deployed. This is because the rolling upgrade strategy first kills a running replica in order to place a new. Running only one replica, will cause a short downtime during upgrades. - -## Monitoring tools - -### JHipster console - -Your application logs can be found in JHipster console (powered by Kibana). You can find its service details by -``` -$ kubectl get svc jhipster-console -n xl-demo -``` - -* If you have chosen *Ingress*, then you should be able to access Kibana using the given ingress domain. -* If you have chosen *NodePort*, then point your browser to an IP of any of your nodes and use the node port described in the output. -* If you have chosen *LoadBalancer*, then use the IaaS provided LB IP - -## JHipster registry - -The registry is deployed using a headless service in kubernetes, so the primary service has no IP address, and cannot get a node port. You can create a secondary service for any type, using: - -``` -$ kubectl expose service jhipster-registry --type=NodePort --name=exposed-registry -n xl-demo -``` - -and explore the details using - -``` -$ kubectl get svc exposed-registry -n xl-demo -``` - -For scaling the JHipster registry, use - -``` -$ kubectl scale statefulset jhipster-registry --replicas 3 -n xl-demo -``` - - -## Troubleshooting - -> my apps doesn't get pulled, because of 'imagePullBackof' - -check the registry your kubernetes cluster is accessing. If you are using a private registry, you should add it to your namespace by `kubectl create secret docker-registry` (check the [docs](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) for more info) - -> my apps get killed, before they can boot up - -This can occur, if your cluster has low resource (e.g. Minikube). Increase the `initialDelySeconds` value of livenessProbe of your deployments - -> my apps are starting very slow, despite I have a cluster with many resources - -The default setting are optimized for middle scale clusters. You are free to increase the JAVA_OPTS environment variable, and resource requests and limits to improve the performance. Be careful! - - -> my SQL based microservice stuck during liquibase initialization when running multiple replicas - -Sometimes the database changelog lock gets corrupted. You will need to connect to the database using `kubectl exec -it` and remove all lines of liquibases `databasechangeloglock` table. diff --git a/xl-platform/kubernetes/kubectl-apply.sh b/xl-platform/kubernetes/kubectl-apply.sh deleted file mode 100755 index 4cb48a6..0000000 --- a/xl-platform/kubernetes/kubectl-apply.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# Files are ordered in proper order with needed wait for the dependent custom resource definitions to get initialized. -# Usage: bash kubectl-apply.sh - -kubectl apply -f namespace.yml -kubectl apply -f registry/ -kubectl apply -f invoice/ -kubectl apply -f notification/ -kubectl apply -f store/ -#kubectl apply -f console/ diff --git a/xl-platform/kubernetes/kubectl-delete.sh b/xl-platform/kubernetes/kubectl-delete.sh deleted file mode 100755 index 7c2a661..0000000 --- a/xl-platform/kubernetes/kubectl-delete.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -# Files are ordered in proper order with needed wait for the dependent custom resource definitions to get initialized. -# Usage: bash kubectl-apply.sh - -kubectl delete -f registry/ -kubectl delete -f invoice/ -kubectl delete -f notification/ -kubectl delete -f store/ -#kubectl delete -f console/ diff --git a/xl-platform/kubernetes/namespace.yml b/xl-platform/kubernetes/namespace.yml deleted file mode 100644 index 94a22bd..0000000 --- a/xl-platform/kubernetes/namespace.yml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: xl-demo - diff --git a/xl-platform/xld-ecommerce-microservice.yaml b/xl-platform/xld-ecommerce-microservice.yaml deleted file mode 100644 index ab20400..0000000 --- a/xl-platform/xld-ecommerce-microservice.yaml +++ /dev/null @@ -1,175 +0,0 @@ -apiVersion: "xl-deploy/v1beta1" -kind: "Infrastructure" -spec: -- name: "Infrastructure/AWS" - type: "aws.Cloud" - accesskey: "Dummy" - accessSecret: "Dummy" -- name: "Infrastructure/AWS/EKS-CLOUDFORMATION" - type: "aws.cloudformation.Stack" - region: "eu-west-1" ---- -apiVersion: "xl-deploy/v1beta1" -kind: "Environments" -spec: -- name: "Environments/AWS-CL" - type: "udm.Environment" - members: - - "Infrastructure/AWS/EKS-CLOUDFORMATION" ---- -apiVersion: xl-deploy/v1beta1 -kind: Applications -spec: -- name: E-COMMERCE - type: core.Directory - children: -### PROVISION EKS WITH CLOUDFORMATION TEMPLATES ### - - name: EKS-PROVISION - type: core.Directory - children: - - name: e-commerce-cloudformation-eks-user - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: eks-user - type: aws.cloudformation.Template - file: !file cloudformation/eks-user.yaml - capabilities: - - CAPABILITY_IAM - - CAPABILITY_NAMED_IAM - - name: e-commerce-cloudformation-eks-vpc - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: eks-vpc - type: aws.cloudformation.Template - file: !file cloudformation/eks-vpc.yaml - capabilities: - - CAPABILITY_IAM - - CAPABILITY_NAMED_IAM - - name: e-commerce-cloudformation-eks-master - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: eks-master - type: aws.cloudformation.Template - file: !file cloudformation/eks-master.yaml - capabilities: - - CAPABILITY_IAM - - CAPABILITY_NAMED_IAM - - name: e-commerce-cloudformation-eks-workers - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: eks-workers - type: aws.cloudformation.Template - file: !file cloudformation/eks-workers.yaml - capabilities: - - CAPABILITY_IAM - - CAPABILITY_NAMED_IAM - - name: e-commerce-k8s-configmap - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: aws-auth - type: k8s.ResourcesFile - file: !file aws-auth-cm.yaml - delimiters: "## ##" -### DEPLOYING APP TO K8S ### - - name: K8S - type: core.Directory - children: - - name: xl-demo-namespace - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: xl-demo - type: k8s.NamespaceSpec - namespaceName: 'xl-demo' - - name: e-commerce-invoice-mysql - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: invoice-mysql - type: k8s.ResourcesFile - file: !file kubernetes/invoice/invoice-mysql.yml - - name: e-commerce-store-mysql - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: store-mysql - type: k8s.ResourcesFile - file: !file kubernetes/store/store-mysql.yml - - name: e-commerce-notification-mongodb - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: notification-mongodb - type: k8s.ResourcesFile - file: !file kubernetes/notification/notification-mongodb.yml - - name: e-commerce-registry - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: application-config - type: k8s.ResourcesFile - file: !file kubernetes/registry/application-configmap.yml - - name: jhipster-registry - type: k8s.ResourcesFile - file: !file kubernetes/registry/jhipster-registry.yml - - name: e-commerce-invoice - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: invoice-deployment - type: k8s.ResourcesFile - file: !file kubernetes/invoice/invoice-deployment.yml - - name: invoice-svc - type: k8s.ResourcesFile - file: !file kubernetes/invoice/invoice-service.yml - - name: e-commerce-notification - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: invoice-notification - type: k8s.ResourcesFile - file: !file kubernetes/notification/notification-deployment.yml - - name: notification-svc - type: k8s.ResourcesFile - file: !file kubernetes/notification/notification-service.yml - - name: e-commerce-store - type: udm.Application - children: - - name: '1.0.0' - type: udm.DeploymentPackage - deployables: - - name: store-deployment - type: k8s.ResourcesFile - file: !file kubernetes/store/store-deployment.yml - - name: store-svc - type: k8s.ResourcesFile - file: !file kubernetes/store/store-service.yml \ No newline at end of file diff --git a/xl-platform/xld-ecs-fargate.yaml b/xl-platform/xld-ecs-fargate.yaml deleted file mode 100644 index cce9f24..0000000 --- a/xl-platform/xld-ecs-fargate.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: xl-deploy/v1beta1 -kind: Applications -spec: -- name: ecommerce - type: core.Directory - children: - - name: ecommerce-ecs-fargate-cluster - type: udm.Application - children: - - name: '1.0' - type: udm.DeploymentPackage - deployables: -# ECS cluster (no instances, FARGATE only) - - name: ecommerce-ecs-cluster - type: aws.ecs.ClusterSpec - clusterName: '{{username}}-ecommerce-ecs-cluster' - region: '{{region}}' - -# Networking - - name: ecommerce-ecs-vpc - type: aws.vpc.VPCSpec - vpcName: '{{username}}-ecommerce-ecs-vpc' - region: '{{region}}' - cidrBlock: 10.0.0.0/16 - createInternetGateway: true - internetGatewayName: '{{username}}-ecommerce-ecs-igw' - - name: ecommerce-ecs-subnet-ipv4-az-1a - type: aws.vpc.SubnetSpec - subnetName: '{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - region: '{{region}}' - availabilityZone: '{{region}}a' - vpc: 'Name:{{username}}-ecommerce-ecs-vpc' - cidrBlock: 10.0.0.0/24 - - name: ecommerce-ecs-subnet-ipv4-az-1b - type: aws.vpc.SubnetSpec - subnetName: '{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - region: '{{region}}' - availabilityZone: '{{region}}b' - vpc: 'Name:{{username}}-ecommerce-ecs-vpc' - cidrBlock: 10.0.1.0/24 - - name: ecommerce-ecs-route-table - type: aws.vpc.RouteTableSpec - routeTableName: '{{username}}-ecommerce-ecs-route-table' - region: '{{region}}' - vpc: 'Name:{{username}}-ecommerce-ecs-vpc' - is_main: true - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - routes: - - name: route1 - type: aws.vpc.RouteSpec - ipv4Address: 0.0.0.0/0 - gatewayId: 'Name:{{username}}-ecommerce-ecs-igw' - - name: ecommerce-ecs-security-group - type: aws.vpc.SecurityGroupSpec - securityGroupName: '{{username}}-ecommerce-ecs-security-group' - description: Created by XL Deploy - region: '{{region}}' - vpc: 'Name:{{username}}-ecommerce-ecs-vpc' - inboundRules: - - name: inbound - type: aws.vpc.SecurityGroupInboundRuleSpec - protocol: -1 - portRange: 22 - source: 0.0.0.0/0 \ No newline at end of file diff --git a/xl-platform/xld-ecs-service.yaml b/xl-platform/xld-ecs-service.yaml deleted file mode 100644 index 06c46df..0000000 --- a/xl-platform/xld-ecs-service.yaml +++ /dev/null @@ -1,318 +0,0 @@ -apiVersion: xl-deploy/v1beta1 -kind: Applications -spec: -- name: ecommerce - type: core.Directory - children: - - name: ecommerce-app-service - type: udm.Application - children: - - name: '1.0' - type: udm.DeploymentPackage - deployables: - - name: jhipster-registry - type: aws.ecs.ServiceSpec - serviceName: jhipster-registry - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - cpu: 1024 - memory: 2048 - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: jhipster-registry - containerName: jhipster-registry - type: aws.ecs.ContainerDefinitionSpec - image: jhipster/jhipster-registry:v4.0.2 - cpu: 1024 - softMemoryLimit: 768 - portMappings: - - name: port-mapping-8761 - type: aws.ecs.PortSpec - containerPort: 8761 - environment: - SPRING_PROFILES_ACTIVE: prod - SPRING_SECURITY_USER_PASSWORD: admin # need to see how to secure secrets - JHIPSTER_REGISTRY_PASSWORD: admin - JHIPSTER_SECURITY_AUTHENTICATION_JWT_SECRET: bXktc2VjcmV0LXRva2VuLXRvLWNoYW5nZS1pbi1wcm9kdWN0aW9uLWFuZC10by1rZWVwLWluLWEtc2VjdXJlLXBsYWNl - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE: native - # SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_LOCATIONS: file:./central-config - EUREKA_INSTANCE_LEASE_RENEWAL_INTERVAL_IN_SECONDS: 15 - EUREKA_INSTANCE_LEASE_EXPIRATION_DURATION_IN_SECONDS: 30 - EUREKA_SERVER_PEER_EUREKA_NODES_UPDATE_INTERVAL_MS: 15000 - EUREKA_SERVER_RENAWAL_THRESHOLD_UPDATE_INTERVAL_MS: 15000 - EUREKA_SERVER_REGISTRY_SYNC_RETRIES: 3 - EUREKA_SERVER_ENABLE_SELF_PRESERVATION: false - EUREKA_SERVER_PEER_NODE_CONNECT_TIMEOUT_MS: 2000 - EUREKA_CLIENT_FETCH_REGISTRY: true - EUREKA_CLIENT_REGISTER_WITH_EUREKA: true - # JHIPSTER_LOGGING_LOGSTASH_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_HOST: jhipster-logstash - # JHIPSTER_METRICS_LOGS_ENABLED: true - # JHIPSTER_METRICS_LOGS_REPORTFREQUENCY: 60 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - - - name: ecommerce-store-app - type: aws.ecs.ServiceSpec - serviceName: ecommerce-store-app - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-store-app - containerName: ecommerce-store-app - type: aws.ecs.ContainerDefinitionSpec - image: xebialabsunsupported/ecommerce-store - cpu: 1024 - softMemoryLimit: 768 - portMappings: - - name: port-mapping-8080 - type: aws.ecs.PortSpec - containerPort: 8080 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - environment: - SPRING_PROFILES_ACTIVE: prod,swagger - JHIPSTER_REGISTRY_PASSWORD: admin - SPRING_CLOUD_CONFIG_URI: http://admin:${jhipster.registry.password}@jhipster-registry:8761/config - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka - SPRING_DATASOURCE_URL: jdbc:mysql://ecommerce-store-mysql:3306/store?useUnicode=true&characterEncoding=utf8&useSSL=false - JHIPSTER_METRICS_LOGS_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_HOST: jhipster-logstash - # SPRING_ZIPKIN_ENABLED: true - # SPRING_ZIPKIN_BASE_URL: http://jhipster-zipkin - # SPRING_SLEUTH_PROPAGATION_KEYS: x-request-id,x-ot-span-context - JAVA_OPTS: -Xmx256m -Xms256m - # JHIPSTER_SLEEP: 30 - - - name: ecommerce-store-db - type: aws.ecs.ServiceSpec - serviceName: ecommerce-store-db - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-store-mysql - containerName: ecommerce-store-mysql - type: aws.ecs.ContainerDefinitionSpec - image: mysql:5.7.20 - cpu: 1024 - softMemoryLimit: 768 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - command: - - mysqld - - --lower_case_table_names=1 - - --skip-ssl - - --character_set_server=utf8mb4 - - --explicit_defaults_for_timestamp - environment: - MYSQL_USER: root - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: store - - - name: ecommerce-invoice-app - type: aws.ecs.ServiceSpec - serviceName: ecommerce-invoice-app - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-invoice-app - containerName: ecommerce-invoice-app - type: aws.ecs.ContainerDefinitionSpec - image: xebialabsunsupported/ecommerce-invoice - cpu: 512 - softMemoryLimit: 768 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - environment: - SPRING_PROFILES_ACTIVE: prod,swagger - JHIPSTER_REGISTRY_PASSWORD: admin - SPRING_CLOUD_CONFIG_URI: http://admin:${jhipster.registry.password}@jhipster-registry:8761/config - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka - SPRING_DATASOURCE_URL: jdbc:mysql://ecommerce-invoice-mysql:3306/invoice?useUnicode=true&characterEncoding=utf8&useSSL=false - JHIPSTER_METRICS_LOGS_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_HOST: jhipster-logstash - # SPRING_ZIPKIN_ENABLED: true - # SPRING_ZIPKIN_BASE_URL: http://jhipster-zipkin - # SPRING_SLEUTH_PROPAGATION_KEYS: x-request-id,x-ot-span-context - JAVA_OPTS: -Xmx256m -Xms256m - # JHIPSTER_SLEEP: 30 - - name: ecommerce-invoice-db - type: aws.ecs.ServiceSpec - serviceName: ecommerce-invoice-db - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-invoice-mysql - containerName: ecommerce-invoice-mysql - type: aws.ecs.ContainerDefinitionSpec - image: mysql:5.7.20 - cpu: 512 - softMemoryLimit: 768 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - command: - - mysqld - - --lower_case_table_names=1 - - --skip-ssl - - --character_set_server=utf8mb4 - - --explicit_defaults_for_timestamp - environment: - MYSQL_USER: root - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: invoice - - - name: ecommerce-notification-app - type: aws.ecs.ServiceSpec - serviceName: ecommerce-notification-app - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-notification-app - containerName: ecommerce-notification-app - type: aws.ecs.ContainerDefinitionSpec - image: xebialabsunsupported/ecommerce-notification - cpu: 512 - softMemoryLimit: 768 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" - environment: - SPRING_PROFILES_ACTIVE: prod,swagger - JHIPSTER_REGISTRY_PASSWORD: admin - SPRING_CLOUD_CONFIG_URI: http://admin:${jhipster.registry.password}@jhipster-registry:8761/config - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka - SPRING_DATA_MONGODB_URI: mongodb://ecommerce-notification-mongodb:27017 - SPRING_DATA_MONGODB_DATABASE: notification - JHIPSTER_METRICS_LOGS_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_ENABLED: true - # JHIPSTER_LOGGING_LOGSTASH_HOST: jhipster-logstash - # SPRING_ZIPKIN_ENABLED: true - # SPRING_ZIPKIN_BASE_URL: http://jhipster-zipkin - # SPRING_SLEUTH_PROPAGATION_KEYS: x-request-id,x-ot-span-context - JAVA_OPTS: -Xmx256m -Xms256m - # JHIPSTER_SLEEP: 30 - - - name: ecommerce-notification-db - type: aws.ecs.ServiceSpec - serviceName: ecommerce-notification-db - desiredCount: 1 - launchType: FARGATE - networkMode: awsvpc - assignPublicIp: true - executionRole: 'arn:aws:iam::932770550094:role/ecsTaskExecutionRole' - cpu: 1024 - memory: 2048 - subnets: - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1a' - - 'Name:{{username}}-ecommerce-ecs-subnet-ipv4-az-1b' - securityGroups: - - 'Name:{{username}}-ecommerce-ecs-security-group' - containerDefinitions: - - name: ecommerce-notification-mongodb - containerName: ecommerce-notification-mongodb - type: aws.ecs.ContainerDefinitionSpec - image: mongo:3.6.3 - cpu: 512 - softMemoryLimit: 768 - logConfiguration: - - name: cloudwatch-log-registry - type: aws.ecs.LogConfigurationSpec - logDriver: awslogs - options: - awslogs-group: "/ecs/ecommerce" - awslogs-region: "{{region}}" - awslogs-stream-prefix: "ecs" \ No newline at end of file diff --git a/xl-platform/xlr-ecommerce.yaml b/xl-platform/xlr-ecommerce.yaml deleted file mode 100644 index 86a6ae4..0000000 --- a/xl-platform/xlr-ecommerce.yaml +++ /dev/null @@ -1,305 +0,0 @@ -apiVersion: xl-release/v1beta1 -kind: Configurations -spec: -- name: XL Deploy - type: xldeploy.XLDeployServer - url: http://xld:4516 - ### to be changed to secrets,plain text for now - username: admin - password: admin - ---- - -apiVersion: xl-release/v1beta1 -kind: Templates -spec: -- name: E-COMMERCE - type: xlrelease.Folder - children: - - name: e-commerce - type: xlrelease.Release - description: | - This XL Release template shows how to deploy and undeploy an application, based on microservices architecture, to AWS EKS using XL Deploy. - tags: - - e-commerce - - EKS - ### to be changed to secrets,plain text for now - scriptUsername: "admin" - scriptUserPassword: "admin" - variables: - - key: "control" - type: "xlrelease.MapStringStringVariable" - requiresValue: "false" - showOnReleaseStart: "false" - value: - namespace: "xl-demo" - serviceName: "store" - - key: "lbHostnameOrIp" - type: "xlrelease.StringVariable" - requiresValue: "false" - showOnReleaseStart: "false" - - key: "AWSaccessKey" - type: "xlrelease.StringVariable" - requiresValue: "true" - showOnReleaseStart: "true" - - key: "AWSaccessSecret" - type: "xlrelease.StringVariable" - requiresValue: "true" - showOnReleaseStart: "true" - - key: "store-admin-username" - type: "xlrelease.StringVariable" - requiresValue: "true" - showOnReleaseStart: "true" - - key: "store-admin-password" - type: "xlrelease.StringVariable" - requiresValue: "true" - showOnReleaseStart: "true" - - key: "xld-admin-password" - type: "xlrelease.PasswordStringVariable" - requiresValue: "true" - showOnReleaseStart: "true" - phases: - - name: Provision Infrastructure - color: '#ff9e3b' - type: xlrelease.Phase - tasks: - - name: Update AWS cloud with correct access key and secret - type: xlrelease.SequentialGroup - tasks: - - name: Add accessKey to AWS cloud CI - type: xld.UpdateCIProperty - server: XL Deploy - ciID: Infrastructure/AWS - ciProperty: accesskey - propertyValue: ${AWSaccessKey} - - name: Add accessSecret to AWS cloud CI - type: xld.UpdateCIProperty - server: XL Deploy - ciID: Infrastructure/AWS - ciProperty: accessSecret - propertyValue: ${AWSaccessSecret} - - name: Provision AWS VPC and IAM resources - type: xlrelease.ParallelGroup - tasks: - - name: Provision AWS IAM resources - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/EKS-PROVISION/e-commerce-cloudformation-eks-user/1.0.0 - deploymentEnvironment: Environments/AWS-CL - - name: Provision AWS VPC - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/EKS-PROVISION/e-commerce-cloudformation-eks-vpc/1.0.0 - deploymentEnvironment: Environments/AWS-CL - - name: Provision AWS EKS cluster - type: xlrelease.SequentialGroup - tasks: - - name: Provision EKS master node - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/EKS-PROVISION/e-commerce-cloudformation-eks-master/1.0.0 - deploymentEnvironment: Environments/AWS-CL - - name: Provision EKS workers nodes - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/EKS-PROVISION/e-commerce-cloudformation-eks-workers/1.0.0 - deploymentEnvironment: Environments/AWS-CL - - name: Add accessKey to EKS cluster CI - type: xld.UpdateCIProperty - server: XL Deploy - ciID: Infrastructure/EKS/EKS-CLUSTER - ciProperty: accessKey - propertyValue: ${AWSaccessKey} - - name: Add accessSecret to EKS cluster CI - type: xld.UpdateCIProperty - server: XL Deploy - ciID: Infrastructure/EKS/EKS-CLUSTER - ciProperty: accessSecret - propertyValue: ${AWSaccessSecret} - - name: Provision EKS config map for workers - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/EKS-PROVISION/e-commerce-k8s-configmap/1.0.0 - deploymentEnvironment: Environments/AWS-PREREQUISITE - - name: Deploy e-commerce application - type: xlrelease.Phase - tasks: - - name: Deploy xl-demo namespace - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/xl-demo-namespace/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy stateful services - type: xlrelease.ParallelGroup - tasks: - - name: Deploy invoice mysql svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-invoice-mysql/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy store mysql svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-store-mysql/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy notification mongodb svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-notification-mongodb/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy stateless services - type: xlrelease.SequentialGroup - tasks: - - name: Deploy registry svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-registry/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy invoice svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-invoice/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy notification svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-notification/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Deploy store svc - type: xldeploy.Deploy - server: XL Deploy - deploymentPackage: E-COMMERCE/K8S/e-commerce-store/1.0.0 - deploymentEnvironment: Environments/AWS-EKS - - name: Test - type: xlrelease.Phase - tasks: - - name: Get Store service public URL - type: xlrelease.SequentialGroup - tasks: - - name: Get Store k8s service specs - type: xldeploy.Controltask - server: "XL Deploy" - numberOfContinueRetrials: 100 - pollingInterval: 10 - ciId: "Infrastructure/EKS/EKS-CLUSTER" - taskName: "describeService" - variableMapping: - pythonScript.xlDeployTaskId: "${taskId}" - pythonScript.parameters: "${control}" - - name: Parse Store k8s service - type: webhook.XmlWebhook - URL: "http://xld:4516/deployit/tasks/v2/export" - method: "GET" - username: "admin" - xPathExpression: "/list/task[@id=\"${taskId}\"]//log/text()" - variableMapping: - pythonScript.result: "${taskOutput}" - pythonScript.password: "${xld-admin-password}" - - name: Get Store k8s service ip or hostname - type: xlrelease.ScriptTask - script: | - import re - m = re.search('hostname:(.*)\nip:([0-9.]+|None)', releaseVariables['taskOutput']) - ipHostname = [m.group(1),m.group(2)] - for item in ipHostname: - if "None" not in item: - releaseVariables['lbHostnameOrIp'] = item - # end of script - - name: "Check e-commerce application status" - type: "xlrelease.ScriptTask" - script: | - import urllib2 - import json - - token_url = 'http://${lbHostnameOrIp}:8080/jhipster-registry/api/authenticate' - instances_url = 'http://${lbHostnameOrIp}:8080/jhipster-registry/api/eureka/applications' - values = {"password": "${store-admin-password}", - "rememberMe": "false", - "username": "${store-admin-username}" } - - - def make_req(url, body=None, token=None): - req = urllib2.Request(url, json.dumps(body) if body else None, headers={'Content-type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer %s' % token}) - opener = urllib2.build_opener() - response = opener.open(req) - return json.loads(response.read()) - - token = make_req(token_url, body=values)['id_token'] - resp = make_req(instances_url, token=token) - if len(resp['applications']) == 4: - print "All instances are registered" - else: - print "Not all instances are registered. Only {0} are registered".format(len(resp['applications'])) - exit(1) - # end of script - - name: Undeploy Application - type: xlrelease.Phase - tasks: - - name: Undeploy stateless services - type: xlrelease.ParallelGroup - tasks: - - name: Undeploy registry svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-registry - - name: Undeploy invoice svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-invoice - - name: Undeploy notification svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-notification - - name: Undeploy store svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-store - - name: Undeploy stateful services - type: xlrelease.ParallelGroup - tasks: - - name: Undeploy invoice mysql svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-invoice-mysql - - name: Undeploy store mysql svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-store-mysql - - name: Undeploy notification mongodb svc - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/e-commerce-notification-mongodb - - name: Undeploy xl-demo namespace - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-EKS/xl-demo-namespace - - name: Deprovision Infrastructure - color: '#ff9e3b' - type: xlrelease.Phase - tasks: - - name: Deprovision AWS EKS cluster - type: xlrelease.SequentialGroup - tasks: - - name: Deprovision EKS config map for workers - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-PREREQUISITE/e-commerce-k8s-configmap - - name: Deprovision EKS workers nodes - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-CL/e-commerce-cloudformation-eks-workers - - name: Deprovision EKS master node - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-CL/e-commerce-cloudformation-eks-master - - name: Deprovision AWS VPC and IAM resources - type: xlrelease.ParallelGroup - tasks: - - name: Deprovision AWS IAM resources - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-CL/e-commerce-cloudformation-eks-user - - name: Deprovision AWS VPC - type: xldeploy.Undeploy - server: XL Deploy - deployedApplication: Environments/AWS-CL/e-commerce-cloudformation-eks-vpc diff --git a/xlw b/xlw new file mode 100755 index 0000000..534c420 --- /dev/null +++ b/xlw @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +############################################################################## +## +## XL Cli wrapper script for Linux/Darwin +## +############################################################################## + +set -e + +# detecting program dir +PROG_DIR="$(cd "$(dirname "${0:-$PWD}")" 2>/dev/null 1>&2 && pwd)" + +source "${PROG_DIR}/.xebialabs/wrapper.conf" + +XL_WRAPPER_HOME="${HOME}/.xebialabs/wrapper/${CLI_VERSION}" + +# checking OS +BINARY_TYPE="unknown" +case "`uname`" in + Darwin* ) + BINARY_TYPE="darwin-amd64" + ;; + Linux* ) + BINARY_TYPE="linux-amd64" + ;; +esac + +if [ ${BINARY_TYPE} = "unknown" ] ; then + echo "Unsupported OS `uname`" + exit 1 +fi + +# find target location +if [ ! -d "${XL_WRAPPER_HOME}" ] ; then + mkdir -p "${XL_WRAPPER_HOME}" +fi + +# if xl does not exist download it +XL_BIN="${XL_WRAPPER_HOME}/xl" +if [ ! -f "${XL_BIN}" ] ; then + echo "Downloading xl binary to ${XL_BIN}" + curl -fLso "${XL_BIN}.$$" "${CLI_BASE_URL}/${CLI_VERSION}/${BINARY_TYPE}/xl" + chmod +x "${XL_BIN}.$$" + mv "${XL_BIN}.$$" "${XL_BIN}" +fi + +# now run xl cli +exec "${XL_BIN}" "$@" diff --git a/xlw.bat b/xlw.bat new file mode 100755 index 0000000..627eb5c --- /dev/null +++ b/xlw.bat @@ -0,0 +1,33 @@ +@echo off +@rem ############################################################################## +@rem ## +@rem ## XL Cli wrapper script for Windows +@rem ## +@rem ############################################################################## + +if "%OS%"=="Windows_NT" setlocal + +set PROG_DIR=%~dp0 + +FOR /F "tokens=1,2 delims==" %%a IN (%PROG_DIR%\.xebialabs\wrapper.conf) DO (set %%a=%%~b) + +set XL_WRAPPER_HOME=%LOCALAPPDATA%\.xebialabs\wrapper\%CLI_VERSION% + +IF not exist %XL_WRAPPER_HOME% (mkdir %XL_WRAPPER_HOME%) + +set BINARY_NAME=xl.exe +set WRAPPER_BINARY=%XL_WRAPPER_HOME%\%BINARY_NAME% +set TEMP_BINARY_FILE=%WRAPPER_BINARY%.%RANDOM% + +if not exist %WRAPPER_BINARY% ( + echo Downloading XL binary v%CLI_VERSION% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%CLI_BASE_URL%/%CLI_VERSION%/windows-amd64/%BINARY_NAME%', '%TEMP_BINARY_FILE%')" || goto :error + call ren "%TEMP_BINARY_FILE%" %BINARY_NAME% || goto :error +) + +call %WRAPPER_BINARY% %* || goto :error + +if "%OS%"=="Windows_NT" endlocal + +:error +exit /b %errorlevel% \ No newline at end of file