diff --git a/.env b/.env index abfd8c55f..31c132e98 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -TAG=6.2.1 -ENV=dev +TAG=6.3.0 +ENV=prod PROFILE=production -AOT=no-aot -ELASTIC_VERSION=6.2.1 +AOT=aot +ELASTIC_VERSION=6.3.0 ELASTIC_PASSWORD=changeme diff --git a/.gitignore b/.gitignore index a064ebc2a..688694412 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ dmp-backend/web/src/main/ui-resources/static/ dmp-backend/data/target/data-1.0-SNAPSHOT.jar dmp-backend/data/target/ dmp-backend/queryable/target/ +dmp-backend/elastic/target/ +dmp-backend/queryengine/target/ diff --git a/ELK.Docker/.env b/ELK.Docker/.env index fcb78b08a..d2aa1da5a 100644 --- a/ELK.Docker/.env +++ b/ELK.Docker/.env @@ -1,3 +1,3 @@ -TAG=6.2.1 -ELASTIC_VERSION=6.2.1 +TAG=6.3.1 +ELASTIC_VERSION=6.3.1 ELASTIC_PASSWORD=changeme diff --git a/ELK.Docker/docker-compose.yml b/ELK.Docker/docker-compose.yml index 28357dce4..e64762965 100644 --- a/ELK.Docker/docker-compose.yml +++ b/ELK.Docker/docker-compose.yml @@ -100,7 +100,72 @@ services: networks: ['stack'] depends_on: ['kibana'] -#volumes: + +##########################DOCSBOX###################################################################### + web: + restart: always + build: ./docsbox-master/docsbox + expose: + - "8000" + links: + - redis:redis + volumes: + - docsbox:/home/docsbox + - media:/home/docsbox/media + command: gunicorn -b :8000 docsbox:app + networks: ['stack'] + + rqworker: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rq worker -c docsbox.settings + networks: ['stack'] + + rqscheduler: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rqscheduler -H redis -p 6379 -d 0 + networks: ['stack'] + + nginx: + restart: always + build: ./docsbox-master/nginx/ + ports: + - "81:80" + volumes: + - web + links: + - web:web + networks: ['stack'] + + redis: + restart: always + image: redis:latest + expose: + - "6379" + volumes: + - redisdata:/data + networks: ['stack'] + + +##########################SETTIGNS###################################################################### + +volumes: #esdata: - # driver: local + #driver: local + redisdata: + driver: local + docsbox: + driver: local + media: + driver: local networks: {stack: {}} + diff --git a/dmp-backend/Dockerfile b/dmp-backend/Dockerfile index 79cf08791..8701a23a0 100644 --- a/dmp-backend/Dockerfile +++ b/dmp-backend/Dockerfile @@ -1,5 +1,11 @@ FROM openjdk:8-jdk-alpine +RUN apk add --update \ + curl \ + && rm -rf /var/cache/apk/* VOLUME /tmp -ARG PROFILE=dev +ARG PROFILE=production +ENV PROF $PROFILE +ADD web/src/main/resources/ProjectConfiguration.xml /tmp/ProjectConfiguration.xml +ADD web/src/main/resources/ExternalUrls.xml /tmp/ExternalUrls.xml ADD web/target/web-1.0-SNAPSHOT.jar app.jar -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${PROFILE}","-jar","/app.jar"] \ No newline at end of file +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom" ,"-Dspring.profiles.active=${PROF}","-jar","/app.jar"] \ No newline at end of file diff --git a/dmp-backend/data/pom.xml b/dmp-backend/data/pom.xml index c7cfef263..7a256c0ea 100644 --- a/dmp-backend/data/pom.xml +++ b/dmp-backend/data/pom.xml @@ -21,5 +21,10 @@ queryable 1.0-SNAPSHOT + + eu.eudat + elastic + 1.0.0-SNAPSHOT + \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java index 2ffabff41..31072be46 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java @@ -1,6 +1,7 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.Dataset; +import eu.eudat.elastic.entities.Tag; import java.util.Date; import java.util.List; @@ -12,8 +13,10 @@ public class DatasetCriteria extends Criteria { private Date periodStart; private Date periodEnd; private List dmpIds; + private List tags; private boolean allVersions; + public boolean getAllVersions() { return allVersions; } @@ -53,4 +56,12 @@ public class DatasetCriteria extends Criteria { public void setDmpIds(List dmpIds) { this.dmpIds = dmpIds; } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java index 58969ef3b..e9adc4d5a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java @@ -14,15 +14,23 @@ import java.util.stream.Collectors; @NamedEntityGraphs({ @NamedEntityGraph( name = "datasetListingModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), + attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode(value = "datasetDataRepositories", subgraph = "datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, - subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})), + subgraphs = { + @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")}), + @NamedSubgraph(name = "datasetDataRepositories", attributeNodes = {@NamedAttributeNode("dataRepository")}) + }), + @NamedEntityGraph( name = "datasetWizardModel", attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}), @NamedEntityGraph( name = "datasetRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp")}, + subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("users")})), + @NamedEntityGraph( + name = "datasetDataRepositories", attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("creator")}, subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})) }) @@ -291,10 +299,10 @@ public class Dataset implements DataEntity { @Override public void update(Dataset entity) { this.setRegistries(entity.getRegistries()); - if(this.getDatasetDataRepositories()==null) this.setDatasetDataRepositories(new HashSet<>()); - if(!this.getDatasetDataRepositories().containsAll(entity.getDatasetDataRepositories())){ + if (this.getDatasetDataRepositories() == null) this.setDatasetDataRepositories(new HashSet<>()); + if (!this.getDatasetDataRepositories().containsAll(entity.getDatasetDataRepositories())) { this.getDatasetDataRepositories().removeAll(this.getDatasetDataRepositories()); - this.getDatasetDataRepositories().addAll(entity.getDatasetDataRepositories().stream().map(item->{ + this.getDatasetDataRepositories().addAll(entity.getDatasetDataRepositories().stream().map(item -> { item.setDataset(this); return item; }).collect(Collectors.toList())); @@ -302,8 +310,8 @@ public class Dataset implements DataEntity { this.setDescription(entity.getDescription()); this.setLabel(entity.getLabel()); this.setProperties(entity.getProperties()); - if(this.getDatasetExternalDatasets()==null) this.setDatasetExternalDatasets(new HashSet<>()); - if(!this.getDatasetExternalDatasets().containsAll(entity.getDatasetExternalDatasets())) { + if (this.getDatasetExternalDatasets() == null) this.setDatasetExternalDatasets(new HashSet<>()); + if (!this.getDatasetExternalDatasets().containsAll(entity.getDatasetExternalDatasets())) { this.getDatasetExternalDatasets().removeAll(this.getDatasetExternalDatasets()); this.getDatasetExternalDatasets().addAll(entity.getDatasetExternalDatasets().stream().map(item -> { item.setDataset(this); diff --git a/dmp-backend/elastic/pom.xml b/dmp-backend/elastic/pom.xml new file mode 100644 index 000000000..a78208200 --- /dev/null +++ b/dmp-backend/elastic/pom.xml @@ -0,0 +1,14 @@ + + + + dmp-backend + eu.eudat + 1.0.0-SNAPSHOT + + 4.0.0 + + elastic + + \ No newline at end of file diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java new file mode 100644 index 000000000..fa1bcd635 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java @@ -0,0 +1,7 @@ +package eu.eudat.elastic.criteria; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public abstract class Criteria { +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java new file mode 100644 index 000000000..61a6ae3dc --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java @@ -0,0 +1,20 @@ +package eu.eudat.elastic.criteria; + +import eu.eudat.elastic.entities.Tag; + +import java.util.List; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class DatasetCriteria extends Criteria { + public List tags; + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java new file mode 100644 index 000000000..37a8f9861 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java @@ -0,0 +1,7 @@ +package eu.eudat.elastic.criteria; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class TagCriteria extends Criteria { +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java new file mode 100644 index 000000000..2fca86b57 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java @@ -0,0 +1,60 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class Dataset implements ElasticEntity { + + private String id; + private List tags = new LinkedList<>(); + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { + builder.startObject(); + builder.field("id", this.id); + builder.startArray("tags"); + this.tags.forEach(x -> { + try { + x.toElasticEntity(builder); + } catch (IOException e) { + e.printStackTrace(); + } + }); + builder.endArray(); + builder.endObject(); + return builder; + } + + @Override + public Dataset fromElasticEntity(Map fields) { + if (fields != null) { + this.id = (String) fields.get("id"); + this.tags = ((List) fields.get("tags")); + } + return this; + } + +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java new file mode 100644 index 000000000..2f6b5f714 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java @@ -0,0 +1,15 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.document.DocumentField; +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface ElasticEntity { + XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException; + T fromElasticEntity(Map fields); +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java new file mode 100644 index 000000000..27e27a86f --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java @@ -0,0 +1,45 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class Tag implements ElasticEntity { + + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { + builder.startObject(); + builder.field("id", this.id); + builder.field("name", this.name); + builder.endObject(); + return builder; + } + + @Override + public Object fromElasticEntity(Map fields) { + return null; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java new file mode 100644 index 000000000..c5be3055e --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java @@ -0,0 +1,72 @@ +package eu.eudat.elastic.repository; + +import eu.eudat.elastic.criteria.DatasetCriteria; +import eu.eudat.elastic.entities.Dataset; +import org.elasticsearch.action.admin.indices.get.GetIndexRequest; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@Service("datasetRepository") +public class DatasetRepository extends ElasticRepository { + + @Autowired + public DatasetRepository(RestHighLevelClient client) { + super(client); + } + + @Override + public Dataset createOrUpdate(Dataset entity) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + IndexRequest request = new IndexRequest("datasets", "doc", entity.getId()).source(entity.toElasticEntity(builder)); + this.getClient().index(request); + return entity; + } + + @Override + public Dataset findDocument(String id) throws IOException { + GetRequest request = new GetRequest("datasets","doc",id); + GetResponse response = this.getClient().get(request); + return new Dataset().fromElasticEntity(response.getSourceAsMap()); + } + + @Override + public List query(DatasetCriteria criteria) throws ExecutionException, InterruptedException, IOException { + SearchRequest searchRequest = new SearchRequest(); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.termsQuery("tags.name.keyword", criteria.getTags().stream().map(x -> x.getName()).collect(Collectors.toList()))); + searchSourceBuilder.query(boolQuery); + searchRequest.source(searchSourceBuilder); + SearchResponse response = this.getClient().search(searchRequest); + return Arrays.stream(response.getHits().getHits()).map(x -> this.transformFromString(x.getSourceAsString(), Dataset.class)).collect(Collectors.toList()); + } + + @Override + public boolean exists() throws IOException { + GetIndexRequest request = new GetIndexRequest(); + request.indices("datasets"); + return this.getClient().indices().exists(request); + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java new file mode 100644 index 000000000..90b9f3d36 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java @@ -0,0 +1,36 @@ +package eu.eudat.elastic.repository; + +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.elastic.criteria.Criteria; +import eu.eudat.elastic.entities.ElasticEntity; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; + +import java.io.IOException; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public abstract class ElasticRepository implements Repository { + private RestHighLevelClient client; + + public RestHighLevelClient getClient() { + return client; + } + + public ElasticRepository(RestHighLevelClient client) { + this.client = client; + } + + public T transformFromString(String value, Class tClass) { + ObjectMapper mapper = new ObjectMapper(); + T item = null; + try { + item = mapper.readValue(value, tClass); + } catch (IOException e) { + e.printStackTrace(); + } + return item; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java new file mode 100644 index 000000000..22b98db46 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java @@ -0,0 +1,22 @@ +package eu.eudat.elastic.repository; + +import eu.eudat.elastic.criteria.Criteria; +import eu.eudat.elastic.entities.ElasticEntity; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ExecutionException; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface Repository { + + ET createOrUpdate(ET entity) throws IOException; + + ET findDocument(String id) throws IOException; + + List query(C criteria) throws ExecutionException, InterruptedException, IOException; + + boolean exists() throws IOException; +} diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 14d450858..691660a05 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -18,7 +18,8 @@ web data logging - + queryengine + elastic @@ -65,6 +66,19 @@ org.springframework.boot spring-boot-starter-data-jpa + + + + org.elasticsearch + elasticsearch + 6.3.1 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 6.3.1 + org.hibernate hibernate-core @@ -172,6 +186,11 @@ hibernate-jpamodelgen + + org.elasticsearch.client + transport + 6.3.0 + @@ -188,7 +207,7 @@ production - war + jar diff --git a/dmp-backend/queryengine/pom.xml b/dmp-backend/queryengine/pom.xml new file mode 100644 index 000000000..7e74fc9f2 --- /dev/null +++ b/dmp-backend/queryengine/pom.xml @@ -0,0 +1,22 @@ + + + + dmp-backend + eu.eudat + 1.0.0-SNAPSHOT + + 4.0.0 + + query-engine + + + + eu.eudat + data + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/dmp-backend/queryengine/src/main/java/Main.java b/dmp-backend/queryengine/src/main/java/Main.java new file mode 100644 index 000000000..d8e1c8d56 --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/Main.java @@ -0,0 +1,14 @@ +import eu.eudat.data.entities.DataRepository; +import eu.eudat.query.engine.builder.QueryBuilder; +import eu.eudat.query.engine.builder.QueryBuilderImpl; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class Main { + public void Test(){ + QueryBuilder queryBuilder = new QueryBuilderImpl<>(); + queryBuilder.where((entity, comparisonExpression) -> comparisonExpression.field("id").greaterThan(5)); + //queryBuilder.and(((entity, expression) -> expression.field("id").greaterThan(4)),((entity, expression) -> expression.field("id").greaterThan(5))); + } +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilder.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilder.java new file mode 100644 index 000000000..d81cb366c --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilder.java @@ -0,0 +1,16 @@ +package eu.eudat.query.engine.builder; + +import eu.eudat.query.engine.expressions.Expression; +import eu.eudat.query.engine.predicates.AndPredicate; +import eu.eudat.query.engine.predicates.ComparisonPredicate; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface QueryBuilder { + + Expression where(ComparisonPredicate wherePredicate); + + Expression and(AndPredicate andPredicate); + +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilderImpl.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilderImpl.java new file mode 100644 index 000000000..2ded22651 --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/builder/QueryBuilderImpl.java @@ -0,0 +1,22 @@ +package eu.eudat.query.engine.builder; + +import eu.eudat.query.engine.expressions.Expression; +import eu.eudat.query.engine.predicates.AndPredicate; +import eu.eudat.query.engine.predicates.ComparisonPredicate; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class QueryBuilderImpl implements QueryBuilder { + + + @Override + public Expression where(ComparisonPredicate wherePredicate) { + return null; + } + + @Override + public Expression and(AndPredicate andPredicate) { + return null; + } +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/AbstractFieldExpression.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/AbstractFieldExpression.java new file mode 100644 index 000000000..c61161db3 --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/AbstractFieldExpression.java @@ -0,0 +1,17 @@ +package eu.eudat.query.engine.expressions; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public abstract class AbstractFieldExpression> { + private String field; + + protected String getField() { + return field; + } + + public T field(String field) { + this.field = field; + return (T)this; + } +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/ComparisonExpression.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/ComparisonExpression.java new file mode 100644 index 000000000..38d59facf --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/ComparisonExpression.java @@ -0,0 +1,43 @@ +package eu.eudat.query.engine.expressions; + +import eu.eudat.query.engine.types.expression.comparison.ComparisonExpressionType; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class ComparisonExpression extends AbstractFieldExpression implements Expression { + + private ComparisonExpressionType type; + private Object value; + + public Expression greaterThan(T value){ + this.value = value; + this.type = ComparisonExpressionType.GREATER_THAN; + return this; + } + + public Expression greaterThanOrEqual(T value){ + this.value = value; + this.type = ComparisonExpressionType.GREATER_OR_EQUAL_THAN; + return this; + } + + public Expression equal(T value){ + this.value = value; + this.type = ComparisonExpressionType.EQUAL; + return this; + } + + public Expression lessThan(T value){ + this.value = value; + this.type = ComparisonExpressionType.LESS_THAN; + return this; + } + + public Expression lessOrEqualThan(T value){ + this.value = value; + this.type = ComparisonExpressionType.LESS_OR_EQUAL_THAN; + return this; + } + +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/Expression.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/Expression.java new file mode 100644 index 000000000..5109ed351 --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/expressions/Expression.java @@ -0,0 +1,7 @@ +package eu.eudat.query.engine.expressions; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface Expression { +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/AndPredicate.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/AndPredicate.java new file mode 100644 index 000000000..b7015e47a --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/AndPredicate.java @@ -0,0 +1,11 @@ +package eu.eudat.query.engine.predicates; + +import eu.eudat.query.engine.expressions.ComparisonExpression; +import eu.eudat.query.engine.expressions.Expression; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface AndPredicate { + Expression and(ComparisonPredicate... predicates); +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/ComparisonPredicate.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/ComparisonPredicate.java new file mode 100644 index 000000000..49c5da05a --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/ComparisonPredicate.java @@ -0,0 +1,9 @@ +package eu.eudat.query.engine.predicates; + +import eu.eudat.query.engine.expressions.ComparisonExpression; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface ComparisonPredicate extends Predicate { +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/Predicate.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/Predicate.java new file mode 100644 index 000000000..50598f472 --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/predicates/Predicate.java @@ -0,0 +1,11 @@ +package eu.eudat.query.engine.predicates; + +import eu.eudat.query.engine.expressions.Expression; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface Predicate { + Expression where(T entity, E expression); + +} diff --git a/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/types/expression/comparison/ComparisonExpressionType.java b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/types/expression/comparison/ComparisonExpressionType.java new file mode 100644 index 000000000..f2b9ec5ed --- /dev/null +++ b/dmp-backend/queryengine/src/main/java/eu/eudat/query/engine/types/expression/comparison/ComparisonExpressionType.java @@ -0,0 +1,8 @@ +package eu.eudat.query.engine.types.expression.comparison; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public enum ComparisonExpressionType { + EQUAL, GREATER_THAN, GREATER_OR_EQUAL_THAN, LESS_THAN, LESS_OR_EQUAL_THAN +} diff --git a/dmp-backend/web/pom.xml b/dmp-backend/web/pom.xml index d196e05b2..f54b3995c 100644 --- a/dmp-backend/web/pom.xml +++ b/dmp-backend/web/pom.xml @@ -31,6 +31,15 @@ queryable 1.0-SNAPSHOT + + + eu.eudat + elastic + 1.0.0-SNAPSHOT + + + + org.springframework.boot spring-boot-starter-web diff --git a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java index 09a73cb87..23ef674a3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java +++ b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java @@ -32,6 +32,7 @@ public class ResponsesCache { caches.add(new GuavaCache("organisations", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("registries", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("services", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new GuavaCache("tags", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("researchers", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); simpleCacheManager.setCaches(caches); System.out.println("OK"); diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java new file mode 100644 index 000000000..e9e8f9b1c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java @@ -0,0 +1,39 @@ +package eu.eudat.configurations; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.TransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@Configuration +public class ElasticSearchConfiguration { + + private Environment environment; + + @Autowired + public ElasticSearchConfiguration(Environment environment) { + this.environment = environment; + } + + @Bean + public RestHighLevelClient client() throws Exception { + RestHighLevelClient client = new RestHighLevelClient( + RestClient.builder( + new HttpHost(this.environment.getProperty("elasticsearch.host"), + Integer.parseInt(this.environment.getProperty("elasticsearch.port")), "http"))); + return client; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java index a70fd4ed6..3060e8cef 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java @@ -14,6 +14,7 @@ import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.file.Paths; import java.util.LinkedList; import java.util.List; @@ -47,7 +48,7 @@ public class DynamicProjectConfigurationProdImpl implements DynamicProjectConfig JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///" + System.getenv("CATALINA_HOME") + fileUrl).openStream(); + is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java index 2e04b02c5..3d111f234 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java @@ -74,7 +74,8 @@ public class DatasetWizardController extends BaseController { public @ResponseBody ResponseEntity> getSingle(@PathVariable String id, Principal principal) { try { - DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); + DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(),this.getApiContext().getOperationsContext().getDatasetRepository() + ,id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java new file mode 100644 index 000000000..8bdc1b995 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java @@ -0,0 +1,67 @@ +package eu.eudat.controllers; + +import eu.eudat.elastic.criteria.TagCriteria; +import eu.eudat.elastic.entities.Dataset; +import eu.eudat.elastic.entities.Tag; +import eu.eudat.elastic.repository.Repository; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.external.TagExternalSourcesModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@RestController +@CrossOrigin +@RequestMapping(value = {"/api"}) +public class TagController extends BaseController{ + + private Repository datasetRepository; + + @Autowired + public TagController(ApiContext apiContext, Repository tagRepository) { + super(apiContext); + this.datasetRepository = tagRepository; + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/tag/create"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> create(@RequestBody Dataset dataset) { + try { + Dataset tagEntity = this.datasetRepository.createOrUpdate(dataset); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(dataset).status(ApiMessageCode.SUCCESS_MESSAGE)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(e.getMessage())); + } + } + + @RequestMapping(method = RequestMethod.GET, value = {"/external/tags"}, produces = "application/json") + public @ResponseBody + ResponseEntity> listExternalTagModel( + @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type) { + try { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getTags(query,type); + TagExternalSourcesModel researchersExternalSourcesModel = new TagExternalSourcesModel().fromExternalItem(remoteRepos); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(researchersExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); + } catch (NoURLFound ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); + } catch (HugeResultSet ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); + } catch (Exception ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java index 19284f53e..94df54e41 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java @@ -20,6 +20,8 @@ public class CommonsManager { .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); externalSourcesConfiguration.setServices(configLoader.getExternalUrls().getServices().getUrls().stream() .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + externalSourcesConfiguration.setTags(configLoader.getExternalUrls().getTags().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); return externalSourcesConfiguration; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 0e43a22ca..531363dc5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -1,25 +1,27 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.data.dao.criteria.DataRepositoryCriteria; +import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; +import eu.eudat.data.dao.criteria.RegistryCriteria; +import eu.eudat.data.dao.criteria.ServiceCriteria; import eu.eudat.data.dao.entities.*; import eu.eudat.data.entities.*; +import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; +import eu.eudat.elastic.criteria.DatasetCriteria; +import eu.eudat.elastic.repository.DatasetRepository; +import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.models.HintedModelFactory; -import eu.eudat.data.dao.criteria.DataRepositoryCriteria; -import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; -import eu.eudat.data.dao.criteria.RegistryCriteria; -import eu.eudat.data.dao.criteria.ServiceCriteria; -import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.queryable.QueryableList; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.forms.VisibilityRuleService; import org.apache.commons.io.IOUtils; import org.json.JSONObject; import org.springframework.core.env.Environment; @@ -35,6 +37,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -42,8 +45,19 @@ import java.util.zip.ZipInputStream; public class DatasetManager { public DataTableData getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setTags(datasetTableRequest.getCriteria().getTags()); + List datasets = apiContext.getOperationsContext().getDatasetRepository().exists() ? + apiContext.getOperationsContext().getDatasetRepository().query(datasetCriteria) : new LinkedList<>(); + UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + if (datasetTableRequest.getCriteria().getTags() != null && !datasetTableRequest.getCriteria().getTags().isEmpty()) { + if (!datasets.isEmpty()) + items.where((builder, root) -> root.get("id").in(datasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); + else + items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()})); + } QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); DataTableData dataTable = new DataTableData(); @@ -62,11 +76,14 @@ public class DatasetManager { return dataTable; } - public DatasetWizardModel getSingle(DatasetDao datatasetRepository, String id) throws InstantiationException, IllegalAccessException { + public DatasetWizardModel getSingle(DatasetDao datatasetRepository, DatasetRepository elasticDatasetRepository, String id) throws InstantiationException, IllegalAccessException, IOException { DatasetWizardModel dataset = new DatasetWizardModel(); eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + eu.eudat.elastic.entities.Dataset datasetElastic = elasticDatasetRepository.exists() ? + elasticDatasetRepository.findDocument(id) : new eu.eudat.elastic.entities.Dataset(); dataset.setDatasetProfileDefinition(getPagedProfile(dataset, datasetEntity)); dataset.fromDataModel(datasetEntity); + dataset.setTags(datasetElastic.getTags()); return dataset; } @@ -75,7 +92,7 @@ public class DatasetManager { datasetprofile.setStatus(dataset.getStatus()); if (datasetEntity.getProperties() != null) { JSONObject jobject = new JSONObject(datasetEntity.getProperties()); - Map properties = (Map) jobject.toMap(); + Map properties = jobject.toMap(); datasetprofile.fromJsonObject(properties); } PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); @@ -180,15 +197,16 @@ public class DatasetManager { return newFile; } - public static eu.eudat.data.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel profile, Principal principal) throws Exception { - eu.eudat.data.entities.Dataset dataset = profile.toDataModel(); - propertiesModelToString(profile, dataset); + public static eu.eudat.data.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel datasetWizardModel, Principal principal) throws Exception { + eu.eudat.data.entities.Dataset dataset = datasetWizardModel.toDataModel(); + propertiesModelToString(datasetWizardModel, dataset); UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); dataset.setCreator(userInfo); + updateTags(apiContext.getOperationsContext().getDatasetRepository(), datasetWizardModel); createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), dataset); createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), dataset); - createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetServiceDao(),apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); - createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetExternalDatasetDao(),apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); + createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetServiceDao(), apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); + createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetExternalDatasetDao(), apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); } @@ -200,6 +218,15 @@ public class DatasetManager { dataset.setProperties(jobject.toString()); } + private static void updateTags(DatasetRepository datasetRepository, DatasetWizardModel datasetWizardModel) throws IOException { + if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) { + eu.eudat.elastic.entities.Dataset dataset = new eu.eudat.elastic.entities.Dataset(); + dataset.setId(datasetWizardModel.getId().toString()); + dataset.setTags(datasetWizardModel.getTags()); + datasetRepository.createOrUpdate(dataset); + } + } + private static void createRegistriesIfTheyDontExist(RegistryDao registryDao, eu.eudat.data.entities.Dataset dataset) { if (dataset.getRegistries() != null && !dataset.getRegistries().isEmpty()) { @@ -226,8 +253,7 @@ public class DatasetManager { datasetDataRepository.getDataRepository().setId(entries.get(0).getId()); datasetDataRepository.setDataset(dataset); dataset.getDatasetDataRepositories().add(datasetDataRepository); - } - else { + } else { DataRepository dataRepository = dataRepositoryDao.createOrUpdate(datasetDataRepository.getDataRepository()); datasetDataRepository.setDataRepository(dataRepository); dataset.getDatasetDataRepositories().add(datasetDataRepository); @@ -236,7 +262,7 @@ public class DatasetManager { } } - private static void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao,ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { + private static void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao, ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { Set services = dataset.getServices(); dataset.setServices(new HashSet<>()); if (services != null && !services.isEmpty()) { @@ -244,21 +270,20 @@ public class DatasetManager { ServiceCriteria criteria = new ServiceCriteria(); criteria.setLike(datasetService.getService().getLabel()); List entries = serviceDao.getWithCriteria(criteria).toList(); - if (entries != null && !entries.isEmpty()){ + if (entries != null && !entries.isEmpty()) { datasetService.getService().setId(entries.get(0).getId()); datasetService.setDataset(dataset); dataset.getServices().add(datasetService); - } - else { + } else { Service service = serviceDao.createOrUpdate(datasetService.getService()); - datasetService.setService(service ); + datasetService.setService(service); dataset.getServices().add(datasetService); } } } } - private static void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao,ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { + private static void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao, ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { Set externalDatasets = dataset.getDatasetExternalDatasets(); dataset.setDatasetExternalDatasets(new HashSet<>()); if (externalDatasets != null && !externalDatasets.isEmpty()) { @@ -270,8 +295,7 @@ public class DatasetManager { datasetExternalDataset.getExternalDataset().setId(entries.get(0).getId()); datasetExternalDataset.setDataset(dataset); dataset.getDatasetExternalDatasets().add(datasetExternalDataset); - } - else { + } else { ExternalDataset externalDataset = externalDatasetDao.createOrUpdate(datasetExternalDataset.getExternalDataset()); datasetExternalDataset.setExternalDataset(externalDataset); dataset.getDatasetExternalDatasets().add(datasetExternalDataset); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java index cc5c34260..5571e9e7b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java @@ -23,6 +23,7 @@ public class ExternalUrls implements Serializable { ResearcherUrls researchers; OrganisationUrls organisations; DatasetUrls datasets; + TagUrls tags; public RegistryUrls getRegistries() { @@ -59,6 +60,15 @@ public class ExternalUrls implements Serializable { return researchers; } + public TagUrls getTags() { + return tags; + } + + @XmlElement(name = "tags") + public void setTags(TagUrls tags) { + this.tags = tags; + } + @XmlElement(name = "researchers") public void setResearchers(ResearcherUrls researchers) { this.researchers = researchers; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java index 82828a0ed..37c1ab854 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java @@ -11,6 +11,7 @@ import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.file.Paths; /** * Created by ikalyvas on 2/9/2018. @@ -34,7 +35,7 @@ public class ProductionConfigLoader implements ConfigLoader { JAXBContext jaxbContext = JAXBContext.newInstance(ExternalUrls.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///" + System.getenv("CATALINA_HOME") + fileUrl).openStream(); + is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); externalUrls = (ExternalUrls) jaxbUnmarshaller.unmarshal(is); } catch (Exception ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java new file mode 100644 index 000000000..e3040b1a5 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java @@ -0,0 +1,35 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +/** + * Created by ikalyvas on 7/9/2018. + */ +public class TagUrls { + List urls; + FetchStrategy fetchMode; + + public List getUrls() { + return urls; + } + + @XmlElementWrapper + @XmlElement(name = "urlConfig") + public void setUrls(List urls) { + this.urls = urls; + } + + public FetchStrategy getFetchMode() { + return fetchMode; + } + + @XmlElement(name = "fetchMode") + public void setFetchMode(FetchStrategy fetchMode) { + this.fetchMode = fetchMode; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 4e8f4c74a..08141fe5b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -85,6 +85,15 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, query); } + @Cacheable("tags") + public List> getTags(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getTags().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getTags().getUrls(); + FetchStrategy fetchStrategy = configLoader.getExternalUrls().getTags().getFetchMode(); + return getAll(urlConfigs, fetchStrategy, query); + } + @Cacheable("datasets") public List> getDatasets(String query, String key) throws NoURLFound, HugeResultSet { List urlConfigs = diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java index 4e6b12331..42920db8a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java @@ -3,6 +3,7 @@ package eu.eudat.logic.services; import eu.eudat.logic.services.helpers.HelpersService; import eu.eudat.logic.services.operations.OperationsContext; import eu.eudat.logic.services.utilities.UtilitiesService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,6 +14,7 @@ public class ApiContextImpl implements ApiContext { private HelpersService helpersService; private UtilitiesService utilitiesService; + @Autowired public ApiContextImpl(OperationsContext operationsContext, HelpersService helpersService, UtilitiesService utilitiesService) { this.operationsContext = operationsContext; this.helpersService = helpersService; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java index 678b306ad..ccd6d914d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java @@ -1,5 +1,6 @@ package eu.eudat.logic.services.operations; +import eu.eudat.elastic.repository.DatasetRepository; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.helpers.FileStorageService; @@ -20,4 +21,5 @@ public interface OperationsContext { FileStorageService getFileStorageService(); + DatasetRepository getDatasetRepository(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java index ecc24007e..bd1ffd04c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java @@ -1,5 +1,6 @@ package eu.eudat.logic.services.operations; +import eu.eudat.elastic.repository.DatasetRepository; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.helpers.FileStorageService; @@ -18,15 +19,17 @@ public class OperationsContextImpl implements OperationsContext { private RemoteFetcher remoteFetcher; private BuilderFactory builderFactory; private FileStorageService fileStorageService; + private DatasetRepository datasetRepository; @Autowired public OperationsContextImpl(DatabaseRepository databaseRepository, ApplicationContext applicationContext, RemoteFetcher remoteFetcher - , BuilderFactory builderFactory, FileStorageService fileStorageService) { + , BuilderFactory builderFactory, FileStorageService fileStorageService,DatasetRepository datasetRepository) { this.databaseRepository = databaseRepository; this.applicationContext = applicationContext; this.remoteFetcher = remoteFetcher; this.builderFactory = builderFactory; this.fileStorageService = fileStorageService; + this.datasetRepository = datasetRepository; } @Override @@ -53,4 +56,13 @@ public class OperationsContextImpl implements OperationsContext { public FileStorageService getFileStorageService() { return fileStorageService; } + + @Override + public DatasetRepository getDatasetRepository() { + return datasetRepository; + } + + public void setDatasetRepository(DatasetRepository datasetRepository) { + this.datasetRepository = datasetRepository; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java index 7ccce0b4b..24c11a629 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java @@ -1,6 +1,7 @@ package eu.eudat.models.data.datasetwizard; import eu.eudat.data.entities.*; +import eu.eudat.elastic.entities.Tag; import eu.eudat.models.DataModel; import eu.eudat.models.data.dataset.DataRepository; import eu.eudat.models.data.dataset.Registry; @@ -29,6 +30,7 @@ public class DatasetWizardModel implements DataModel registries; private List services; private List dataRepositories; + private List tags; private List externalDatasets; private DatasetProfileListingModel profile; @@ -144,6 +146,14 @@ public class DatasetWizardModel implements DataModel getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + @Override public DatasetWizardModel fromDataModel(Dataset entity) { this.id = entity.getId(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java new file mode 100644 index 000000000..9a52a965a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java @@ -0,0 +1,22 @@ +package eu.eudat.models.data.external; + +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 7/9/2018. + */ +public class TagExternalSourcesModel extends ExternalListingItem { + + @Override + public TagExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { + ExternalSourcesItemModel model = new ExternalSourcesItemModel(); + model.setId(item.get("pid")); + model.setUri(item.get("label")); + model.setName(item.get("name")); + this.add(model); + } + return this; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/externalurl/ExternalSourcesConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/externalurl/ExternalSourcesConfiguration.java index b69a64d99..c9e8df87d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/externalurl/ExternalSourcesConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/externalurl/ExternalSourcesConfiguration.java @@ -37,6 +37,15 @@ public class ExternalSourcesConfiguration { private List dataRepositories; private List services; private List externalDatasets; + private List tags; + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } public List getRegistries() { return registries; diff --git a/dmp-backend/web/src/main/resources/ExternalUrls.xml b/dmp-backend/web/src/main/resources/ExternalUrls.xml index c48d22ad2..40b80345a 100644 --- a/dmp-backend/web/src/main/resources/ExternalUrls.xml +++ b/dmp-backend/web/src/main/resources/ExternalUrls.xml @@ -44,6 +44,45 @@ FIRST + + + + cristin + + 1 + https://eestore.paas2.uninett.no/api/tags/ + + $['data'][*]['attributes'] + + 'pid' + 'name' + 'uri' + 'description' + + + $['meta']['pagination']['page','pages','count'] + + + openAire + + 1 + https://eestore.paas2.uninett.no/api/tags/ + + $['data'][*]['attributes'] + + 'pid' + 'name' + 'uri' + 'description' + + + $['meta']['pagination']['page','pages','count'] + + + + + FIRST + diff --git a/dmp-backend/web/src/main/resources/application.properties b/dmp-backend/web/src/main/resources/application.properties index 62e72673c..d2c3c7ad7 100644 --- a/dmp-backend/web/src/main/resources/application.properties +++ b/dmp-backend/web/src/main/resources/application.properties @@ -15,8 +15,8 @@ production.database.password=dmpt00lu$r ##########################/Persistence########################################## ###################Allowed Proxy Service Host ############################ eu.eudat.logic.proxy.allowed.host=https://eestore.paas2.uninett.no -configuration.externalUrls=/classes/ExternalUrls.xml -configuration.dynamicProjectUrl=/classes/ProjectConfiguration.xml +configuration.externalUrls=/tmp/ExternalUrls.xml +configuration.dynamicProjectUrl=/tmp/ProjectConfiguration.xml ####################################################### ########################/Email############################# @@ -59,7 +59,7 @@ b2access.externallogin.redirect_uri=http://dmp.eudat.org:4200/api/oauth/authoriz b2access.externallogin.clientid=eudatdmptool b2access.externallogin.clientSecret=A3b*1*92 ################################################################################# -pdf.converter.url=http://localhost/ +pdf.converter.url=http://localhost:81/ files.storage.temp = temp files.storage.final = final ################################################################################# @@ -69,4 +69,7 @@ project.configuration.grant.name = Grant ################################################################################# http-logger.initial-delay = 0 http-logger.delay = 10 -http-logger.server-address = http://logstash:31311 \ No newline at end of file +http-logger.server-address = http://logstash:31311 +#############################Elastic Search###################################### +elasticsearch.host = localhost +elasticsearch.port = 9201 diff --git a/dmp-frontend/.angular-cli.json b/dmp-frontend/.angular-cli.json deleted file mode 100644 index 5ca150f42..000000000 --- a/dmp-frontend/.angular-cli.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "dmp-frontend" - }, - "apps": [ - { - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico" - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "styles.scss" - ], - "scripts": [], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json", - "exclude": "**/node_modules/**" - }, - { - "project": "src/tsconfig.spec.json", - "exclude": "**/node_modules/**" - }, - { - "project": "e2e/tsconfig.e2e.json", - "exclude": "**/node_modules/**" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "css", - "component": {} - } -} diff --git a/dmp-frontend/Dockerfile b/dmp-frontend/Dockerfile index fd0126fdb..ef2af307d 100644 --- a/dmp-frontend/Dockerfile +++ b/dmp-frontend/Dockerfile @@ -5,9 +5,11 @@ RUN npm cache clear --force && npm install COPY ./ /app/ ARG env=dev ARG aot=--no-aot -RUN ng build --$env --$aot +RUN echo $env +RUN echo $aot +RUN if [ "$env" = "prod" ]; then ng build --$env --$aot; else ng build --$aot; fi # Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx FROM nginx:1.13 COPY --from=angular /app/dist/ /usr/share/nginx/html -COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf \ No newline at end of file +COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf diff --git a/dmp-frontend/angular.json b/dmp-frontend/angular.json new file mode 100644 index 000000000..3727a1e15 --- /dev/null +++ b/dmp-frontend/angular.json @@ -0,0 +1,132 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "dmp-frontend": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + "src/assets", + "src/favicon.ico" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "dmp-frontend:build" + }, + "configurations": { + "production": { + "browserTarget": "dmp-frontend:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "dmp-frontend:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "scripts": [], + "styles": [ + "src/styles.scss" + ], + "assets": [ + "src/assets", + "src/favicon.ico" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "dmp-frontend-e2e": { + "root": "", + "sourceRoot": "e2e", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "./protractor.conf.js", + "devServerTarget": "dmp-frontend:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "e2e/tsconfig.e2e.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "dmp-frontend", + "schematics": { + "@schematics/angular:component": { + "prefix": "app", + "styleext": "css" + }, + "@schematics/angular:directive": { + "prefix": "app" + } + } +} \ No newline at end of file diff --git a/dmp-frontend/package-lock.json b/dmp-frontend/package-lock.json index c856085ab..59afa7947 100644 --- a/dmp-frontend/package-lock.json +++ b/dmp-frontend/package-lock.json @@ -4,202 +4,540 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular-devkit/architect": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.6.8.tgz", + "integrity": "sha512-ZKTm/zC61iY9IBHOEAKoMSzZpvhkmv+1O/HHzpHEuR551jCzu6vSyCmMY9Z7GBcccscCV+hjeSMwgFrFRcqlkw==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.8", + "rxjs": "^6.0.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.6.8.tgz", + "integrity": "sha512-VGqYAk8jpISraz2UHfsDre270NOUmV0CTSZw2p9sm5g/XIr5m+IHetFZz3gpoAr9+If2aFTs8Rt3sGdCRzwBqA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.6.8", + "@angular-devkit/build-optimizer": "0.6.8", + "@angular-devkit/core": "0.6.8", + "@ngtools/webpack": "6.0.8", + "ajv": "~6.4.0", + "autoprefixer": "^8.4.1", + "cache-loader": "^1.2.2", + "chalk": "~2.2.2", + "circular-dependency-plugin": "^5.0.2", + "clean-css": "^4.1.11", + "copy-webpack-plugin": "^4.5.1", + "file-loader": "^1.1.11", + "glob": "^7.0.3", + "html-webpack-plugin": "^3.0.6", + "istanbul": "^0.4.5", + "istanbul-instrumenter-loader": "^3.0.1", + "karma-source-map-support": "^1.2.0", + "less": "^3.0.4", + "less-loader": "^4.1.0", + "license-webpack-plugin": "^1.3.1", + "lodash": "^4.17.4", + "memory-fs": "^0.4.1", + "mini-css-extract-plugin": "~0.4.0", + "minimatch": "^3.0.4", + "node-sass": "^4.9.0", + "opn": "^5.1.0", + "parse5": "^4.0.0", + "portfinder": "^1.0.13", + "postcss": "^6.0.22", + "postcss-import": "^11.1.0", + "postcss-loader": "^2.1.5", + "postcss-url": "^7.3.2", + "raw-loader": "^0.5.1", + "resolve": "^1.5.0", + "rxjs": "^6.0.0", + "sass-loader": "^7.0.1", + "silent-error": "^1.1.0", + "source-map-support": "^0.5.0", + "stats-webpack-plugin": "^0.6.2", + "style-loader": "^0.21.0", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.2", + "tree-kill": "^1.2.0", + "uglifyjs-webpack-plugin": "^1.2.5", + "url-loader": "^1.0.1", + "webpack": "~4.8.1", + "webpack-dev-middleware": "^3.1.3", + "webpack-dev-server": "^3.1.4", + "webpack-merge": "^4.1.2", + "webpack-sources": "^1.1.0", + "webpack-subresource-integrity": "^1.1.0-rc.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, "@angular-devkit/build-optimizer": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", - "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.6.8.tgz", + "integrity": "sha512-of5syQbv3uNPp4AQkfRecfnp8AE8kvffbfYi+FFPZ6OGr7e59T1fGwk6+Zgb2qQFQg8HO2tzWI/uygtLIqmbmw==", "dev": true, "requires": { "loader-utils": "^1.1.0", "source-map": "^0.5.6", - "typescript": "~2.6.2", - "webpack-sources": "^1.0.1" + "typescript": "~2.9.1", + "webpack-sources": "^1.1.0" }, "dependencies": { "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", "dev": true } } }, "@angular-devkit/core": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", - "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.6.8.tgz", + "integrity": "sha512-rkIa1OSVWTt4g9leLSK/PsqOj3HZbDKHbZjqlslyfVa3AyCeiumFoOgViOVXlYgPX3HHDbE5uH24nyUWSD8uww==", "dev": true, "requires": { - "ajv": "~5.5.1", - "chokidar": "^1.7.0", - "rxjs": "^5.5.6", + "ajv": "~6.4.0", + "chokidar": "^2.0.3", + "rxjs": "^6.0.0", "source-map": "^0.5.6" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.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" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.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" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "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 + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } }, "@angular-devkit/schematics": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", - "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.6.8.tgz", + "integrity": "sha512-R4YqAUdo62wtrhX/5HSRGSKXNTWqfQb66ZE6m8jj6GEJNFKdNXMdxOchxr07LCiKTxfh1w6G3nGzxIsu/+D4KA==", "dev": true, "requires": { - "@ngtools/json-schema": "^1.1.0", - "rxjs": "^5.5.6" - }, - "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - } + "@angular-devkit/core": "0.6.8", + "rxjs": "^6.0.0" } }, "@angular/animations": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz", - "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.0.7.tgz", + "integrity": "sha512-yOig45sxzpEmlXy+eFgh2v2yxoE/Hh9rn7BX82uj71yobSpCYoe58AEOay1cu0FCcLi/P5qltHepDrRRxNxPMw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/cdk": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz", - "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.1.0.tgz", + "integrity": "sha512-IrM+cjeUW0TmFIZb7nMtARa9dKOVU9vXlwzllcwcBYHJNb9YcnLPaWqB2LqDQFuH/JQyt+oAG+VyfMmU+yk9uw==", "requires": { "tslib": "^1.7.1" } }, "@angular/cli": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz", - "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==", - "dev": true, - "requires": { - "@angular-devkit/build-optimizer": "0.3.2", - "@angular-devkit/core": "0.3.2", - "@angular-devkit/schematics": "0.3.2", - "@ngtools/json-schema": "1.2.0", - "@ngtools/webpack": "1.10.2", - "@schematics/angular": "0.3.2", - "@schematics/package-update": "0.3.2", - "ajv": "^6.1.1", - "autoprefixer": "^7.2.3", - "cache-loader": "^1.2.0", - "chalk": "~2.2.0", - "circular-dependency-plugin": "^4.2.1", - "clean-css": "^4.1.11", - "common-tags": "^1.3.1", - "copy-webpack-plugin": "~4.4.1", - "core-object": "^3.1.0", - "denodeify": "^1.2.1", - "ember-cli-string-utils": "^1.0.0", - "extract-text-webpack-plugin": "^3.0.2", - "file-loader": "^1.1.5", - "fs-extra": "^4.0.0", - "glob": "^7.0.3", - "html-webpack-plugin": "^2.29.0", - "istanbul-instrumenter-loader": "^3.0.0", - "karma-source-map-support": "^1.2.0", - "less": "^2.7.2", - "less-loader": "^4.0.5", - "license-webpack-plugin": "^1.0.0", - "loader-utils": "1.1.0", - "lodash": "^4.11.1", - "memory-fs": "^0.4.1", - "minimatch": "^3.0.4", - "node-modules-path": "^1.0.0", - "node-sass": "^4.7.2", - "nopt": "^4.0.1", - "opn": "~5.1.0", - "portfinder": "~1.0.12", - "postcss": "^6.0.16", - "postcss-import": "^11.0.0", - "postcss-loader": "^2.0.10", - "postcss-url": "^7.1.2", - "raw-loader": "^0.5.1", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.0.8.tgz", + "integrity": "sha512-DhH1Zq5Yonthw6zh6W07fhf+9XrAZbD1fcQ0MrmbxlieCfLlTAdBqyK2LavFCKwSZkUMLF6UHM3+jiNRVZSSIg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.6.8", + "@angular-devkit/core": "0.6.8", + "@angular-devkit/schematics": "0.6.8", + "@schematics/angular": "0.6.8", + "@schematics/update": "0.6.8", + "opn": "~5.3.0", "resolve": "^1.1.7", - "rxjs": "^5.5.6", - "sass-loader": "^6.0.6", + "rxjs": "^6.0.0", "semver": "^5.1.0", "silent-error": "^1.0.0", - "source-map-support": "^0.4.1", - "style-loader": "^0.19.1", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.1", - "uglifyjs-webpack-plugin": "^1.1.8", - "url-loader": "^0.6.2", - "webpack": "~3.11.0", - "webpack-dev-middleware": "~1.12.0", - "webpack-dev-server": "~2.11.0", - "webpack-merge": "^4.1.0", - "webpack-sources": "^1.0.0", - "webpack-subresource-integrity": "^1.0.1" - }, - "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - } + "symbol-observable": "^1.2.0", + "yargs-parser": "^10.0.0" } }, "@angular/common": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz", - "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.0.7.tgz", + "integrity": "sha512-MUCCs3FLwqyp5wuvkUTHVGMTd3bNGDxD5IJNvaLgVliGe4r0IlETRXYqyRPs7gdVFPbiJ97P1DUONArj9xL9XA==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz", - "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.0.7.tgz", + "integrity": "sha512-J9I2U4NiWIBXl0ZOJkBW5G7xXhphggSirTwFLD4yKCTeJXgyldZytJZRkDUx1uouZtI2/PycvaOZoRr85N67AA==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz", - "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.0.7.tgz", + "integrity": "sha512-nDIo4TtE3oXgZiQ5vJEcr5fi3FuXRDJQSOeOQinpCrtEt3s4pU5WAX5DLFGPSD2C/EXRDvHZgF9OTJeu5U4ErQ==", "dev": true, "requires": { "chokidar": "^1.4.2", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "tsickle": "^0.27.2" + "tsickle": "^0.29.0" }, "dependencies": { "minimist": { @@ -211,101 +549,90 @@ } }, "@angular/core": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz", - "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.0.7.tgz", + "integrity": "sha512-aZ0NvbYsMGqg0zUu7+9vuDxnGzwe++RsBBhlwHZHz1ZZwJmU6VJhUhaI+MuKC7rHyFFr9vUxvJ7ilhGaK2+J7A==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/flex-layout": { - "version": "5.0.0-beta.14", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-5.0.0-beta.14.tgz", - "integrity": "sha512-/fsOqXFUKdCmzzZx0bZ0HCYwcV+BSbVuIgOhaCrZKHj2rqiWKKPgj1ErU3HMT68bBBGag0u0skTdLGtrBorRIA==", + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-6.0.0-beta.16.tgz", + "integrity": "sha512-0AYtIBGrEJshdFMc6TXGloCkD19YTCRKVJl6xZHX4H5dLnUn+daqXcbh4UsWhayevnLp85HEf2ViHLmTa6jv3g==", "requires": { "tslib": "^1.7.1" } }, "@angular/forms": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz", - "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.0.7.tgz", + "integrity": "sha512-bFRdWxLmTiG7z0yZaq22oBHTgVSpJwUJEbZ5ieu21JqTgIDYne+YR/xCJrPj+P2S5NDlEK84g/4y4GoNt/thhQ==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/http": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", - "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.0.7.tgz", + "integrity": "sha512-zk/kjsfEXjEQIRpmsjuJO5wgFNxj7JGY6Bq0nianZuyCuj/mlm0zflww2NLX4O22IMnvVSun2Kx+kDY44n4hfw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/language-service": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz", - "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.0.7.tgz", + "integrity": "sha512-R96kTy9Hpy5QPHirJz+5JjnzjJZdwbGwZ6rpq79Fe15RYaYfMjFTAAhmmOgWrnTFBug0QWBWyKV7950JcJIr3Q==", "dev": true }, "@angular/material": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.5.tgz", - "integrity": "sha512-IltfBeTJWnmZehOQNQ7KoFs7MGWuZTe0g21hIitGkusVNt1cIoTD24xKH5jwztjH19c04IgiwonpurMKM6pBCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.1.0.tgz", + "integrity": "sha512-9FLWjVnHFzAoGSWU5dz8X/QYeBtZGijMJIp1k94QDYz+2xA10IbesEgnv8I5Ri3EPnjV/gCspeSkt1ClLc95CA==", "requires": { "tslib": "^1.7.1" } }, "@angular/platform-browser": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz", - "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.0.7.tgz", + "integrity": "sha512-CASH1CDr2DD+aBrWN9qpDDFTI3H6p/oqH23h28bEV+LZl7F57r4sj8KXKgaE+mcrOFRQqXTAlPoq3hRCLmhtVA==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz", - "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.0.7.tgz", + "integrity": "sha512-8G45A9w8UJvX3vPEHqeJHt/sd0zu6w1M+rsnOCo78r35SjsLbrmDNhc4VkLZFJ+iNjgPWtNtdpeXQqtTHE46yw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/router": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz", - "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.0.7.tgz", + "integrity": "sha512-KuQBeIgfiwV3bLafepMhYVJQIAF8cTckCudFh5Z0OqckJgGsWSgtvEdtBctPi+lzt7OQBi7Ym2rOv3X0dOvu0Q==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@covalent/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@covalent/core/-/core-1.0.0.tgz", - "integrity": "sha512-qUGL6CtyHNa3ttKGrvuQY0lJyQR9Dxp04vP0vrXmYrKapVbfYZ82qwJ2+PrX1EcWAQ6b/B2giFe0Q83ePin04g==", + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@covalent/core/-/core-2.0.0-beta.2.tgz", + "integrity": "sha512-b0SXWn7WxIlzLsjSxgV+a44U23dvcNKNDUY2h81ZYO/Bd0VOWc06RTdpCsq6N23JkWArvp+2B0PvZpH6lDacYA==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, - "@ngtools/json-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", - "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", - "dev": true - }, "@ngtools/webpack": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", - "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.0.8.tgz", + "integrity": "sha512-jorGpTd82ILbyUwg4JQekovHFaYwSMlZan4f7x+sd3+2WgyL3Z1+ZbVSGKvXZWKS/mAVx7eLkRikzJkuC4FgHw==", "dev": true, "requires": { - "chalk": "~2.2.0", - "enhanced-resolve": "^3.1.0", - "loader-utils": "^1.0.2", - "magic-string": "^0.22.3", - "semver": "^5.3.0", - "source-map": "^0.5.6", + "@angular-devkit/core": "0.6.8", "tree-kill": "^1.0.0", "webpack-sources": "^1.1.0" } @@ -318,112 +645,353 @@ "tslib": "^1.9.0" } }, - "@ngx-translate/http-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-3.0.1.tgz", - "integrity": "sha1-ILD5i8bCUyESnT4zAqs8xInApCo=", + "@ngx-translate/http-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-3.0.1.tgz", + "integrity": "sha1-ILD5i8bCUyESnT4zAqs8xInApCo=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@schematics/angular": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.6.8.tgz", + "integrity": "sha512-9kRphqTYG5Df/I8fvnT1zMsw0YNDPO9tl18tQZXj4am4raT7l9UCr+WkwJdlBoA5pwG6baWE9sL0iGWV/bzF/g==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.8", + "@angular-devkit/schematics": "0.6.8", + "typescript": ">=2.6.2 <2.8" + } + }, + "@schematics/update": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.6.8.tgz", + "integrity": "sha512-1Uq7LYnwL2wBwGVCgNz76QAR13ghAk+2vDDHOi+VX5+usHManxydrpoMGeX66OBPd+y5D3D2MFb+8mYHE7mygg==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.8", + "@angular-devkit/schematics": "0.6.8", + "npm-registry-client": "^8.5.1", + "rxjs": "^6.0.0", + "semver": "^5.3.0", + "semver-intersect": "^1.1.2" + } + }, + "@swimlane/ngx-datatable": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-13.0.1.tgz", + "integrity": "sha512-jjMEzQhXcdD+jfKNp+7U61lWx9ZzSGDn9QbpY6pJOJwz+E2CKeek6OouT5Qcc4MY4oFL9g/SZoPjLf90cbNIRw==" + }, + "@types/file-saver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", + "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==" + }, + "@types/jasmine": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz", + "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "6.0.113", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.113.tgz", + "integrity": "sha512-f9XXUWFqryzjkZA1EqFvJHSFyqyasV17fq8zCDIzbRV4ctL7RrJGKvG+lcex86Rjbzd1GrER9h9VmF5sSjV0BQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", + "dev": true + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.4.3.tgz", + "integrity": "sha512-S6npYhPcTHDYe9nlsKa9CyWByFi8Vj8HovcAgtmMAQZUOczOZbQ8CnwMYKYC5HEZzxEE+oY0jfQk4cVlI3J59Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "debug": "^3.1.0", + "webassemblyjs": "1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz", + "integrity": "sha512-3zTkSFswwZOPNHnzkP9ONq4bjJSeKVMcuahGXubrlLmZP8fmTIJ58dW7h/zOVWiFSuG2em3/HH3BlCN7wyu9Rw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz", + "integrity": "sha512-e8+KZHh+RV8MUvoSRtuT1sFXskFnWG9vbDy47Oa166xX+l0dD5sERJ21g5/tcH8Yo95e9IN3u7Jc3NbhnUcSkw==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz", + "integrity": "sha512-9FgHEtNsZQYaKrGCtsjswBil48Qp1agrzRcPzCbQloCoaTbOXLJ9IRmqT+uEZbenpULLRNFugz3I4uw18hJM8w==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.4.3" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz", + "integrity": "sha512-JINY76U+702IRf7ePukOt037RwmtH59JHvcdWbTTyHi18ixmQ+uOuNhcdCcQHTquDAH35/QgFlp3Y9KqtyJsCQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz", + "integrity": "sha512-I7bS+HaO0K07Io89qhJv+z1QipTpuramGwUSDkwEaficbSvCcL92CUZEtgykfNtk5wb0CoLQwWlmXTwGbNZUeQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz", + "integrity": "sha512-p0yeeO/h2r30PyjnJX9xXSR6EDcvJd/jC6xa/Pxg4lpfcNi7JUswOpqDToZQ55HMMVhXDih/yqkaywHWGLxqyQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/leb128": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.4.3.tgz", + "integrity": "sha512-4u0LJLSPzuRDWHwdqsrThYn+WqMFVqbI2ltNrHvZZkzFPO8XOZ0HFQ5eVc4jY/TNHgXcnwrHjONhPGYuuf//KQ==", + "dev": true, "requires": { - "tslib": "^1.9.0" + "leb": "^0.3.0" } }, - "@schematics/angular": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", - "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "@webassemblyjs/validation": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/validation/-/validation-1.4.3.tgz", + "integrity": "sha512-R+rRMKfhd9mq0rj2mhU9A9NKI2l/Rw65vIYzz4lui7eTKPcCu1l7iZNi4b9Gen8D42Sqh/KGiaQNk/x5Tn/iBQ==", "dev": true, "requires": { - "typescript": "~2.6.2" + "@webassemblyjs/ast": "1.4.3" + } + }, + "@webassemblyjs/wasm-edit": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz", + "integrity": "sha512-qzuwUn771PV6/LilqkXcS0ozJYAeY/OKbXIWU3a8gexuqb6De2p4ya/baBeH5JQ2WJdfhWhSvSbu86Vienttpw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/helper-wasm-section": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-opt": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-printer": "1.4.3", + "debug": "^3.1.0" }, "dependencies": { - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } } } }, - "@schematics/package-update": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", - "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "@webassemblyjs/wasm-gen": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz", + "integrity": "sha512-eR394T8dHZfpLJ7U/Z5pFSvxl1L63JdREebpv9gYc55zLhzzdJPAuxjBYT4XqevUdW67qU2s0nNA3kBuNJHbaQ==", "dev": true, "requires": { - "rxjs": "^5.5.6", - "semver": "^5.3.0", - "semver-intersect": "^1.1.2" + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz", + "integrity": "sha512-7Gp+nschuKiDuAL1xmp4Xz0rgEbxioFXw4nCFYEmy+ytynhBnTeGc9W9cB1XRu1w8pqRU2lbj2VBBA4cL5Z2Kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "debug": "^3.1.0" }, "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "ms": "2.0.0" } } } }, - "@swimlane/ngx-datatable": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-11.3.2.tgz", - "integrity": "sha512-Fn1RMJ991elSvp+LV2SGzG28ypuLM2DFyXAb7o8p4kzuhqtELwB25doXrLLVrtE2QtKmzoD9fRfbEUNsBKgoWA==" - }, - "@types/file-saver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", - "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==" - }, - "@types/jasmine": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz", - "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "@webassemblyjs/wasm-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz", + "integrity": "sha512-KXBjtlwA3BVukR/yWHC9GF+SCzBcgj0a7lm92kTOaa4cbjaTaa47bCjXw6cX4SGQpkncB9PU2hHGYVyyI7wFRg==", "dev": true, "requires": { - "@types/jasmine": "*" + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "webassemblyjs": "1.4.3" } }, - "@types/node": { - "version": "6.0.113", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.113.tgz", - "integrity": "sha512-f9XXUWFqryzjkZA1EqFvJHSFyqyasV17fq8zCDIzbRV4ctL7RrJGKvG+lcex86Rjbzd1GrER9h9VmF5sSjV0BQ==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "2.53.43", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", - "dev": true + "@webassemblyjs/wast-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz", + "integrity": "sha512-QhCsQzqV0CpsEkRYyTzQDilCNUZ+5j92f+g35bHHNqS22FppNTywNFfHPq8ZWZfYCgbectc+PoghD+xfzVFh1Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/floating-point-hex-parser": "1.4.3", + "@webassemblyjs/helper-code-frame": "1.4.3", + "@webassemblyjs/helper-fsm": "1.4.3", + "long": "^3.2.0", + "webassemblyjs": "1.4.3" + } }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "@webassemblyjs/wast-printer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz", + "integrity": "sha512-EgXk4anf8jKmuZJsqD8qy5bz2frEQhBvZruv+bqwNoLWUItjNSFygk8ywL3JTEz9KtxTlAmqTXNrdD1d9gNDtg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "^3.2.0" + } }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "@webpack-contrib/schema-utils": { + "version": "1.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz", + "integrity": "sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chalk": "^2.3.2", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "webpack-log": "^1.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } }, "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, "accepts": { @@ -443,20 +1011,12 @@ "dev": true }, "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "acorn": "^5.0.0" } }, "addressparser": { @@ -488,29 +1048,15 @@ } }, "ajv": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", - "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - }, - "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" } }, "ajv-keywords": { @@ -842,16 +1388,16 @@ "dev": true }, "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.4.tgz", + "integrity": "sha512-9D0OoxWCqq9Okp9wD+igaCf6ZaNjYNFSCKxgMLAxAGqXwpapaZ+D0PBv265VHQLgam8a7gld4E6KgJJM6SKfQQ==", "dev": true, "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", + "browserslist": "^3.2.8", + "caniuse-lite": "^1.0.30000859", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^6.0.17", + "postcss": "^6.0.23", "postcss-value-parser": "^3.2.3" } }, @@ -1393,13 +1939,13 @@ } }, "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" } }, "buffer": { @@ -1474,6 +2020,12 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -1555,9 +2107,9 @@ } }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "camelcase-keys": { @@ -1568,12 +2120,20 @@ "requires": { "camelcase": "^2.0.0", "map-obj": "^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 + } } }, "caniuse-lite": { - "version": "1.0.30000856", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000856.tgz", - "integrity": "sha512-x3mYcApHMQemyaHuH/RyqtKCGIYTgEA63fdi+VBvDz8xUSmRiVWTLeyKcoGQCGG6UPR9/+4qG4OKrTa6aSQRKg==", + "version": "1.0.30000861", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000861.tgz", + "integrity": "sha512-aeEQ4kyd41qCl8XFbCjWgVBI3EOd66M9sC43MFn0kuD/vcrNqvoIAlKon4xdp8yMCYvVjdCltI3lgArj8I6cNA==", "dev": true }, "caseless": { @@ -1587,6 +2147,7 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, + "optional": true, "requires": { "align-text": "^0.1.3", "lazy-cache": "^1.0.3" @@ -1601,6 +2162,23 @@ "ansi-styles": "^3.1.0", "escape-string-regexp": "^1.0.5", "supports-color": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } } }, "chokidar": { @@ -1626,6 +2204,12 @@ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, + "chrome-trace-event": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1637,9 +2221,9 @@ } }, "circular-dependency-plugin": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", - "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", "dev": true }, "circular-json": { @@ -1691,6 +2275,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -1813,12 +2398,6 @@ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2020,12 +2599,12 @@ "dev": true }, "copy-webpack-plugin": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", - "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", "dev": true, "requires": { - "cacache": "^10.0.1", + "cacache": "^10.0.4", "find-cache-dir": "^1.0.0", "globby": "^7.1.1", "is-glob": "^4.0.0", @@ -2057,15 +2636,6 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" }, - "core-object": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", - "dev": true, - "requires": { - "chalk": "^2.0.0" - } - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2324,8 +2894,7 @@ "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, - "optional": true + "dev": true }, "default-require-extensions": { "version": "2.0.0", @@ -2477,12 +3046,6 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2698,9 +3261,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.49.tgz", - "integrity": "sha1-ZROEsNgfB4qWY5srNpdRQbeRUAQ=", + "version": "1.3.50", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz", + "integrity": "sha1-dDi3b5K0G5GfP73TUPvQdX2s3fc=", "dev": true }, "elliptic": { @@ -2718,12 +3281,6 @@ "minimalistic-crypto-utils": "^1.0.0" } }, - "ember-cli-string-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", - "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", - "dev": true - }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -2815,15 +3372,14 @@ } }, "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "tapable": "^1.0.0" } }, "ent": { @@ -2902,20 +3458,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", @@ -2931,19 +3473,6 @@ "es6-promise": "^4.0.3" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -2954,18 +3483,6 @@ "es5-ext": "~0.10.14" } }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3008,14 +3525,12 @@ } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } @@ -3053,16 +3568,6 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", @@ -3284,41 +3789,6 @@ "is-extglob": "^1.0.0" } }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -3341,8 +3811,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true, - "optional": true + "dev": true }, "fastparse": { "version": "1.1.1", @@ -3553,17 +4022,6 @@ "null-check": "^1.0.0" } }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -4496,10 +4954,16 @@ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "has-unicode": { @@ -4644,9 +5108,9 @@ } }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", + "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", "dev": true }, "hpack.js": { @@ -4668,9 +5132,9 @@ "dev": true }, "html-minifier": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.16.tgz", - "integrity": "sha512-zP5EfLSpiLRp0aAgud4CQXPQZm9kXwWjR/cF0PfdOj+jjWnOaCgeZcll4kYXSvIBPeUMmyaSc7mM4IDtA+kboA==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.17.tgz", + "integrity": "sha512-O+StuKL0UWfwX5Zv4rFxd60DPcT5DVjGq1AlnP6VQ8wzudft/W4hx5Wl98aSYNwFBHY6XWJreRw/BehX4l+diQ==", "dev": true, "requires": { "camel-case": "3.0.x", @@ -4679,21 +5143,22 @@ "he": "1.1.x", "param-case": "2.1.x", "relateurl": "0.2.x", - "uglify-js": "3.3.x" + "uglify-js": "3.4.x" } }, "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "bluebird": "^3.4.7", "html-minifier": "^3.2.3", "loader-utils": "^0.2.16", "lodash": "^4.17.3", "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" }, "dependencies": { "loader-utils": { @@ -4728,103 +5193,324 @@ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1" + } + }, + "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 + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.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" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "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" + } }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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": { - "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 - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - } - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - }, - "dependencies": { + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4832,12 +5518,65 @@ "dev": true }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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 + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -5009,12 +5748,6 @@ "meow": "^3.3.0" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5360,12 +6093,117 @@ "isarray": "1.0.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "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" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "istanbul-api": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", @@ -5581,12 +6419,6 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -5626,15 +6458,6 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -6186,7 +7009,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true + "dev": true, + "optional": true }, "lcid": { "version": "1.0.0", @@ -6197,20 +7021,147 @@ "invert-kv": "^1.0.0" } }, + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", + "dev": true + }, "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/less/-/less-3.0.4.tgz", + "integrity": "sha512-q3SyEnPKbk9zh4l36PGeW2fgynKu+FpbhiUNx/yaiBUQ3V0CbACCgb9FzYWcRgI2DJlP6eI4jc8XPrCTi55YcQ==", "dev": true, "requires": { "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", - "mime": "^1.2.11", + "mime": "^1.4.1", "mkdirp": "^0.5.0", "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "optional": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } } }, "less-loader": { @@ -6229,7 +7180,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "optional": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -6338,11 +7288,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -6375,21 +7320,13 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0" + "chalk": "^2.0.1" } }, "log4js": { @@ -6555,6 +7492,22 @@ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -6596,15 +7549,6 @@ "yallist": "^2.1.2" } }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "^0.2.2" - } - }, "mailcomposer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", @@ -6831,6 +7775,17 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mini-css-extract-plugin": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz", + "integrity": "sha512-XWuB3G61Rtasq/gLe7cp5cuozehE6hN+E4sxCamRR/WDiHTg+f7ZIAS024r8UJQffY+e2gGELXQZgQoFDfNDCg==", + "dev": true, + "requires": { + "@webpack-contrib/schema-utils": "^1.0.0-beta.0", + "loader-utils": "^1.1.0", + "webpack-sources": "^1.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -7032,14 +7987,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "ngx-breadcrumbs": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/ngx-breadcrumbs/-/ngx-breadcrumbs-0.0.3.tgz", - "integrity": "sha512-fa1pg/ZxgLZd4pqbXoBtrkPrYbg2WxWc+QEkJgZ/h/oTXVCwWcYWdGm6ZMny/ib0ywOAqVzO3ZkmnJMD9FHkkw==", - "requires": { - "lodash.template": "^4.4.0" - } - }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -7076,16 +8023,6 @@ "which": "1" }, "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1" - } - }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -7134,12 +8071,6 @@ } } }, - "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", - "dev": true - }, "node-sass": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", @@ -7344,13 +8275,12 @@ "dev": true }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "normalize-package-data": { @@ -7380,6 +8310,38 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-registry-client": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz", + "integrity": "sha512-7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -7491,6 +8453,28 @@ } } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -7549,9 +8533,9 @@ } }, "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -7572,7 +8556,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, - "optional": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -7586,8 +8569,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true, - "optional": true + "dev": true } } }, @@ -7623,6 +8605,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, + "optional": true, "requires": { "lcid": "^1.0.0" } @@ -7788,6 +8771,12 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -7969,9 +8958,9 @@ "dev": true }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -7990,26 +8979,11 @@ "supports-color": "^5.3.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -8870,11 +9844,18 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, + "optional": true, "requires": { "align-text": "^0.1.1" } @@ -8908,13 +9889,18 @@ } }, "rxjs": { - "version": "5.6.0-forward-compat.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.6.0-forward-compat.5.tgz", - "integrity": "sha512-CJ9UIV5LlcyGhKWOVvZa4PcVbJJbGNcTunG29cflNo+Y2jAZgvMdZVl4xwYNiYK5gmley/0QuAFVJ0M4GO+GNQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, + "rxjs-compat": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.2.1.tgz", + "integrity": "sha512-Pst0lkAwVodBbBOIZic9aM1vY9asJ2u8GfKN115+goIH83PAlizJDyvixuxPAuQ1UtkmBuro7+0PqKQ3PSkhEg==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -8950,9 +9936,9 @@ } }, "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.3.tgz", + "integrity": "sha512-iaSFtQcGo4SSgDw5Aes5p4VTrA5jCGSA7sGmhPIcOloBlgI1VktM2MUrk2IHHjbNagckXlPz+HWq1vAAPrcYxA==", "dev": true, "requires": { "clone-deep": "^2.0.1", @@ -9256,6 +10242,12 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, "smart-buffer": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", @@ -9684,6 +10676,15 @@ } } }, + "stats-webpack-plugin": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz", + "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -9828,36 +10829,13 @@ "dev": true }, "style-loader": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" } }, "stylus": { @@ -9911,23 +10889,24 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" } }, "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", "dev": true }, "tar": { @@ -9942,6 +10921,12 @@ "inherits": "2" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9968,13 +10953,7 @@ "thunky": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", - "dev": true - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", "dev": true }, "timers-browserify": { @@ -10218,9 +11197,9 @@ } }, "tsickle": { - "version": "0.27.5", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", - "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.29.0.tgz", + "integrity": "sha512-JpID0Lv8/irRtPmqJJxb5fCwfZhjZeKmav9Zna7UjqVuJoSbI49Wue/c2PPybX1SbRrjl7bbI/JsCl0dSUJygA==", "dev": true, "requires": { "minimist": "^1.2.0", @@ -10370,15 +11349,15 @@ "dev": true }, "typescript": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", "dev": true }, "uglify-js": { - "version": "3.3.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz", - "integrity": "sha512-68Rc/aA6cswiaQ5SrE979UJcXX+ADA1z33/ZsPd+fbAiVdjZ16OXdbtGO+rJUUBgK6qdf3SOPhQf3K/ybF5Miw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.2.tgz", + "integrity": "sha512-/kVQDzwiE9Vy7Y63eMkMozF4jIt0C2+xHctF9YpqNWdE/NLOuMurshkpoYGUlAbeYhACPv0HJPIHJul0Ak4/uw==", "dev": true, "requires": { "commander": "~2.15.0", @@ -10401,9 +11380,9 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.6.tgz", - "integrity": "sha512-NDP94ahjW7ZH+qzdjxjIV04n5YGnrYD2jeHgKgnpUKmdAfcXEO5DbVo21fXAm/KPMyX9k21zWFBMYm9m9R2ptg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", + "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", "dev": true, "requires": { "cacache": "^10.0.4", @@ -10505,12 +11484,6 @@ "imurmurhash": "^0.1.4" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -10576,9 +11549,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", "dev": true, "requires": { "punycode": "^2.1.0" @@ -10608,37 +11581,28 @@ } } }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz", + "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^0.4.3" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true } } }, @@ -10702,6 +11666,16 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -10746,6 +11720,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -10771,12 +11754,6 @@ } } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -11155,6 +12132,19 @@ "minimalistic-assert": "^1.0.0" } }, + "webassemblyjs": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webassemblyjs/-/webassemblyjs-1.4.3.tgz", + "integrity": "sha512-4lOV1Lv6olz0PJkDGQEp82HempAn147e6BXijWDzz9g7/2nSebVP9GVg62Fz5ZAs55mxq13GA0XLyvY8XkyDjg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/validation": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "^3.2.0" + } + }, "webdriver-js-extender": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", @@ -11219,266 +12209,307 @@ } }, "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.8.3.tgz", + "integrity": "sha512-/hfAjBISycdK597lxONjKEFX7dSIU1PsYwC3XlXUXoykWBlv9QV5HnO+ql3HvrrgfBJ7WXdnjO9iGPR2aAc5sw==", "dev": true, "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wasm-edit": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", + "acorn-dynamic-import": "^3.0.0", "ajv": "^6.1.0", "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", + "chrome-trace-event": "^0.1.1", + "enhanced-resolve": "^4.0.0", + "eslint-scope": "^3.7.1", "loader-runner": "^2.3.0", "loader-utils": "^1.1.0", "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.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" + } + } } }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": { - "ansi-regex": "^3.0.0" + "is-extendable": "^0.1.0" } } } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "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": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "is-extendable": "^0.1.0" } } } }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "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": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "kind-of": "^6.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "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" + } }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "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" + } }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "kind-of": "^3.0.2" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } + "is-buffer": "^1.1.5" } } } }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "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 + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -11511,22 +12542,32 @@ } }, "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz", + "integrity": "sha512-I6Mmy/QjWU/kXwCSFGaiOoL5YEQIVmbb0o45xMoCyQAg/mClqZVTcsX327sPfekDyJWpCxb+04whNyLOIxpJdQ==", "dev": true, "requires": { + "loud-rejection": "^1.6.0", "memory-fs": "~0.4.1", - "mime": "^1.5.0", + "mime": "^2.1.0", "path-is-absolute": "^1.0.0", "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "url-join": "^4.0.0", + "webpack-log": "^1.0.1" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } } }, "webpack-dev-server": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.4.tgz", + "integrity": "sha512-itcIUDFkHuj1/QQxzUFOEXXmxOj5bku2ScLEsOFPapnq2JRTm58gPdtnBphBJOKL2+M3p6+xygL64bI+3eyzzw==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -11539,7 +12580,7 @@ "del": "^3.0.0", "express": "^4.16.2", "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", + "http-proxy-middleware": "~0.18.0", "import-local": "^1.0.0", "internal-ip": "1.2.0", "ip": "^1.1.5", @@ -11554,10 +12595,17 @@ "spdy": "^3.4.1", "strip-ansi": "^3.0.0", "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "webpack-dev-middleware": "3.1.3", + "webpack-log": "^1.1.2", + "yargs": "11.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -11609,12 +12657,6 @@ } } }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -11636,6 +12678,28 @@ "upath": "^1.0.5" } }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -11826,12 +12890,6 @@ } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -11867,6 +12925,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -11929,15 +12993,44 @@ "to-regex": "^3.0.2" } }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -11945,37 +13038,48 @@ "dev": true }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", + "cliui": "^4.0.0", "decamelize": "^1.1.1", + "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "os-locale": "^2.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "yargs-parser": "^9.0.2" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^4.1.0" } } } }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + } + }, "webpack-merge": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.3.tgz", @@ -12004,9 +13108,9 @@ } }, "webpack-subresource-integrity": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", - "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "version": "1.1.0-rc.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.4.tgz", + "integrity": "sha1-xcTj1pD50vZKlVDgeodn+Xlqpdg=", "dev": true, "requires": { "webpack-core": "^0.6.8" @@ -12047,7 +13151,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "dev": true, + "optional": true }, "wide-align": { "version": "1.1.3", @@ -12062,7 +13167,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true + "dev": true, + "optional": true }, "with-callback": { "version": "1.0.2", @@ -12203,8 +13309,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true + "dev": true }, "y18n": { "version": "3.2.1", @@ -12212,26 +13317,26 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true, "optional": true + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0" + } } } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, - "optional": true, "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - } + "camelcase": "^4.1.0" } }, "yeast": { diff --git a/dmp-frontend/package.json b/dmp-frontend/package.json index 8195c4bd9..cd4e2db50 100644 --- a/dmp-frontend/package.json +++ b/dmp-frontend/package.json @@ -12,32 +12,33 @@ }, "private": true, "dependencies": { - "@angular/animations": "^5.2.0", - "@angular/cdk": "^5.2.4", - "@angular/common": "^5.2.0", - "@angular/compiler": "^5.2.0", - "@angular/core": "^5.2.0", - "@angular/flex-layout": "5.0.0-beta.14", - "@angular/forms": "^5.2.0", - "@angular/http": "^5.2.0", - "@angular/material": "^5.2.4", - "@angular/platform-browser": "^5.2.0", - "@angular/platform-browser-dynamic": "^5.2.0", - "@angular/router": "^5.2.0", - "@covalent/core": "1.0.0", + "@angular/animations": "6.0.7", + "@angular/cdk": "6.1.0", + "@angular/common": "6.0.7", + "@angular/compiler": "6.0.7", + "@angular/core": "6.0.7", + "@angular/flex-layout": "6.0.0-beta.16", + "@angular/forms": "6.0.7", + "@angular/http": "6.0.7", + "@angular/material": "6.1.0", + "@angular/platform-browser": "6.0.7", + "@angular/platform-browser-dynamic": "6.0.7", + "@angular/router": "6.0.7", + "@covalent/core": "2.0.0-beta.2", "@ngx-translate/core": "10.0.1", "@ngx-translate/http-loader": "3.0.1", - "@swimlane/ngx-datatable": "^11.3.2", + "@swimlane/ngx-datatable": "13.0.1", "@types/file-saver": "1.3.0", "core-js": "^2.4.1", "file-saver": "1.3.3", - "rxjs": "^5.6.0-forward-compat.4", - "zone.js": "^0.8.19" + "rxjs": "^6.2.1", + "rxjs-compat": "^6.1.0", + "zone.js": "^0.8.26" }, "devDependencies": { - "@angular/cli": "~1.7.4", - "@angular/compiler-cli": "^5.2.0", - "@angular/language-service": "^5.2.0", + "@angular/cli": "^6.0.8", + "@angular/compiler-cli": "6.0.7", + "@angular/language-service": "6.0.7", "@types/jasmine": "~2.8.3", "@types/jasminewd2": "~2.0.2", "@types/node": "~6.0.60", @@ -52,6 +53,7 @@ "protractor": "^5.3.2", "ts-node": "~4.1.0", "tslint": "~5.9.1", - "typescript": "~2.5.3" + "typescript": "2.7.2", + "@angular-devkit/build-angular": "~0.6.8" } } diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index d99506849..b80834747 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -1,4 +1,4 @@ - +
diff --git a/dmp-frontend/src/app/app.component.scss b/dmp-frontend/src/app/app.component.scss index d0bcca980..925d219a4 100644 --- a/dmp-frontend/src/app/app.component.scss +++ b/dmp-frontend/src/app/app.component.scss @@ -1,6 +1,3 @@ .example-container { - width: 400px; - height: 200px; - margin: 10px; - border: 1px solid #555; + background: rgb(250, 248, 248); } diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index e038c01f2..7665c11c0 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -38,11 +38,10 @@ import { RecentActivityComponent } from './users/activity/recent-activity.compon import { LanguageResolverService } from './services/language-resolver/language-resolver.service'; import { LanguageService } from './services/language/language.service'; import { UsersModule } from './users/users.module'; -import { HelpContentComponent } from './shared/help-content/help-content.component'; +import { HelpContentComponent, AsideHelpContentComponent } from './shared/help-content/help-content.component'; import { AuthGuard } from './shared/guards/auth.guard'; import { UrlUtilities } from './utilities/UrlUtilities'; import { BreadCrumbResolverService } from './services/breadcrumb/breadcrumb-resolver.service'; -import { McBreadcrumbsModule } from 'ngx-breadcrumbs'; @NgModule({ declarations: [ @@ -52,12 +51,12 @@ import { McBreadcrumbsModule } from 'ngx-breadcrumbs'; RecentActivityComponent, WelcomepageComponent, HelpContentComponent, + AsideHelpContentComponent, B2AccessLoginComponent, ], imports: [ BrowserModule, ReactiveFormsModule, - McBreadcrumbsModule.forRoot(), FormsModule, HttpModule, HttpClientModule, diff --git a/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html b/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html index 8fa08ca8a..bb943a32d 100644 --- a/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html @@ -1,45 +1,45 @@
-
-
- - - -
-
- - - textarea - booleanDecision - combobox - checkBox - freetext - radiobox - - -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
+
+
+ + + +
+
+ + + textarea + booleanDecision + combobox + checkBox + freetext + radiobox + +
- -
-
-
-
Multiplicity
- - - +
+
+
+
Multiplicity
+ + + - - - -
-
- - + + + +
+
+ + + +
+ + + +
+
+
+
+ + + {{option.value}} + -
- - - -
-
-
-
- - - {{option.value}} - - -
-
- -
+
+ +
- Multiplicity - - - {{i + 1}}. Rule {{i + 1}} +
+ Multiplicity + + + {{i + 1}}. Rule {{i + 1}} -
- -
-
- -
- - Add Rule + - +
+ +
+ + + + + Add Rule + + -
\ No newline at end of file +
diff --git a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html index 93b5be782..6223d83fd 100644 --- a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html @@ -1,78 +1,78 @@ 
-
-
- - - - - - - - - -
-
- - - {{pageGroup.get('title').value}} - - - - - - true - false - - -
+
+
+ + + + + + + + +
+
+ + + {{pageGroup.get('title').value}} + + + + + + true + false + -
- - - {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} -
- -
-
-
- -
-
+
+ +
+ + + {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} +
+ +
+
+
+ +
+
+
- -
- - - - {{i + 1}}. Field {{i + 1}} + {{i + 1}}. Field {{i + 1}} -
- -
-
+
+ +
+ - + -
-
+ +
- - - - -
\ No newline at end of file + + +
diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html index 66120e7b9..3ae118597 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html @@ -13,15 +13,11 @@
- - - - - + + +
@@ -54,8 +50,9 @@ + [parentTemplate]='dataRepositoriesTemplate' [displayFunction]='dataRepositoryDisplayFunc' [subtitleFunction]='dataRepositoryDisplaySubtitleFunc' + [formGroup]="formGroup.get('dataRepositories')" [autoCompleteConfiguration]="dataRepositoriesAutoCompleteConfiguration" + (onItemChange)="dataRepositoriesOnItemChange($event)"> @@ -86,8 +83,9 @@ + [parentTemplate]='externalDatasetsTemplate' [displayFunction]='externalDatasetDisplayFunc' [subtitleFunction]='dataRepositoryDisplaySubtitleFunc' + [formGroup]="formGroup.get('externalDatasets')" [autoCompleteConfiguration]="externalDatasetAutoCompleteConfiguration" + (onItemChange)="externalDatasetsOnItemChange($event)"> @@ -128,7 +126,8 @@ + [formGroup]="formGroup.get('registries')" [subtitleFunction]='dataRepositoryDisplaySubtitleFunc' [autoCompleteConfiguration]="registriesAutoCompleteConfiguration" + (onItemChange)="registriesOnItemChange($event)"> @@ -154,7 +153,8 @@ + [formGroup]="formGroup.get('services')" [subtitleFunction]='dataRepositoryDisplaySubtitleFunc' [autoCompleteConfiguration]="servicesAutoCompleteConfiguration" + (onItemChange)="servicesOnItemChange($event)"> @@ -172,6 +172,33 @@ + + + + {{'DATASET-EDITOR.FIELDS.TAG' | translate}} + + + + + + + +
+

+ {{i+1}}) {{suggestion.get('name').value}} +

+
+
+ +
+
+
+ diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts index bd21fc334..6f841e67a 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts @@ -154,7 +154,6 @@ export class DataManagementPlanEditorComponent implements AfterViewInit, IBreadC this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) this.router.navigate(['/dmps']); } diff --git a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.html b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.html index f31392977..93ec8b314 100644 --- a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.html +++ b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.html @@ -1,19 +1,19 @@
- - - {{'DMP-WIZARD.FIRST-STEP.DMP' | translate}} - - - - - {{'DMP-WIZARD.FIRST-STEP.DATASETS' | translate}} - - - - -
\ No newline at end of file + + + {{'DMP-WIZARD.FIRST-STEP.DMP' | translate}} + + + + + {{'DMP-WIZARD.FIRST-STEP.DATASETS' | translate}} + + + + +
diff --git a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts index 46a6a0b42..2b2b8cc42 100644 --- a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts @@ -26,10 +26,10 @@ export class DataManagementPlanWizardComponent implements OnInit, IBreadCrumbCom private router: Router ) { } - itemId: string - dataManagementPlan: DataManagementPlanModel; - formGroup: FormGroup - isClone: boolean + public itemId: string + public dataManagementPlan: DataManagementPlanModel; + public formGroup: FormGroup + public isClone: boolean ngOnInit(): void { @@ -65,7 +65,6 @@ export class DataManagementPlanWizardComponent implements OnInit, IBreadCrumbCom this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) this.router.navigate(['/dmps']); } diff --git a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts index 4fb6774e9..d33be39f3 100644 --- a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts @@ -100,7 +100,6 @@ export class DataManagementPlanWizardEditorComponent implements AfterViewInit { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) this.router.navigate(['/dmps']); } diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts index 30a17d46f..9b097916d 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts @@ -23,11 +23,11 @@ export class AutocompleteRemoteComponent implements OnInit/* , ControlValueAcces @Input() disabled = false @Input() form: FormGroup; - private autoCompleteConfiguration: AutoCompleteConfiguration; - private loading: boolean; - private datasetId; - values: any[] = new Array(); - typeaheadMS: number = 1400; + public autoCompleteConfiguration: AutoCompleteConfiguration; + public loading: boolean; + public datasetId; + public values: any[] = new Array(); + public typeaheadMS: number = 1400; constructor(private datasetProfileService: DatasetProfileService, route: ActivatedRoute) { this.datasetId = route.snapshot.params['id']; diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html index ddfc08b4e..7e5d6a7c1 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html @@ -11,8 +11,8 @@
- - {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + {{'GENERAL.VALIDATION.REQUIRED' | translate}}
@@ -33,11 +33,12 @@
- + - {{'GENERAL.VALIDATION.REQUIRED' | translate}} + close + + {{'GENERAL.VALIDATION.REQUIRED' | translate}}
@@ -55,7 +56,7 @@ @@ -79,13 +80,13 @@ - + -
- +
+
{{field.label}} is required
@@ -98,7 +99,7 @@ \ No newline at end of file + +
--> diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts index b9befd157..84e06aa22 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts @@ -21,7 +21,7 @@ export class DynamicFormFieldComponent implements OnInit { @Input() pathName: string; @Input() path: string; - constructor(private route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { } + constructor(private route: ActivatedRoute, public visibilityRulesService: VisibilityRulesService) { } ngOnInit() { this.form.get('value').valueChanges.subscribe(item => { diff --git a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts index 4e0c0e301..e837706a9 100644 --- a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts @@ -21,7 +21,7 @@ export class DynamicFormGroupComponent implements OnInit { @Input() path: string; - constructor(private visibilityRulesService: VisibilityRulesService) { + constructor(public visibilityRulesService: VisibilityRulesService) { } ngOnInit() { diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts index f3075af11..f04828950 100644 --- a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts @@ -19,7 +19,7 @@ export class DynamicFormSectionComponent implements OnInit { @Input() form: FormGroup; @Input() pathName: string; @Input() path: string; - constructor(private visibilityRulesService: VisibilityRulesService) { } + constructor(public visibilityRulesService: VisibilityRulesService) { } ngOnInit() { } diff --git a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html index 07b6bc6d6..bd0007c86 100644 --- a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html +++ b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html @@ -1,5 +1,5 @@ 
- -
\ No newline at end of file + +
diff --git a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts index 752fe6d5c..cb4ca2f2e 100644 --- a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts +++ b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts @@ -16,7 +16,7 @@ export class ProgressBarComponent implements OnInit { constructor(private visibilityRulesService: VisibilityRulesService) { } - private value: number = 0; + public value: number = 0; ngOnInit() { this.calculateValueForProgressbar() this.formGroup diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html index 78fa65451..7fb7c520d 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html @@ -1,7 +1,7 @@
    -
  • - - -
  • -
\ No newline at end of file +
  • + + +
  • + diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts index 8ba7249db..aa06c3338 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts @@ -9,17 +9,18 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; selector: 'table-of-content', templateUrl: './table-of-contents.component.html', styleUrls: ['./toc.component.css'], - providers: [] + providers: [] }) -export class TableOfContentsComponent implements OnInit{ +export class TableOfContentsComponent implements OnInit { - @Input() model:DatasetProfileDefinitionModel; - public path:string=""; + @Input() + public model: DatasetProfileDefinitionModel; + public path: string = ""; /* @Output() setPage:EventEmitter = new EventEmitter(); - */ ngOnInit(){ + */ ngOnInit() { - } + } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/homepage/homepage.component.ts b/dmp-frontend/src/app/homepage/homepage.component.ts index 80d08027c..f8835c0bc 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.ts +++ b/dmp-frontend/src/app/homepage/homepage.component.ts @@ -12,8 +12,8 @@ import { AuthService } from '../services/auth/auth.service'; }) export class HomepageComponent implements OnInit { - private userInfo: any; - private dashboardStatisticsData: DashboardStatisticsModel = new DashboardStatisticsModel(); + public userInfo: any; + public dashboardStatisticsData: DashboardStatisticsModel = new DashboardStatisticsModel(); constructor( private route: ActivatedRoute, diff --git a/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts index b6e00caec..5a0be0fbe 100644 --- a/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts +++ b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts @@ -1,7 +1,9 @@ import { BaseCriteria } from "../BaseCriteria"; +import { ExternalSourcesItemModel } from "../../external-sources/ExternalSourcesItemModel"; export class DatasetCriteria extends BaseCriteria { - public status: Number; - public dmpIds: String[] = []; - public allVersions: boolean; + public status: Number; + public dmpIds: String[] = []; + public tags: ExternalSourcesItemModel[] = []; + public allVersions: boolean; } diff --git a/dmp-frontend/src/app/models/criteria/tags/TagsCriteria.ts b/dmp-frontend/src/app/models/criteria/tags/TagsCriteria.ts new file mode 100644 index 000000000..59616dd88 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/tags/TagsCriteria.ts @@ -0,0 +1,6 @@ +import { BaseCriteria } from "../BaseCriteria"; +import { ExternalSourcesItemModel } from "../../external-sources/ExternalSourcesItemModel"; + +export class TagsCriteria extends BaseCriteria { + public type: string; +} diff --git a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts index 2ffb17721..229d0e5d7 100644 --- a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts +++ b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts @@ -12,6 +12,7 @@ import { JsonSerializer } from "../../utilities/JsonSerializer"; import { RegisterModel } from "../registers/RegisterModel"; import { DataRepositoryModel } from "../dataRepositories/DataRepositoryModel"; import { ExternalDatasetModel } from '../../models/external-dataset/ExternalDatasetModel'; +import { TagModel } from '../tags/TagModel'; export class DatasetWizardModel implements Serializable { public id: string; @@ -23,6 +24,7 @@ export class DatasetWizardModel implements Serializable { public services: ServiceModel[] = []; public registries: RegisterModel[] = []; public dataRepositories: DataRepositoryModel[] = []; + public tags: TagModel[] = []; public externalDatasets: ExternalDatasetModel[] = []; public dmp: DataManagementPlanModel = new DataManagementPlanModel(); public datasetProfileDefinition; @@ -42,6 +44,7 @@ export class DatasetWizardModel implements Serializable { this.profile = JsonSerializer.fromJSONObject(item.profile, DatasetProfileModel); this.externalDatasets = JsonSerializer.fromJSONArray(item.externalDatasets, ExternalDatasetModel); this.datasetProfileDefinition = JsonSerializer.fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); + this.tags = JsonSerializer.fromJSONArray(item.tags, TagModel); return this; } @@ -54,7 +57,7 @@ export class DatasetWizardModel implements Serializable { uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], - dmp: [{ value: this.dmp, disabled: disabled }, context.getValidation('dmp').validators] + dmp: [{ value: this.dmp, disabled: disabled }, context.getValidation('dmp').validators], }); const externalDatasetsFormArray = new Array(); @@ -67,6 +70,16 @@ export class DatasetWizardModel implements Serializable { } formGroup.addControl('externalDatasets', formBuilder.array(externalDatasetsFormArray)); + const tagsFormArray = new Array(); + if (this.tags && this.tags.length > 0) { + this.tags.forEach(item => { + tagsFormArray.push(item.buildForm(context.getValidation('tags').descendantValidations, disabled)) + }) + } else { + //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + } + formGroup.addControl('tags', formBuilder.array(tagsFormArray)); + const registriesFormArray = new Array(); if (this.registries && this.registries.length > 0) { this.registries.forEach(item => { @@ -116,6 +129,7 @@ export class DatasetWizardModel implements Serializable { baseContext.validation.push({ key: 'externalDatasets', validators: [BackendErrorValidator(this.errorModel, 'externalDatasets')] }); baseContext.validation.push({ key: 'dmp', validators: [BackendErrorValidator(this.errorModel, 'dmp')] }); //TODO baseContext.validation.push({ key: 'datasetProfileDefinition', validators: [BackendErrorValidator(this.errorModel, 'datasetProfileDefinition')] }); //TODO + baseContext.validation.push({ key: 'tags', validators: [BackendErrorValidator(this.errorModel, 'datasetProfileDefinition')] }); //TODO return baseContext; } diff --git a/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts b/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts index 25c0a5d03..7b3ea11f2 100644 --- a/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts +++ b/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts @@ -1,8 +1,9 @@ import { ExternalSourcesUrlModel } from "./ExternalSourcesUrlModel"; export class ExternalSourcesConfiguration { - public registries: Array - public dataRepositories: Array - public services: Array - public externalDatasets: Array -} \ No newline at end of file + public registries: Array + public dataRepositories: Array + public services: Array + public externalDatasets: Array + public tags: Array +} diff --git a/dmp-frontend/src/app/models/tags/TagModel.ts b/dmp-frontend/src/app/models/tags/TagModel.ts new file mode 100644 index 000000000..da3e6fbdc --- /dev/null +++ b/dmp-frontend/src/app/models/tags/TagModel.ts @@ -0,0 +1,27 @@ +import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder } from "@angular/forms"; + +export class TagModel implements Serializable { + + public id: string; + public name: string; + + constructor(id?: string, name?: string) { + this.id = id; + this.name = name; + } + + fromJSONObject(item: any): TagModel { + this.id = item.id; + this.name = item.name; + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + return new FormBuilder().group({ + id: [this.id], + name: [this.name] + }) + } +} diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.ts b/dmp-frontend/src/app/projects/editor/project-editor.component.ts index b68ca8f37..751060307 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.ts +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.ts @@ -93,7 +93,6 @@ export class ProjectEditorComponent implements OnInit, IBreadCrumbComponent { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) this.router.navigate(['/projects']); } diff --git a/dmp-frontend/src/app/projects/listing/project-listing.component.ts b/dmp-frontend/src/app/projects/listing/project-listing.component.ts index cadef224c..68f5e2058 100644 --- a/dmp-frontend/src/app/projects/listing/project-listing.component.ts +++ b/dmp-frontend/src/app/projects/listing/project-listing.component.ts @@ -34,11 +34,11 @@ export class ProjectListingComponent implements OnInit, IBreadCrumbComponent { displayedColumns: String[] = ['avatar', 'name', 'abbreviation', 'start', 'end', "dmps"]; constructor( - private projectService: ProjectService, - private router: Router, - private languageService: TranslateService, + public projectService: ProjectService, + public router: Router, + public languageService: TranslateService, public snackBar: MatSnackBar, - private languageResolverService: LanguageResolverService + public languageResolverService: LanguageResolverService ) { } diff --git a/dmp-frontend/src/app/services/auth/auth.service.ts b/dmp-frontend/src/app/services/auth/auth.service.ts index 6d6561dbf..ab52c0f5f 100644 --- a/dmp-frontend/src/app/services/auth/auth.service.ts +++ b/dmp-frontend/src/app/services/auth/auth.service.ts @@ -133,7 +133,6 @@ export class AuthService { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) this.router.navigate(['/login']); } @@ -142,7 +141,6 @@ export class AuthService { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGOUT', language: this.language }, duration: 3000, - extraClasses: ['snackbar-warning'] }) this.router.navigate(['/login']); } diff --git a/dmp-frontend/src/app/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts index 569aa5487..1b8e12523 100644 --- a/dmp-frontend/src/app/services/external-sources/external-sources.service.ts +++ b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts @@ -12,6 +12,7 @@ import { ExternalDatasetCriteria } from '../../models/criteria/external-dataset/ import { RegistryCriteria } from '../../models/criteria/registry/RegistryCriteria'; import { DataRepositoryCriteria } from '../../models/criteria/data-repository/DataRepositoryCriteria'; import { ServicesCriteria } from '../../models/criteria/services/ServicesCriteria'; +import { TagsCriteria } from '../../models/criteria/tags/TagsCriteria'; @Injectable() @@ -41,6 +42,20 @@ export class ExternalSourcesService { return this.http.get(this.actionUrl + "services" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); } + public searchDatasetTags(requestItem: RequestItem): Observable { + return Observable.of([ + { id: "1", name: "Tag 1", description: "" }, + { id: "2", name: "Tag 2", description: "" }, + { id: "3", name: "Tag 3", description: "" }, + { id: "4", name: "Tag 4", description: "" }, + { id: "5", name: "Tag 5", description: "" }, + { id: "6", name: "Tag 6", description: "" }, + { id: "7", name: "Tag 7", description: "" }, + { id: "8", name: "Tag 8", description: "" }, + ]) + //return this.http.get(this.actionUrl + "tags" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); + } + public searchDatasetSExternalDatasetservice(requestItem: RequestItem): Observable { return this.http.get(this.actionUrl + "datasets" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); } diff --git a/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts b/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts index db1332d83..bbb50bf56 100644 --- a/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts +++ b/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts @@ -14,7 +14,7 @@ import { ResearcherService } from '../../../services/researchers/researchers.ser }) export class AddResearchersComponent implements OnInit { - private formGroup: FormGroup; + public formGroup: FormGroup; constructor( private researcherService: ResearcherService, diff --git a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html index 8f255846f..2fbdd576c 100644 --- a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html +++ b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html @@ -7,7 +7,9 @@ - {{ this.printText(option) }} + {{ this.printText(option) }} | + {{subtitleFn(option)}} + diff --git a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts index 9d83979f4..ce290362c 100644 --- a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts +++ b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts @@ -17,6 +17,8 @@ export class AutoCompleteComponent implements OnInit, ErrorStateMatcher { @Input() formCtrl: FormControl; @Input() required = false; @Input() displayFunction: Function; + @Input() _subtitleFn: Function; + @Input() assignValueFunction: Function; @Input() transformFunction: Function; @Input() inputData: AutoCompleteConfiguration; @@ -86,6 +88,10 @@ export class AutoCompleteComponent implements OnInit, ErrorStateMatcher { else return item; } + subtitleFn(item) { + return this._subtitleFn(item); + } + getValue(item: any): string { if (this.assignValueFunction) { if (this.transformFunction) return this.assignValueFunction(this.transformFunction(item)) diff --git a/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html index 9cfb0053d..4e0da5da7 100644 --- a/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html +++ b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html @@ -25,17 +25,16 @@ --> - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - {{errorString}} - - - - {{item[titleKey]}} - {{item[subtitleKey]}} - - - - \ No newline at end of file + + diff --git a/dmp-frontend/src/app/shared/components/autocompleteChips/autocompleteChips.component.html b/dmp-frontend/src/app/shared/components/autocompleteChips/autocompleteChips.component.html index 8803aa35e..45084b772 100644 --- a/dmp-frontend/src/app/shared/components/autocompleteChips/autocompleteChips.component.html +++ b/dmp-frontend/src/app/shared/components/autocompleteChips/autocompleteChips.component.html @@ -1,22 +1,21 @@ - - - {{item.name}} - cancel - - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - {{errorString}} - - - - {{item[titleKey]}} - {{item[subtitleKey]}} - - - - \ No newline at end of file + + diff --git a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts index 4c1fd5d2d..f89671c10 100644 --- a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts +++ b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts @@ -15,9 +15,9 @@ import { DatasetProfileModule } from '../../../dataset-profile-form/dataset-prof }) export class AvailableProfilesComponent implements OnInit { - private formGroup: FormGroup; - private profiles: DatasetProfileModel[] = []; - private selectedProfiles: DatasetProfileModel[] = []; + public formGroup: FormGroup; + public profiles: DatasetProfileModel[] = []; + public selectedProfiles: DatasetProfileModel[] = []; constructor( private datasetService: DatasetService, diff --git a/dmp-frontend/src/app/shared/components/breadcrumb/breadcrumb.component.html b/dmp-frontend/src/app/shared/components/breadcrumb/breadcrumb.component.html index 21affeb1f..b5370168f 100644 --- a/dmp-frontend/src/app/shared/components/breadcrumb/breadcrumb.component.html +++ b/dmp-frontend/src/app/shared/components/breadcrumb/breadcrumb.component.html @@ -2,13 +2,13 @@
      -
      -
    1. - +
      +
    2. + {{ breadcrumb.label }}
    3. - chevron_right + chevron_right
    diff --git a/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts index ca7a24d35..4b187e1d1 100644 --- a/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts @@ -3,100 +3,100 @@ import { FormControl, FormGroup, NgForm, FormArray, AbstractControl } from '@ang import { BaseCriteriaErrorModel } from '../../../../models/criteria/BaseCriteriaErrorModel'; @Component({ - selector: 'base-criteria-component', - template: '', - providers: [ + selector: 'base-criteria-component', + template: '', + providers: [ - ] + ] }) export class BaseCriteriaComponent implements OnInit { - public refreshCallback: Function = null; - public formGroup: FormGroup = null; - - constructor( - public baseErrorModel?: BaseCriteriaErrorModel, - ) { - } - - ngOnInit() { - if (this.baseErrorModel == null) { this.baseErrorModel = new BaseCriteriaErrorModel(); } - } - - controlModified(): void { - this.clearErrorModel(); - if (!this.isFormValid()) { return; } - if (this.refreshCallback != null) { this.refreshCallback(); } - } - - public isFormValid(): boolean { - this.touchAllFormFields(this.formGroup); - this.validateAllFormFields(this.formGroup); - return this.formGroup.valid; - } - - public getFormData(): any { - return this.formGroup.value; - } - - public getFormControl(controlName: string): AbstractControl { - return this.formGroup.get(controlName); - } - - public disableFormFields(formControl: AbstractControl) { - formControl.disable(); - } - - public validateAllFormFields(formControl: AbstractControl) { - if (formControl instanceof FormControl) { - formControl.updateValueAndValidity({ emitEvent: false }) - } else if (formControl instanceof FormGroup) { - Object.keys(formControl.controls).forEach(item => { - const control = formControl.get(item); - this.validateAllFormFields(control); - }) - } else if (formControl instanceof FormArray) { - formControl.controls.forEach(item => { - this.validateAllFormFields(item); - }) - } - } - - public touchAllFormFields(formControl: AbstractControl) { - if (formControl instanceof FormControl) { - formControl.markAsTouched(); - } else if (formControl instanceof FormGroup) { - Object.keys(formControl.controls).forEach(item => { - const control = formControl.get(item); - this.touchAllFormFields(control); - }) - } else if (formControl instanceof FormArray) { - formControl.controls.forEach(item => { - this.touchAllFormFields(item); - }) - } - } - - setRefreshCallback(callback: Function): void { - this.refreshCallback = callback; - } - - onCallbackError(error: any) { - this.setErrorModel(error.error); - this.validateAllFormFields(this.formGroup); - } - - public setErrorModel(errorModel: BaseCriteriaErrorModel) { - Object.keys(errorModel).forEach(item => { - (this.baseErrorModel)[item] = (errorModel)[item]; - }) - } - - public clearErrorModel() { - Object.keys(this.baseErrorModel).forEach(item => { - (this.baseErrorModel)[item] = ''; - }) - } + public refreshCallback: Function = null; + public formGroup: FormGroup = null; + + constructor( + public baseErrorModel?: BaseCriteriaErrorModel, + ) { + } + + ngOnInit() { + if (this.baseErrorModel == null) { this.baseErrorModel = new BaseCriteriaErrorModel(); } + } + + controlModified(): void { + this.clearErrorModel(); + if (!this.isFormValid()) { return; } + if (this.refreshCallback != null) { this.refreshCallback(); } + } + + public isFormValid(): boolean { + this.touchAllFormFields(this.formGroup); + this.validateAllFormFields(this.formGroup); + return this.formGroup.valid; + } + + public getFormData(): any { + return this.formGroup.value; + } + + public getFormControl(controlName: string): AbstractControl { + return this.formGroup.get(controlName); + } + + public disableFormFields(formControl: AbstractControl) { + formControl.disable(); + } + + public validateAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.updateValueAndValidity({ emitEvent: false }) + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.validateAllFormFields(control); + }) + } else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.validateAllFormFields(item); + }) + } + } + + public touchAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.markAsTouched(); + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.touchAllFormFields(control); + }) + } else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.touchAllFormFields(item); + }) + } + } + + setRefreshCallback(callback: Function): void { + this.refreshCallback = callback; + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseCriteriaErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.baseErrorModel)[item] = (errorModel)[item]; + }) + } + + public clearErrorModel() { + Object.keys(this.baseErrorModel).forEach(item => { + (this.baseErrorModel)[item] = ''; + }) + } } diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts index 447982c27..b4a21b435 100644 --- a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts @@ -68,12 +68,7 @@ export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent i requestItem.criteria = criteria; this.projectService.get(requestItem).subscribe(items => { this.filteredProjects = items; - this.filteringProjectsAsync = false; - - // this.filteredProjects = items.filter((filteredObj: any) => { - // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // }); - + this.filteringProjectsAsync = false; }); } } diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html index 87ec2c7d8..fb17aad1a 100644 --- a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html @@ -20,14 +20,14 @@ --> -
    +
    - {{baseErrorModel['Criteria.like']}} + {{baseErrorModel['Criteria.like']}}
    -
    +
    @@ -35,9 +35,24 @@ {{status.viewValue}} - {{baseErrorModel['Criteria.status']}} + {{baseErrorModel['Criteria.status']}}
    +
    + + +
    {{chip.name.substring(0, 1).toUpperCase()}}
    + {{chip.name}} +
    + +
    + {{option.name}} +
    +
    + +
    +
    diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts index f25300251..f1e8adf93 100644 --- a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts @@ -6,52 +6,78 @@ import { ValidationContext, Validation } from '../../../../utilities/validators/ import { BackendErrorValidator } from '../../../../utilities/validators/BackendErrorValidator'; import { DatasetCriteriaErrorModel } from '../../../../models/criteria/dataset/DatasetCriteriaErrorModel'; import { DatasetCriteria } from '../../../../models/criteria/dataset/DatasetCriteria'; +import { TagsCriteria } from '../../../../models/criteria/tags/TagsCriteria'; +import { ExternalSourcesService } from '../../../../services/external-sources/external-sources.service'; +import { RequestItem } from '../../../../models/criteria/RequestItem'; +import { TagModel } from '../../../../models/tags/TagModel'; +import { ExternalSourcesItemModel } from '../../../../models/external-sources/ExternalSourcesItemModel'; @Component({ - selector: 'app-datasets-criteria-component', - templateUrl: './datasets-criteria.component.html', - styleUrls: ['./datasets-criteria.component.scss'], - providers: [ - ] + selector: 'app-datasets-criteria-component', + templateUrl: './datasets-criteria.component.html', + styleUrls: ['./datasets-criteria.component.scss'], + providers: [ + ExternalSourcesService + ] }) export class DatasetCriteriaComponent extends BaseCriteriaComponent implements OnInit { - // public form: ProjectType; - // public formStatus: ProjectStatus; - public criteria: DatasetCriteria= new DatasetCriteria(); - - statuses = [ - {value: '0', viewValue: 'Saved'}, - {value: '1', viewValue: 'Finalised'} - ]; - - constructor( - public language: TranslateService, - public formBuilder: FormBuilder - ) { - super(new DatasetCriteriaErrorModel()); - } - - ngOnInit() { - super.ngOnInit(); - if (this.criteria == null) { this.criteria = new DatasetCriteria(); } - } - - setCriteria(criteria: DatasetCriteria): void { - this.criteria = criteria; - } - - onCallbackError(error: any) { - this.setErrorModel(error.error); - } - - controlModified(): void { - this.clearErrorModel(); - if (this.refreshCallback != null && - (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) - ) { - this.refreshCallback(); - } - } + // public form: ProjectType; + // public formStatus: ProjectStatus; + public criteria: DatasetCriteria = new DatasetCriteria(); + public filteringTagsAsync: boolean = false; + public filteredTags: ExternalSourcesItemModel[]; + + statuses = [ + { value: '0', viewValue: 'Saved' }, + { value: '1', viewValue: 'Finalised' } + ]; + + constructor( + public language: TranslateService, + public formBuilder: FormBuilder, + public externalSourcesService: ExternalSourcesService + ) { + super(new DatasetCriteriaErrorModel()); + } + + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new DatasetCriteria(); } + } + + setCriteria(criteria: DatasetCriteria): void { + this.criteria = criteria; + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + } + + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } + + filterTags(value: string): void { + + this.filteredTags = undefined; + if (value) { + this.filteringTagsAsync = true; + + let requestItem: RequestItem = new RequestItem(); + let criteria: TagsCriteria = new TagsCriteria(); + criteria.like = value; + requestItem.criteria = criteria; + this.externalSourcesService.searchDatasetTags(requestItem).subscribe(items => { + this.filteredTags = items; + this.filteringTagsAsync = false; + }); + } + } } diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html index 351b0accd..6318a3670 100644 --- a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html @@ -27,7 +27,7 @@ - {{baseErrorModel['criteria.periodEnd']}} + {{baseErrorModel['criteria.periodEnd']}} diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html index be040b9ce..1d14236cb 100644 --- a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html @@ -9,10 +9,11 @@ + [placeholder]="placeholder" [subtitleFunction]="subtitleFunction" (onItemChange)="this.onItemChangeFunc($event)" [formCtrl]="formControl" + [disabled]="disabled">
    -
    +
    diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts index 9568aaa26..c79b4732e 100644 --- a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts @@ -21,6 +21,9 @@ export class ExternalItemListingComponent implements OnInit { @Input() public displayFunction: Function; + @Input() + public subtitleFunction: Function; + @Input() public disabled = true; diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html index 18cb0553b..564a2d0bc 100644 --- a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html +++ b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html @@ -1,4 +1,4 @@ + titleKey="titleKey" [formCtrl]="formCtrl" [_subtitleFn]="subtitleFunction" [displayFunction]="displayFunction" [disabled]="disabled" + (onItemChange)="this.onItemChangeFunc($event)" [clear]="true" [required]="false"> diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts index c463e8f36..363450d54 100644 --- a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts +++ b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts @@ -22,6 +22,9 @@ export class ExternalItemComponent implements OnInit { @Input() public displayFunction: Function; + @Input() + public subtitleFunction: Function; + @Input() public disabled = false; diff --git a/dmp-frontend/src/app/shared/components/file-uploader/file-uploader.component.html b/dmp-frontend/src/app/shared/components/file-uploader/file-uploader.component.html index ce536bf8e..5d9d21af0 100644 --- a/dmp-frontend/src/app/shared/components/file-uploader/file-uploader.component.html +++ b/dmp-frontend/src/app/shared/components/file-uploader/file-uploader.component.html @@ -1,11 +1,11 @@ - file_upload - {{ files?.name }} - - attach_file - - {{label | translate}} - - - \ No newline at end of file + (upload)="uploadEvent($event)" (cancel)="cancelEvent()" accept=".jpg,.png" [disabled]="disabled" multiple> + file_upload + {{ files['name'] }} + + attach_file + + {{label | translate}} + + + diff --git a/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts b/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts index 3eb679241..35b743f67 100644 --- a/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts +++ b/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts @@ -16,15 +16,15 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; }) export class InvitationComponent implements OnInit { - private formGroup: FormGroup; + public formGroup: FormGroup; - private filteredUsersAsync: boolean = false; + public filteredUsersAsync: boolean = false; - private filteredUsers: User[]; + public filteredUsers: User[]; constructor( - private invitationService: InvitationService, - private route: ActivatedRoute, + public invitationService: InvitationService, + public route: ActivatedRoute, public router: Router, public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html index 4bb2a086d..003ab15ad 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -16,9 +16,6 @@
    {{this.getPrincipalName()}} - diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts b/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts index 16e3556a4..107b94530 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts @@ -1,8 +1,9 @@ import { sample } from 'rxjs/operators'; -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output, ElementRef } from '@angular/core'; import { Principal } from '../../../models/login/Principal'; import { AuthService } from '../../../services/auth/auth.service'; import { LanguageResolverService } from '../../../services/language-resolver/language-resolver.service'; +import { MatSidenav } from '@angular/material'; @Component({ selector: 'app-navigation', @@ -26,7 +27,7 @@ export class NavigationComponent { } @Input() - sidenavOpen = false; + sideNav: MatSidenav; @Output() sidenavOpenChanges = new EventEmitter(); @@ -60,7 +61,6 @@ export class NavigationComponent { } onSideNavClick() { - this.sidenavOpen = !this.sidenavOpen; - this.sidenavOpenChanges.emit(this.sidenavOpen); + this.sideNav.toggle(); } } diff --git a/dmp-frontend/src/app/shared/components/url-listing/url-listing.component.ts b/dmp-frontend/src/app/shared/components/url-listing/url-listing.component.ts index 2dacfc038..1d55779c6 100644 --- a/dmp-frontend/src/app/shared/components/url-listing/url-listing.component.ts +++ b/dmp-frontend/src/app/shared/components/url-listing/url-listing.component.ts @@ -25,6 +25,6 @@ export class UrlListingComponent { } navigate(link: string) { - this.router.navigate([link, this.parameters]); + this.router.navigate([link], { queryParams: this.parameters }); } } diff --git a/dmp-frontend/src/app/shared/componentsAdmin/combobox/combobox-component.html b/dmp-frontend/src/app/shared/componentsAdmin/combobox/combobox-component.html index a3eb851a1..4ce4b2d4e 100644 --- a/dmp-frontend/src/app/shared/componentsAdmin/combobox/combobox-component.html +++ b/dmp-frontend/src/app/shared/componentsAdmin/combobox/combobox-component.html @@ -1,16 +1,16 @@
    - - -
    -
    - -
    + + +
    +
    +
    -
    -
    - -
    -
    -
    \ No newline at end of file +
    +
    +
    + +
    +
    +
    diff --git a/dmp-frontend/src/app/shared/componentsAdmin/radiobox/radiobox-component.html b/dmp-frontend/src/app/shared/componentsAdmin/radiobox/radiobox-component.html index f33a91a9d..d0bbe6f72 100644 --- a/dmp-frontend/src/app/shared/componentsAdmin/radiobox/radiobox-component.html +++ b/dmp-frontend/src/app/shared/componentsAdmin/radiobox/radiobox-component.html @@ -1,29 +1,29 @@
    -
    -
    - - -
    +
    +
    + + +
    -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    - +
    + -
    \ No newline at end of file +
    diff --git a/dmp-frontend/src/app/shared/componentsAdmin/wordlist/wordlist-component.html b/dmp-frontend/src/app/shared/componentsAdmin/wordlist/wordlist-component.html index 73da25ad7..c6b4c40bc 100644 --- a/dmp-frontend/src/app/shared/componentsAdmin/wordlist/wordlist-component.html +++ b/dmp-frontend/src/app/shared/componentsAdmin/wordlist/wordlist-component.html @@ -1,28 +1,28 @@
    -
    -
    +
    +
    + + +
    +
    +
    +
    +
    - -
    -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    + +
    +
    + + +
    +
    - +
    + -
    \ No newline at end of file +
    diff --git a/dmp-frontend/src/app/shared/help-content/help-content.component.ts b/dmp-frontend/src/app/shared/help-content/help-content.component.ts index 804f7b185..a3f91373d 100644 --- a/dmp-frontend/src/app/shared/help-content/help-content.component.ts +++ b/dmp-frontend/src/app/shared/help-content/help-content.component.ts @@ -43,6 +43,7 @@ export class HelpContentComponent implements OnInit { this.errorMessage = 'System error retrieving page content (Server responded: ' + error + ')'; } } + @Component({ selector: 'aside-help-content', template: ` diff --git a/dmp-frontend/src/app/user-management/admin-login/admin-login.component.html b/dmp-frontend/src/app/user-management/admin-login/admin-login.component.html index d5453623f..b86b90b27 100644 --- a/dmp-frontend/src/app/user-management/admin-login/admin-login.component.html +++ b/dmp-frontend/src/app/user-management/admin-login/admin-login.component.html @@ -1,34 +1,34 @@
    -
    -
    -
    -
    -
    -

    Login

    - -
    +
    +
    +
    +
    +
    +

    Login

    + +
    +
    -
    \ No newline at end of file +
    +
    diff --git a/dmp-frontend/src/app/user-management/admin-login/admin-login.component.scss b/dmp-frontend/src/app/user-management/admin-login/admin-login.component.scss index ba8db6690..29fc432ef 100644 --- a/dmp-frontend/src/app/user-management/admin-login/admin-login.component.scss +++ b/dmp-frontend/src/app/user-management/admin-login/admin-login.component.scss @@ -1,139 +1,148 @@ -.container{ - padding: 15px 30px; - } - - .card{ - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); - border-radius: 6px; - color: rgba(0,0,0, 0.87); - background: #fff; - } - - .card-raised{ - box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); - } - - .page-title{ - margin-top: 40px; - } - - @media (min-width: 1200px) { - .container { - width: 100%; - } - } - - @media (min-width: 992px) { - .container { - width: 100%; - } - } - - @media (min-width: 768px) { - .container { - width: 100%; - } - } - - .container{ - height: 100%; - position: relative; - z-index: 1; - } - - .card{ - position: relative; - padding: 20px; - display: flex; - flex-direction: column; - align-items: center; - margin-top: 90px; - top: -90px; - -webkit-animation-name: card; - -moz-animation-name: card; - -o-animation-name: card; - animation-name: card; - -webkit-animation-duration: 600ms; - -moz-animation-duration: 600ms; - -o-animation-duration: 600ms; - animation-duration: 600ms; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - -o-animation-fill-mode: forwards; - animation-fill-mode: forwards; - } - - @-webkit-keyframes card { - from {top: -40px;} - to {top: 0;} - } - - @keyframes card { - from {top: -40px;} - to {top: 0;} - } - - .card-header{ - position: relative; - overflow: hidden; - top: -40px; +.container { + padding: 15px 30px; +} + +.card { + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); + border-radius: 6px; + color: rgba(0, 0, 0, 0.87); + background: #fff; +} + +.card-raised { + box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); +} + +.page-title { + margin-top: 40px; +} + +@media (min-width: 1200px) { + .container { width: 100%; - padding: 25px; - border-radius: 3px; - background: linear-gradient(60deg, #aeb5b4, #9d9799); - box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(49, 46, 47, 0.4); - display: flex; - flex-direction: column; - align-items: center; - } - - .card-header h4{ - font-weight: 400; - color: #fff; - margin-bottom: 25px; - margin-top: 5px; - } - - .social-btns i{ - font-size: 21px; - color: #fff; - } - - .social-btns button{ - margin: 0 8px; } - - .tip{ - margin-top: -20px; - } - - .form-row, .card-form, .mat-input-container{ +} + +@media (min-width: 992px) { + .container { width: 100%; } - - .card-form{ - padding: 5px; - } - - .form-row{ - position: relative; - display: flex; - align-items: center; - margin-top: 13px; +} + +@media (min-width: 768px) { + .container { + width: 100%; } - - .form-row i{ - position: relative; - top: -5px; - margin-right: 15px; - color: #555; +} + +.container { + height: 100%; + position: relative; + z-index: 1; +} + +.card { + position: relative; + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; + margin-top: 90px; + top: -90px; + -webkit-animation-name: card; + -moz-animation-name: card; + -o-animation-name: card; + animation-name: card; + -webkit-animation-duration: 600ms; + -moz-animation-duration: 600ms; + -o-animation-duration: 600ms; + animation-duration: 600ms; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + -o-animation-fill-mode: forwards; + animation-fill-mode: forwards; +} + +@-webkit-keyframes card { + from { + top: -40px; } - - .card-footer{ - margin: 10px; + to { + top: 0; } - - .card-footer button{ - color: #0c0b0b; +} + +@keyframes card { + from { + top: -40px; } - \ No newline at end of file + to { + top: 0; + } +} + +.card-header { + position: relative; + overflow: hidden; + top: -40px; + width: 100%; + padding: 25px; + border-radius: 3px; + background: linear-gradient(60deg, #aeb5b4, #9d9799); + box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(49, 46, 47, 0.4); + display: flex; + flex-direction: column; + align-items: center; +} + +.card-header h4 { + font-weight: 400; + color: #fff; + margin-bottom: 25px; + margin-top: 5px; +} + +.social-btns i { + font-size: 21px; + color: #fff; +} + +.social-btns button { + margin: 0 8px; +} + +.tip { + margin-top: -20px; +} + +.form-row, +.card-form, +.mat-form-field { + width: 100%; +} + +.card-form { + padding: 5px; +} + +.form-row { + position: relative; + display: flex; + align-items: center; + margin-top: 13px; +} + +.form-row i { + position: relative; + top: -5px; + margin-right: 15px; + color: #555; +} + +.card-footer { + margin: 10px; +} + +.card-footer button { + color: #0c0b0b; +} diff --git a/dmp-frontend/src/app/user-management/login/login.component.html b/dmp-frontend/src/app/user-management/login/login.component.html index 7b7d630e8..43287c763 100644 --- a/dmp-frontend/src/app/user-management/login/login.component.html +++ b/dmp-frontend/src/app/user-management/login/login.component.html @@ -19,22 +19,25 @@
    - +
    email - + - +
    lock_outline - + - +
    -
    \ No newline at end of file +
    diff --git a/dmp-frontend/src/app/user-management/login/login.component.scss b/dmp-frontend/src/app/user-management/login/login.component.scss index e0e8af094..e2acfe0ae 100644 --- a/dmp-frontend/src/app/user-management/login/login.component.scss +++ b/dmp-frontend/src/app/user-management/login/login.component.scss @@ -1,19 +1,19 @@ -.container{ +.container { padding: 15px 30px; } -.card{ +.card { box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); border-radius: 6px; - color: rgba(0,0,0, 0.87); + color: rgba(0, 0, 0, 0.87); background: #fff; } -.card-raised{ +.card-raised { box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); } -.page-title{ +.page-title { margin-top: 40px; } @@ -35,13 +35,13 @@ } } -.container{ +.container { height: 100%; position: relative; z-index: 1; } -.card{ +.card { position: relative; padding: 20px; display: flex; @@ -64,16 +64,24 @@ } @-webkit-keyframes card { - from {top: -40px;} - to {top: 0;} + from { + top: -40px; + } + to { + top: 0; + } } @keyframes card { - from {top: -40px;} - to {top: 0;} + from { + top: -40px; + } + to { + top: 0; + } } -.card-header{ +.card-header { position: relative; overflow: hidden; top: -40px; @@ -87,53 +95,55 @@ align-items: center; } -.card-header h4{ +.card-header h4 { font-weight: 400; color: #fff; margin-bottom: 25px; margin-top: 5px; } -.social-btns i{ +.social-btns i { font-size: 21px; color: #fff; } -.social-btns button{ +.social-btns button { margin: 0 8px; } -.tip{ +.tip { margin-top: -20px; } -.form-row, .card-form, .mat-input-container{ +.form-row, +.card-form, +.mat-form-field { width: 100%; } -.card-form{ +.card-form { padding: 5px; } -.form-row{ +.form-row { position: relative; display: flex; align-items: center; margin-top: 13px; } -.form-row i{ +.form-row i { position: relative; top: -5px; margin-right: 15px; color: #555; } -.card-footer{ +.card-footer { margin: 10px; } -.card-footer button{ +.card-footer button { color: #e91e63; } @@ -143,9 +153,10 @@ width: 45px; height: 25px; } + span.iconmedium { background: url(img/b2access_medium.png) no-repeat; float: left; width: 100px; height: 56px; -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/user-management/utilties/login-service.ts b/dmp-frontend/src/app/user-management/utilties/login-service.ts index d1d0cd646..f8cb479c7 100644 --- a/dmp-frontend/src/app/user-management/utilties/login-service.ts +++ b/dmp-frontend/src/app/user-management/utilties/login-service.ts @@ -20,215 +20,213 @@ declare const IN: any; @Injectable() export class LoginService { - private providers: LoginOptions[] - private auth2: any; - constructor( - private router: Router, - public authService: AuthService, - public route: ActivatedRoute, - public snackBar: MatSnackBar, - public language: TranslateService, - private zone: NgZone, - private httpClient: HttpClient, - @Optional() private config: LoginServiceConfiguration - ) { - if (config) { - this.providers = config.loginProviders; - } - else this.providers = [LoginOptions.nativeLogin]; - } - - public initProviders() { - if (this.hasProvider(LoginOptions.googleOauth)) this.initialiseGoogleOauth(); - if (this.hasProvider(LoginOptions.facebookOauth)) this.initialiseFacebookOauth(); - } - - public hasProvider(provider: LoginOptions) { - for (let i = 0; i < this.providers.length; i++) { - if (provider === this.providers[i]) return this.isProviderProperlyConfigured(provider) - } - return false; - } - - private isProviderProperlyConfigured(provider: LoginOptions) { - switch (provider) { - case LoginOptions.facebookOauth: return this.hasAllRequiredFieldsConfigured(this.config.facebookConfiguration); - case LoginOptions.googleOauth: return this.hasAllRequiredFieldsConfigured(this.config.googleConfiguration) - case LoginOptions.linkedInOauth: return this.hasAllRequiredFieldsConfigured(this.config.linkedInConfiguration); - case LoginOptions.twitterOauth: return this.hasAllRequiredFieldsConfigured(this.config.twitterConfiguration); - case LoginOptions.b2Access: return this.hasAllRequiredFieldsConfigured(this.config.b2accessConfiguration); - case LoginOptions.nativeLogin: return true; - default: throw new Error("Unsupported Provider Type") - } - } - - private hasAllRequiredFieldsConfigured(configuration: LoginProviderConfiguration) { - if (configuration != null && configuration.clientId != null) return true - return false; - } - - /* - * GOOGLE SIGN IN - */ - - private initialiseGoogleOauth(): void { - gapi.load('auth2', () => { - this.auth2 = gapi.auth2.init({ - client_id: this.config.googleConfiguration.clientId, - cookiepolicy: 'single_host_origin', - scope: 'profile email' - }); - this.attachGoogleSignin(document.getElementById('googleSignInButton')); - }); - } - - public attachGoogleSignin(element) { - if (!element) return - this.auth2.attachClickHandler(element, {}, - (googleUser) => { - var id_token = googleUser.getAuthResponse().id_token; - if (id_token) { - this.authService.login({ ticket: id_token, provider: LoginProviders.Google }).subscribe( - res => this.onLogInSuccess(res), - error => this.onLogInError(error) - ) - } - }, (error) => { - alert(JSON.stringify(error, undefined, 2)); - }); - } - - - - /* - * FACEBOOK SIGN IN - */ - - - private initialiseFacebookOauth(): void { - FB.init({ - appId: this.config.facebookConfiguration.clientId, - cookie: false, - xfbml: true, - version: 'v2.8' - }); - } - - - - - public facebookLogin() { - FB.login((response: any) => { - if (response.status === 'connected' || 'not_authorized') { - this.authService.login({ ticket: response.authResponse.accessToken, provider: LoginProviders.Facebook }).subscribe( - res => this.onLogInSuccess(res), - error => this.onLogInError(error) - ) - } - }, { scope: 'user_friends,email' }); - } - - /* - * LINKEDIN SIGN IN - */ - - public linkedinAuthorize() { - window.location.href = this.config.linkedInConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.linkedInConfiguration.clientId + "&redirect_uri=" + this.config.linkedInConfiguration.redirectUri + "&state=987654321" - } - - public linkedInInitialiseLogin() { - this.router.navigate(["/login/linkedin"]) - } + private providers: LoginOptions[] + private auth2: any; + constructor( + private router: Router, + public authService: AuthService, + public route: ActivatedRoute, + public snackBar: MatSnackBar, + public language: TranslateService, + private zone: NgZone, + private httpClient: HttpClient, + @Optional() private config: LoginServiceConfiguration + ) { + if (config) { + this.providers = config.loginProviders; + } + else this.providers = [LoginOptions.nativeLogin]; + } + + public initProviders() { + if (this.hasProvider(LoginOptions.googleOauth)) this.initialiseGoogleOauth(); + if (this.hasProvider(LoginOptions.facebookOauth)) this.initialiseFacebookOauth(); + } + + public hasProvider(provider: LoginOptions) { + for (let i = 0; i < this.providers.length; i++) { + if (provider === this.providers[i]) return this.isProviderProperlyConfigured(provider) + } + return false; + } + + private isProviderProperlyConfigured(provider: LoginOptions) { + switch (provider) { + case LoginOptions.facebookOauth: return this.hasAllRequiredFieldsConfigured(this.config.facebookConfiguration); + case LoginOptions.googleOauth: return this.hasAllRequiredFieldsConfigured(this.config.googleConfiguration) + case LoginOptions.linkedInOauth: return this.hasAllRequiredFieldsConfigured(this.config.linkedInConfiguration); + case LoginOptions.twitterOauth: return this.hasAllRequiredFieldsConfigured(this.config.twitterConfiguration); + case LoginOptions.b2Access: return this.hasAllRequiredFieldsConfigured(this.config.b2accessConfiguration); + case LoginOptions.nativeLogin: return true; + default: throw new Error("Unsupported Provider Type") + } + } + + private hasAllRequiredFieldsConfigured(configuration: LoginProviderConfiguration) { + if (configuration != null && configuration.clientId != null) return true + return false; + } + + /* + * GOOGLE SIGN IN + */ - public linkedInloginUser(code: string) { - this.authService.login({ ticket: code, provider: LoginProviders.LinkedIn }).subscribe( + private initialiseGoogleOauth(): void { + gapi.load('auth2', () => { + this.auth2 = gapi.auth2.init({ + client_id: this.config.googleConfiguration.clientId, + cookiepolicy: 'single_host_origin', + scope: 'profile email' + }); + this.attachGoogleSignin(document.getElementById('googleSignInButton')); + }); + } + + public attachGoogleSignin(element) { + if (!element) return + this.auth2.attachClickHandler(element, {}, + (googleUser) => { + var id_token = googleUser.getAuthResponse().id_token; + if (id_token) { + this.authService.login({ ticket: id_token, provider: LoginProviders.Google }).subscribe( res => this.onLogInSuccess(res), error => this.onLogInError(error) - ) - } - - /* - * TWITTER SIGN IN - */ - public twitterInitialiseLogin() { - this.router.navigate(["/login/twitter"]) - } + ) + } + }, (error) => { + alert(JSON.stringify(error, undefined, 2)); + }); + } - public twitterAuthorize() { - let headers = new HttpHeaders(); - headers = headers.set('Content-Type', 'application/json'); - headers = headers.set('Accept', 'application/json'); - this.httpClient.get(HostConfiguration.Server + 'auth/twitterRequestToken', { headers: headers }).subscribe((data: any) => { - window.location.href = this.config.twitterConfiguration.oauthUrl + "?oauth_token=" + data.payload.value - }) - } - public twitterLogin(token: string, verifier: string) { - this.authService.login({ ticket: token, provider: LoginProviders.Twitter, data: verifier }).subscribe( - res => this.onLogInSuccess(res), - error => this.onLogInError(error) - ) - } - /* - * B2ACCESS LOG IN + /* + * FACEBOOK SIGN IN */ - public b2AccessInitialiseLogin() { - this.router.navigate(["/api/oauth/authorized/b2access"]) - } - public b2AccessGetAuthCode() { - window.location.href = this.config.b2accessConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.b2accessConfiguration.clientId + "&redirect_uri=" + this.config.b2accessConfiguration.redirectUri + "&state=987654321&scope=USER_PROFILE" - } + private initialiseFacebookOauth(): void { + FB.init({ + appId: this.config.facebookConfiguration.clientId, + cookie: false, + xfbml: true, + version: 'v2.8' + }); + } - public b2AccessLogin(code: String) { - let headers = new HttpHeaders(); - headers = headers.set('Content-Type', 'application/json'); - headers = headers.set('Accept', 'application/json'); - this.httpClient.post(HostConfiguration.Server + "auth/b2AccessRequestToken", { code: code }, { headers: headers }) - .subscribe((data: any) => { - this.authService.login({ ticket: data.payload.accessToken, provider: LoginProviders.B2Accesss, data: null }).subscribe( - res => this.onLogInSuccess(res), - error => this.onLogInError(error) - ) - }) - } - /* - * NATIVE LOGIN - */ - public nativeLogin(credentials: Credential) { - this.authService.nativeLogin(credentials).subscribe( - res => this.onLogInSuccess(res), - error => this.onLogInError(error) + public facebookLogin() { + FB.login((response: any) => { + if (response.status === 'connected' || 'not_authorized') { + this.authService.login({ ticket: response.authResponse.accessToken, provider: LoginProviders.Facebook }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) ) - } - - - /* - * LOGIN HANDLERS - */ - - - public onLogInSuccess(logoutMessage: any) { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGIN', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-success'] - }); - let params = this.router["rawUrlTree"].queryParams; - let redirectUrl = params['returnUrl'] ? params['returnUrl'] : '/'; - this.zone.run(() => this.router.navigate([redirectUrl])); - } - - public onLogInError(errorMessage: string) { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGIN', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-warning'] - }) - } -} \ No newline at end of file + } + }, { scope: 'user_friends,email' }); + } + + /* + * LINKEDIN SIGN IN + */ + + public linkedinAuthorize() { + window.location.href = this.config.linkedInConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.linkedInConfiguration.clientId + "&redirect_uri=" + this.config.linkedInConfiguration.redirectUri + "&state=987654321" + } + + public linkedInInitialiseLogin() { + this.router.navigate(["/login/linkedin"]) + } + + public linkedInloginUser(code: string) { + this.authService.login({ ticket: code, provider: LoginProviders.LinkedIn }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + + /* + * TWITTER SIGN IN + */ + public twitterInitialiseLogin() { + this.router.navigate(["/login/twitter"]) + } + + public twitterAuthorize() { + let headers = new HttpHeaders(); + headers = headers.set('Content-Type', 'application/json'); + headers = headers.set('Accept', 'application/json'); + this.httpClient.get(HostConfiguration.Server + 'auth/twitterRequestToken', { headers: headers }).subscribe((data: any) => { + window.location.href = this.config.twitterConfiguration.oauthUrl + "?oauth_token=" + data.payload.value + }) + } + + public twitterLogin(token: string, verifier: string) { + this.authService.login({ ticket: token, provider: LoginProviders.Twitter, data: verifier }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + + /* +* B2ACCESS LOG IN +*/ + + public b2AccessInitialiseLogin() { + this.router.navigate(["/api/oauth/authorized/b2access"]) + } + + public b2AccessGetAuthCode() { + window.location.href = this.config.b2accessConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.b2accessConfiguration.clientId + "&redirect_uri=" + this.config.b2accessConfiguration.redirectUri + "&state=987654321&scope=USER_PROFILE" + } + + public b2AccessLogin(code: String) { + let headers = new HttpHeaders(); + headers = headers.set('Content-Type', 'application/json'); + headers = headers.set('Accept', 'application/json'); + this.httpClient.post(HostConfiguration.Server + "auth/b2AccessRequestToken", { code: code }, { headers: headers }) + .subscribe((data: any) => { + this.authService.login({ ticket: data.payload.accessToken, provider: LoginProviders.B2Accesss, data: null }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + }) + } + + + /* + * NATIVE LOGIN + */ + + public nativeLogin(credentials: Credential) { + this.authService.nativeLogin(credentials).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + + + /* + * LOGIN HANDLERS + */ + + + public onLogInSuccess(logoutMessage: any) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGIN', language: this.language }, + duration: 3000, + }); + let params = this.router["rawUrlTree"].queryParams; + let redirectUrl = params['returnUrl'] ? params['returnUrl'] : '/'; + this.zone.run(() => this.router.navigate([redirectUrl])); + } + + public onLogInError(errorMessage: string) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGIN', language: this.language }, + duration: 3000, + }) + } +} diff --git a/dmp-frontend/src/app/users/components/roles/user-role-editor.component.ts b/dmp-frontend/src/app/users/components/roles/user-role-editor.component.ts index f1fcbaf5e..d5e06bb1c 100644 --- a/dmp-frontend/src/app/users/components/roles/user-role-editor.component.ts +++ b/dmp-frontend/src/app/users/components/roles/user-role-editor.component.ts @@ -19,14 +19,14 @@ import { MatSnackBar } from '@angular/material'; export class UserRoleEditorComponent implements OnInit { @Input() public item: UserListingModel; - private formGroup: FormGroup = null; - private nowEditing = false; - private errorModel: UserErrorModel; + public formGroup: FormGroup = null; + public nowEditing = false; + public errorModel: UserErrorModel; constructor( - private language: TranslateService, - private userService: UserReferenceService, - private formBuilder: FormBuilder, - private snackBar: MatSnackBar + public language: TranslateService, + public userService: UserReferenceService, + public formBuilder: FormBuilder, + public snackBar: MatSnackBar ) { } @@ -133,7 +133,6 @@ export class UserRoleEditorComponent implements OnInit { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }); } onCallbackError(error: any) { @@ -142,7 +141,6 @@ export class UserRoleEditorComponent implements OnInit { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-UPDATE', language: this.language }, duration: 3000, - extraClasses: ['snackbar-warning'] }); } diff --git a/dmp-frontend/src/app/users/components/users.component.ts b/dmp-frontend/src/app/users/components/users.component.ts index 256259f96..aad27d8cb 100644 --- a/dmp-frontend/src/app/users/components/users.component.ts +++ b/dmp-frontend/src/app/users/components/users.component.ts @@ -63,7 +63,6 @@ export class UsersDataSource extends DataSource { this._snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.FORMS-BAD-REQUEST', language: this._languageService }, duration: 3000, - extraClasses: ['snackbar-warning'] }); this._criteria.onCallbackError(error); return Observable.of(null); diff --git a/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts index 13b61ec56..7f9182cab 100644 --- a/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts +++ b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts @@ -75,7 +75,6 @@ export class BaseHttpService { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, duration: 3000, - extraClasses: ['snackbar-success'] }) let currentPage = this.router.url; this.router.navigate(['/unauthorized'], { queryParams: { returnUrl: currentPage } }); @@ -87,7 +86,6 @@ export class BaseHttpService { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: error.message, language: null }, duration: 3000, - extraClasses: ['snackbar-warning'] }) return Observable.throw(errorResponse); } @@ -98,7 +96,6 @@ export class BaseHttpService { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, duration: 3000, - extraClasses: ['snackbar-warning'] }) return Observable.throw(errorResponse); } @@ -106,21 +103,20 @@ export class BaseHttpService { }) .map(response => { if (response instanceof Blob) return response - if (response.statusCode == ApiMessageCode.SUCCESS_MESSAGE) { + if (response["statusCode"] == ApiMessageCode.SUCCESS_MESSAGE) { //throw new Error('Request failed'); this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: response.message, language: null }, + data: { message: response["message"], language: null }, duration: 3000, - extraClasses: ['snackbar-success'] }) - return response.payload; + return response["payload"]; } - else if (response.statusCode == ApiMessageCode.NO_MESSAGE) { - return response.payload; + else if (response["statusCode"] == ApiMessageCode.NO_MESSAGE) { + return response["payload"]; } else { - return response.payload; + return response["payload"]; } }); } diff --git a/dmp-frontend/src/app/welcomepage/welcomepage.component.ts b/dmp-frontend/src/app/welcomepage/welcomepage.component.ts index c3a86acd2..89bce9cc9 100644 --- a/dmp-frontend/src/app/welcomepage/welcomepage.component.ts +++ b/dmp-frontend/src/app/welcomepage/welcomepage.component.ts @@ -4,7 +4,6 @@ import { DashboardService } from '../../app/services/dashboard/dashboard.service import { DashboardStatisticsModel } from '../models/dashboard/DashboardStatisticsModel'; import { JsonSerializer } from '../utilities/JsonSerializer'; import { HomepageComponent } from '../homepage/homepage.component' -import { IBreadcrumb } from 'ngx-breadcrumbs'; import { IBreadCrumbComponent } from '../shared/components/breadcrumb/definition/IBreadCrumbComponent'; import { Observable } from 'rxjs/Observable'; import { BreadcrumbItem } from '../shared/components/breadcrumb/definition/breadcrumb-item'; diff --git a/dmp-frontend/src/assets/lang/en.json b/dmp-frontend/src/assets/lang/en.json index 3ce0c2cba..c84aade7e 100644 --- a/dmp-frontend/src/assets/lang/en.json +++ b/dmp-frontend/src/assets/lang/en.json @@ -185,7 +185,8 @@ "LIKE": "Search", "PERIOD-FROM": "Start", "PERIOD-TO": "End", - "STATUS": "Status" + "STATUS": "Status", + "TAGS": "Tags" }, "DMP": { "LIKE": "Search", diff --git a/dmp-frontend/src/environments/environment.ts b/dmp-frontend/src/environments/environment.ts index 05a577f68..b60755433 100644 --- a/dmp-frontend/src/environments/environment.ts +++ b/dmp-frontend/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, - Server: 'http://devel-21.local.cite.gr:8080/api/', + Server: 'http://localhost:8080/api/', App: 'http://localhost:4200/', HelpServiceUrl: 'localhost:5000/' }; diff --git a/dmp-frontend/tslint.json b/dmp-frontend/tslint.json index 9963d6c39..d8d395663 100644 --- a/dmp-frontend/tslint.json +++ b/dmp-frontend/tslint.json @@ -18,7 +18,6 @@ "forin": true, "import-blacklist": [ true, - "rxjs", "rxjs/Rx" ], "import-spacing": true, diff --git a/docker-compose.yml b/docker-compose.yml index 8c3a4baa2..42fcd5682 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,9 @@ services: # # ELASTIC_VERSION=6.0.0-beta1 TAG=6.0.0-beta1-3eab5b40 docker-compose up # + +##########################DMP###################################################################### + dmp-backend: build: context: ./dmp-backend @@ -25,8 +28,9 @@ services: container_name: dmp-backend ports: ['0.0.0.0:8080:8080'] links: - - logstash - networks: ['stack'] + - logstash:logstash + - elasticsearch-dmp:elasticsearch-dmp + networks: ['stack','elasticsearch-dmp'] dmp-frontend: build: @@ -38,12 +42,28 @@ services: ports: ['0.0.0.0:80:80'] networks: ['stack'] +##########################ELASTIC###################################################################### + elasticsearch-dmp: + image: docker.elastic.co/elasticsearch/elasticsearch:${TAG} + container_name: elasticsearch-dmp + volumes: + - ./elastic-config/elasticsearch-custom.yml:/usr/share/elasticsearch/config/elasticsearch.yml + environment: ['http.host=0.0.0.0','transport.host=0.0.0.0'] + ports: ['0.0.0.0:9201:9200','0.0.0.0:9301:9300'] + networks: ['elasticsearch-dmp'] + volumes: + - esdata-dmp:/usr/share/elasticsearch/data + +##########################ELK-STACK###################################################################### + elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:${TAG} container_name: elasticsearch environment: ['http.host=0.0.0.0', 'transport.host=127.0.0.1', 'ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] ports: ['0.0.0.0:9200:9200'] networks: ['stack'] + volumes: + - esdata:/usr/share/elasticsearch/data kibana: image: docker.elastic.co/kibana/kibana:${TAG} @@ -62,27 +82,25 @@ services: networks: ['stack'] depends_on: ['elasticsearch', 'setup_logstash'] - filebeat: - image: docker.elastic.co/beats/filebeat:${TAG} - container_name: filebeat - command: -e -E 'output.elasticsearch.password=${ELASTIC_PASSWORD}' - networks: ['stack'] - depends_on: ['elasticsearch', 'setup_filebeat'] + #filebeat: + # image: docker.elastic.co/beats/filebeat:${TAG} + # container_name: filebeat + # command: -e -E 'output.elasticsearch.password=${ELASTIC_PASSWORD}' + # networks: ['stack'] + # depends_on: ['elasticsearch', 'setup_filebeat'] - heartbeat: - image: docker.elastic.co/beats/heartbeat:${TAG} - container_name: heartbeat - command: -e -E 'output.elasticsearch.password=${ELASTIC_PASSWORD}' - networks: ['stack'] - depends_on: ['elasticsearch', 'setup_heartbeat'] + #heartbeat: + # image: docker.elastic.co/beats/heartbeat:${TAG} + # container_name: heartbeat + # command: -e -E 'output.elasticsearch.password=${ELASTIC_PASSWORD}' + # networks: ['stack'] + # depends_on: ['elasticsearch', 'setup_heartbeat'] # Run a short-lived container to set up Logstash. setup_logstash: image: centos:7 container_name: setup_logstash volumes: ['./ELK.Docker/scripts/setup-logstash.sh:/usr/local/bin/setup-logstash.sh:ro'] - # The script may have CR/LF line endings if using Docker for Windows, so - # make sure that they don't confuse Bash. command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-logstash.sh | tr -d "\r" | bash'] environment: ['ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] networks: ['stack'] @@ -97,25 +115,95 @@ services: networks: ['stack'] depends_on: ['elasticsearch'] - setup_filebeat: - image: docker.elastic.co/beats/filebeat:${TAG} - container_name: setup_filebeat - volumes: ['./ELK.Docker/scripts/setup-beat.sh:/usr/local/bin/setup-beat.sh:ro'] - command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-beat.sh | tr -d "\r" | bash -s filebeat'] - environment: ['ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] - networks: ['stack'] - depends_on: ['kibana'] + #setup_filebeat: + # image: docker.elastic.co/beats/filebeat:${TAG} + # container_name: setup_filebeat + # volumes: ['./ELK.Docker/scripts/setup-beat.sh:/usr/local/bin/setup-beat.sh:ro'] + # command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-beat.sh | tr -d "\r" | bash -s filebeat'] + # environment: ['ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] + # networks: ['stack'] + # depends_on: ['kibana'] + + #setup_heartbeat: + # image: docker.elastic.co/beats/heartbeat:${TAG} + # container_name: setup_heartbeat + # volumes: ['./ELK.Docker/scripts/setup-beat.sh:/usr/local/bin/setup-beat.sh:ro'] + # command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-beat.sh | tr -d "\r" | bash -s heartbeat'] + # environment: ['ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] + # networks: ['stack'] + # depends_on: ['kibana'] + +##########################DOCSBOX###################################################################### + # web: + # restart: always + # build: ./docsbox-master/docsbox + # expose: + # - "8000" + # links: + # - redis:redis + # volumes: + # - docsbox:/home/docsbox + # - media:/home/docsbox/media + # command: gunicorn -b :8000 docsbox:app + # networks: ['stack'] + + # rqworker: + # restart: always + # build: ./docsbox-master/docsbox + # links: + # - redis:redis + # volumes: + # - web + # command: rq worker -c docsbox.settings + # networks: ['stack'] + + # rqscheduler: + # restart: always + # build: ./docsbox-master/docsbox + # links: + # - redis:redis + # volumes: + # - web + # command: rqscheduler -H redis -p 6379 -d 0 + # networks: ['stack'] + + # nginx: + # restart: always + # build: ./docsbox-master/nginx/ + # ports: + # - "81:80" + # volumes: + # - web + # links: + # - web:web + # networks: ['stack'] + + # redis: + # restart: always + # image: redis:latest + # expose: + # - "6379" + # volumes: + # - redisdata:/data + # networks: ['stack'] + + +##########################SETTINGS###################################################################### + +volumes: + esdata: + driver: local + esdata-dmp: + driver: local + #redisdata: + # driver: local + # docsbox: + # driver: local + # media: + # driver: local +networks: + stack: {} + elasticsearch-dmp: {} + - setup_heartbeat: - image: docker.elastic.co/beats/heartbeat:${TAG} - container_name: setup_heartbeat - volumes: ['./ELK.Docker/scripts/setup-beat.sh:/usr/local/bin/setup-beat.sh:ro'] - command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-beat.sh | tr -d "\r" | bash -s heartbeat'] - environment: ['ELASTIC_PASSWORD=${ELASTIC_PASSWORD}'] - networks: ['stack'] - depends_on: ['kibana'] -#volumes: - #esdata: - # driver: local -networks: {stack: {}} diff --git a/docsbox-master/.gitignore b/docsbox-master/.gitignore new file mode 100644 index 000000000..4acaba3a2 --- /dev/null +++ b/docsbox-master/.gitignore @@ -0,0 +1,48 @@ +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +docs/_build + +/todo.txt +/.ropeproject +/example.db +/_ +/.cache diff --git a/docsbox-master/.travis.yml b/docsbox-master/.travis.yml new file mode 100644 index 000000000..348bd2212 --- /dev/null +++ b/docsbox-master/.travis.yml @@ -0,0 +1,7 @@ +sudo: required +language: python +services: + - docker + +script: + - docker-compose run web nosetests diff --git a/docsbox-master/LICENSE b/docsbox-master/LICENSE new file mode 100644 index 000000000..e04e227f5 --- /dev/null +++ b/docsbox-master/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Dmitry Veselov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docsbox-master/README.md b/docsbox-master/README.md new file mode 100644 index 000000000..fda98191d --- /dev/null +++ b/docsbox-master/README.md @@ -0,0 +1,134 @@ +# docsbox [![Build Status](https://travis-ci.org/dveselov/docsbox.svg?branch=master)](https://travis-ci.org/dveselov/docsbox) + +`docsbox` is a standalone service that allows you convert office documents, like .docx and .pptx, into more useful filetypes like PDF, for viewing it in browser with PDF.js, or HTML for organizing full-text search of document content. +`docsbox` uses **LibreOffice** (via **LibreOfficeKit**) for document converting. + +```bash +$ curl -F "file=@kittens.docx" http://localhost/api/v1/ + +{ + "id": "9b643d78-d0c8-4552-a0c5-111a89896176", + "status": "queued" +} + +$ curl http://localhost/api/v1/9b643d78-d0c8-4552-a0c5-111a89896176 + +{ + "id": "9b643d78-d0c8-4552-a0c5-111a89896176", + "result_url": "/media/9b643d78-d0c8-4552-a0c5-111a89896176.zip", + "status": "finished" +} + +$ curl -O http://localhost/media/9b643d78-d0c8-4552-a0c5-111a89896176.zip + +$ unzip -l 9b643d78-d0c8-4552-a0c5-111a89896176.zip + +Archive: 9b643d78-d0c8-4552-a0c5-111a89896176.zip + Length Date Time Name +--------- ---------- ----- ---- + 11135 2016-07-08 05:31 txt + 373984 2016-07-08 05:31 pdf + 147050 2016-07-08 05:31 html +--------- ------- + 532169 3 files +``` + +```bash +$ cat options.json +{ + "formats": ["pdf"], + "thumbnails": { + "size": "640x480", + } +} + +$ curl -i -F "file=@kittens.ppt" -F "options=80/tcp docsbox_nginx_1 +f6b55773c71d docsbox_rqworker "rq worker -c docsbox" 15 minutes ago Up 8 minutes docsbox_rqworker_1 +662b08daefea docsbox_rqscheduler "rqscheduler -H redis" 15 minutes ago Up 8 minutes docsbox_rqscheduler_1 +0364df126b36 docsbox_web "gunicorn -b :8000 do" 15 minutes ago Up 8 minutes 8000/tcp docsbox_web_1 +5e8c8481e288 redis:latest "docker-entrypoint.sh" 9 hours ago Up 8 minutes 0.0.0.0:6379->6379/tcp docsbox_redis_1 +``` + +# Settings (env) + +``` +REDIS_URL - redis-server url (default: redis://redis:6379/0) +REDIS_JOB_TIMEOUT - job timeout (default: 10 minutes) +ORIGINAL_FILE_TTL - TTL for uploaded file in seconds (default: 10 minutes) +RESULT_FILE_TTL - TTL for result file in seconds (default: 24 hours) +THUMBNAILS_DPI - thumbnails dpi, for bigger thumbnails choice bigger values (default: 90) +LIBREOFFICE_PATH - path to libreoffice (default: /usr/lib/libreoffice/program/) +``` + +# Scaling +Within a single physical server, docsbox can be scaled by docker-compose: +```bash +$ docker-compose scale web=4 rqworker=8 +``` +For multi-host deployment you'll need to create global syncronized volume (e.g. with flocker), global redis-server and mount it at `docker-compose.yml` file. + +# Supported filetypes + +| Input | Output | Thumbnails | +| ---------------------------------- | ------------------- | ---------- | +| Document `doc` `docx` `odt` `rtf` | `pdf` `txt` `html` | `yes` | +| Presentation `ppt` `pptx` `odp` | `pdf` `html` | `yes` | +| Spreadsheet `xls` `xlsx` `ods` | `pdf` `csv` `html` | `yes` | diff --git a/docsbox-master/docker-compose.yml b/docsbox-master/docker-compose.yml new file mode 100644 index 000000000..60dca2149 --- /dev/null +++ b/docsbox-master/docker-compose.yml @@ -0,0 +1,67 @@ +--- +version: '3' +services: + web: + restart: always + build: ./docsbox-master/docsbox + expose: + - "8000" + links: + - redis:redis + volumes: + - docsbox:/home/docsbox + - media:/home/docsbox/media + command: gunicorn -b :8000 docsbox:app + networks: ['stack'] + + rqworker: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rq worker -c docsbox.settings + networks: ['stack'] + + rqscheduler: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rqscheduler -H redis -p 6379 -d 0 + networks: ['stack'] + + nginx: + restart: always + build: ./docsbox-master/nginx/ + ports: + - "81:80" + volumes: + - web + links: + - web:web + networks: ['stack'] + + redis: + restart: always + image: redis:latest + expose: + - "6379" + volumes: + - redisdata:/data + networks: ['stack'] + +volumes: + esdata: + driver: local + redisdata: + driver: local + docsbox: + driver: local + media: + driver: local + +networks: {stack: {}} diff --git a/docsbox-master/docsbox/Dockerfile b/docsbox-master/docsbox/Dockerfile new file mode 100644 index 000000000..4cbd1352f --- /dev/null +++ b/docsbox-master/docsbox/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:16.04 +MAINTAINER Dmitry Veselov + +RUN apt-get update && apt-get upgrade -y +RUN apt-get install -y libffi-dev libmagic-dev libmagickwand-dev +RUN apt-get install -y libreoffice libreofficekit-dev +RUN apt-get install -y python3-dev python3-pip git + +RUN apt-get clean && apt-get -y update && apt-get install -y locales && locale-gen en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +ADD . /home/docsbox +WORKDIR /home/ +RUN pip3 install --upgrade pip +RUN pip3 install -r docsbox/requirements.txt diff --git a/docsbox-master/docsbox/__init__.py b/docsbox-master/docsbox/__init__.py new file mode 100644 index 000000000..67ea852a9 --- /dev/null +++ b/docsbox-master/docsbox/__init__.py @@ -0,0 +1,32 @@ +from flask import Flask +from flask.ext.rq2 import RQ +from flask_restful import Api +from flask_env_settings import Settings + + +app = Flask(__name__) +app.config.from_object("docsbox.settings") + +Settings(app, rules={ + "REDIS_JOB_TIMEOUT": (int, 60 * 10), + "ORIGINAL_FILE_TTL": (int, 60 * 10), + "RESULT_FILE_TTL": (int, 60 * 60 * 24), + + "LIBREOFFICE_PATH": (str, "/usr/lib/libreoffice/program/"), + + "THUMBNAILS_DPI": (int, 90), + "THUMBNAILS_QUANTIZE": (bool, False), + "THUMBNAILS_QUANTIZE_COLORS": (int, 128), + "THUMBNAILS_QUANTIZE_COLORSPACE": (str, "rgb"), +}) + +api = Api(app) +rq = RQ(app) + +from docsbox.docs.views import DocumentView, DocumentCreateView + +api.add_resource(DocumentView, "/api/v1/") +api.add_resource(DocumentCreateView, "/api/v1/") + +if __name__ == "__main__": + app.run() diff --git a/docsbox-master/docsbox/docs/__init__.py b/docsbox-master/docsbox/docs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docsbox-master/docsbox/docs/tasks.py b/docsbox-master/docsbox/docs/tasks.py new file mode 100644 index 000000000..22c9b3f49 --- /dev/null +++ b/docsbox-master/docsbox/docs/tasks.py @@ -0,0 +1,56 @@ +import os +import shutil +import datetime + +from pylokit import Office +from wand.image import Image +from tempfile import NamedTemporaryFile, TemporaryDirectory + +from rq import get_current_job + +from docsbox import app, rq +from docsbox.docs.utils import make_zip_archive, make_thumbnails + + + +@rq.job(timeout=app.config["REDIS_JOB_TIMEOUT"]) +def remove_file(path): + """ + Just removes a file. + Used for deleting original files (uploaded by user) and result files (result of converting) + """ + return os.remove(path) + + +@rq.job(timeout=app.config["REDIS_JOB_TIMEOUT"]) +def process_document(path, options, meta): + current_task = get_current_job() + with Office(app.config["LIBREOFFICE_PATH"]) as office: # acquire libreoffice lock + with office.documentLoad(path) as original_document: # open original document + with TemporaryDirectory() as tmp_dir: # create temp dir where output'll be stored + for fmt in options["formats"]: # iterate over requested formats + current_format = app.config["SUPPORTED_FORMATS"][fmt] + output_path = os.path.join(tmp_dir, current_format["path"]) + original_document.saveAs(output_path, fmt=current_format["fmt"]) + if options.get("thumbnails", None): + is_created = False + if meta["mimetype"] == "application/pdf": + pdf_path = path + elif "pdf" in options["formats"]: + pdf_path = os.path.join(tmp_dir, "pdf") + else: + pdf_tmp_file = NamedTemporaryFile() + pdf_path = pdf_tmp_file.name + original_document.saveAs(pdf_tmp_file.name, fmt="pdf") + is_created = True + image = Image(filename=pdf_path, + resolution=app.config["THUMBNAILS_DPI"]) + if is_created: + pdf_tmp_file.close() + thumbnails = make_thumbnails(image, tmp_dir, options["thumbnails"]["size"]) + result_path, result_url = make_zip_archive(current_task.id, tmp_dir) + remove_file.schedule( + datetime.timedelta(seconds=app.config["RESULT_FILE_TTL"]), + result_path + ) + return result_url diff --git a/docsbox-master/docsbox/docs/tests/samples/sample.docx b/docsbox-master/docsbox/docs/tests/samples/sample.docx new file mode 100644 index 000000000..8d78118f9 Binary files /dev/null and b/docsbox-master/docsbox/docs/tests/samples/sample.docx differ diff --git a/docsbox-master/docsbox/docs/tests/test_views.py b/docsbox-master/docsbox/docs/tests/test_views.py new file mode 100644 index 000000000..ced97be5a --- /dev/null +++ b/docsbox-master/docsbox/docs/tests/test_views.py @@ -0,0 +1,149 @@ +import os +import ujson +import unittest +import docsbox + + +class BaseTestCase(unittest.TestCase): + + def setUp(self): + self.app = docsbox.app + self.app.config["TESTING"] = True + self.app.config["RQ_ASYNC"] = False + self.samples = os.path.join( + self.app.config["BASE_DIR"], + "docs/tests/samples/" + ) + self.client = docsbox.app.test_client() + + def submit_file(self, filename, options): + with open(filename, "rb") as source: + response = self.client.post("/api/v1/", data={ + "file": source, + "options": ujson.dumps(options), + }) + return response + +class DocumentViewTestCase(BaseTestCase): + + def test_get_task_by_valid_uuid(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["txt"] + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.get("id")) + self.assertEqual(json.get("status"), "queued") + response = self.client.get("/api/v1/{0}".format(json.get("id"))) + self.assertEqual(response.status_code, 200) + self.assertEqual(ujson.loads(response.data), { + "id": json.get("id"), + "status": "queued", + "result_url": None, + }) + + def test_get_task_by_invalid_uuid(self): + response = self.client.get("/api/v1/uuid-with-ponies") + self.assertEqual(response.status_code, 404) + self.assertEqual(ujson.loads(response.data), { + "message": "Unknown task_id" + }) + +class DocumentCreateViewTestCase(BaseTestCase): + + def test_submit_without_file(self): + response = self.client.post("/api/v1/", data={ + "options": ujson.dumps(["pdf"]) + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "file field is required" + }) + + def test_submit_invalid_mimetype(self): + response = self.submit_file("/bin/sh", { + "formats": ["pdf"], + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "Not supported mimetype: 'application/x-sharedlib'" + }) + + def test_submit_empty_formats(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": [] + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "Invalid 'formats' value" + }) + + def test_submit_invalid_formats(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["csv"] + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "'application/vnd.openxmlformats-offi" + "cedocument.wordprocessingml.document'" + " mimetype can't be converted to 'csv'" + }) + + def test_submit_invalid_thumbnails_field(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["pdf"], + "thumbnails": 1, + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "Invalid 'thumbnails' value" + }) + + def test_submit_invalid_thumbnails_size_field(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["pdf"], + "thumbnails": { + "size": None, + }, + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "Invalid 'size' value" + }) + + def test_submit_invalid_thumbnails_size_field_value(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["pdf"], + "thumbnails": { + "size": "ZZx43", + }, + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 400) + self.assertEqual(json, { + "message": "Invalid 'size' value" + }) + + def test_submit_valid_thumbnails(self): + filename = os.path.join(self.samples, "sample.docx") + response = self.submit_file(filename, { + "formats": ["pdf"], + "thumbnails": { + "size": "640x480", + }, + }) + json = ujson.loads(response.data) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.get("status"), "queued") diff --git a/docsbox-master/docsbox/docs/utils.py b/docsbox-master/docsbox/docs/utils.py new file mode 100644 index 000000000..94aebf015 --- /dev/null +++ b/docsbox-master/docsbox/docs/utils.py @@ -0,0 +1,40 @@ +import os +import zipfile + +from wand.image import Image + +from docsbox import app + + +def make_zip_archive(uuid, tmp_dir): + """ + Creates ZIP archive from given @tmp_dir. + """ + zipname = "{0}.zip".format(uuid) + result_path = os.path.join(app.config["MEDIA_PATH"], + zipname) + result_url = os.path.join(app.config["MEDIA_URL"], + zipname) + with zipfile.ZipFile(result_path, "w") as output: + for dirname, subdirs, files in os.walk(tmp_dir): + for filename in files: + path = os.path.join(dirname, filename) + output.write(path, path.split(tmp_dir)[1]) + return result_path, result_url + + +def make_thumbnails(image, tmp_dir, size): + thumbnails_folder = os.path.join(tmp_dir, "thumbnails/") + os.mkdir(thumbnails_folder) + (width, height) = size + for index, page in enumerate(image.sequence): + with Image(page) as page: + filename = os.path.join(thumbnails_folder, "{0}.png".format(index)) + page.resize(width, height) + if app.config["THUMBNAILS_QUANTIZE"]: + page.quantize(app.config["THUMBNAILS_QUANTIZE_COLORS"], + app.config["THUMBNAILS_QUANTIZE_COLORSPACE"], 0, True, True) + page.save(filename=filename) + else: + image.close() + return index diff --git a/docsbox-master/docsbox/docs/views.py b/docsbox-master/docsbox/docs/views.py new file mode 100644 index 000000000..87bbca0db --- /dev/null +++ b/docsbox-master/docsbox/docs/views.py @@ -0,0 +1,93 @@ +import ujson +import datetime + +from magic import Magic +from tempfile import NamedTemporaryFile + +from flask import request +from flask_restful import Resource, abort + +from docsbox import app, rq +from docsbox.docs.tasks import remove_file, process_document + + +class DocumentView(Resource): + + def get(self, task_id): + """ + Returns information about task status. + """ + queue = rq.get_queue() + task = queue.fetch_job(task_id) + if task: + return { + "id": task.id, + "status": task.status, + "result_url": task.result + } + else: + return abort(404, message="Unknown task_id") + + +class DocumentCreateView(Resource): + + def post(self): + """ + Recieves file and options, checks file mimetype, + validates options and creates converting task + """ + if "file" not in request.files: + return abort(400, message="file field is required") + else: + with NamedTemporaryFile(delete=False, prefix=app.config["MEDIA_PATH"]) as tmp_file: + request.files["file"].save(tmp_file) + tmp_file.flush() + tmp_file.close() + remove_file.schedule( + datetime.timedelta(seconds=app.config["ORIGINAL_FILE_TTL"]) + , tmp_file.name) + with Magic() as magic: # detect mimetype + mimetype = magic.from_file(tmp_file.name) + if mimetype not in app.config["SUPPORTED_MIMETYPES"]: + return abort(400, message="Not supported mimetype: '{0}'".format(mimetype)) + options = request.form.get("options", None) + if options: # options validation + options = ujson.loads(options) + formats = options.get("formats", None) + if not isinstance(formats, list) or not formats: + return abort(400, message="Invalid 'formats' value") + else: + for fmt in formats: + supported = (fmt in app.config["SUPPORTED_MIMETYPES"][mimetype]["formats"]) + if not supported: + message = "'{0}' mimetype can't be converted to '{1}'" + return abort(400, message=message.format(mimetype, fmt)) + thumbnails = options.get("thumbnails", None) + if thumbnails: + if not isinstance(thumbnails, dict): + return abort(400, message="Invalid 'thumbnails' value") + else: + thumbnails_size = thumbnails.get("size", None) + if not isinstance(thumbnails_size, str) or not thumbnails_size: + return abort(400, message="Invalid 'size' value") + else: + try: + (width, height) = map(int, thumbnails_size.split("x")) + except ValueError: + return abort(400, message="Invalid 'size' value") + else: + options["thumbnails"]["size"] = (width, height) + else: + if mimetype == "application/pdf": + options = { + "formats": ["html"] + } + else: + options = app.config["DEFAULT_OPTIONS"] + task = process_document.queue(tmp_file.name, options, { + "mimetype": mimetype, + }) + return { + "id": task.id, + "status": task.status, + } diff --git a/docsbox-master/docsbox/requirements.txt b/docsbox-master/docsbox/requirements.txt new file mode 100644 index 000000000..4b04efc50 --- /dev/null +++ b/docsbox-master/docsbox/requirements.txt @@ -0,0 +1,14 @@ +#git+https://github.com/nvie/rq.git#egg=rq +#git+https://github.com/nvie/rq.git#egg=rq +#rq +rq-scheduler==0.7.0 +Flask==0.11.1 +Flask-RESTful==0.3.5 +Flask-RQ2==16.0.2 +flask-env-settings==0.1.0 +gunicorn==19.6.0 +pylokit==0.8.1 +python-libmagic==0.4.0 +wand==0.4.3 +ujson==1.35 +nose==1.3.7 diff --git a/docsbox-master/docsbox/settings.py b/docsbox-master/docsbox/settings.py new file mode 100644 index 000000000..a66b45248 --- /dev/null +++ b/docsbox-master/docsbox/settings.py @@ -0,0 +1,98 @@ +import os + +REDIS_URL = os.environ.get("REDIS_URL", "redis://redis:6379/0") +RQ_REDIS_URL = REDIS_URL + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +MEDIA_PATH = os.path.join(BASE_DIR, "media/") +MEDIA_URL = "/media/" + +SUPPORTED_FORMATS = { + "pdf": { + "path": "pdf", + "fmt": "pdf", + }, + "txt": { + "path": "txt", + "fmt": "txt", + }, + "html": { + "path": "html", + "fmt": "html", + }, + "csv": { + "path": "csv", + "fmt": "csv", + } +} + +DOCUMENT_EXPORT_FORMATS = ["pdf", "txt", "html"] +SPREADSHEET_EXPORT_FORMATS = ["pdf", "csv", "html"] +PRESENTATION_EXPORT_FORMATS = ["pdf", "html"] +PDF_EXPORT_FORMATS = ["html"] + +SUPPORTED_MIMETYPES = { + # Microsoft Word 2003 + "application/msword": { + "formats": DOCUMENT_EXPORT_FORMATS, + }, + + # Microsoft Word 2007 + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { + "formats": DOCUMENT_EXPORT_FORMATS, + }, + + # LibreOffice Writer + "application/vnd.oasis.opendocument.text": { + "formats": DOCUMENT_EXPORT_FORMATS, + }, + + # Portable Document Format + "application/pdf": { + "formats": PDF_EXPORT_FORMATS, + }, + +# Portable Document Format + "application/octet-stream": { + "formats": DOCUMENT_EXPORT_FORMATS, + }, + + # Rich Text Format + "text/rtf": { + "formats": DOCUMENT_EXPORT_FORMATS, + }, + + # Microsoft Excel 2003 + "application/vnd.ms-excel": { + "formats": SPREADSHEET_EXPORT_FORMATS, + }, + + # Microsoft Excel 2007 + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { + "formats": SPREADSHEET_EXPORT_FORMATS, + }, + + # LibreOffice Calc + "application/vnd.oasis.opendocument.spreadsheet": { + "formats": SPREADSHEET_EXPORT_FORMATS, + }, + + # Microsoft Powerpoint 2003 + "application/vnd.ms-powerpoint": { + "formats": PRESENTATION_EXPORT_FORMATS, + }, + + # Microsoft Powerpoint 2007 + "application/vnd.openxmlformats-officedocument.presentationml.presentation": { + "formats": PRESENTATION_EXPORT_FORMATS, + }, + + # LibreOffice Impress + "application/vnd.oasis.opendocument.presentation": { + "formats": PRESENTATION_EXPORT_FORMATS, + }, +} + +DEFAULT_OPTIONS = { + "formats": ["pdf"] +} diff --git a/docsbox-master/nginx/Dockerfile b/docsbox-master/nginx/Dockerfile new file mode 100644 index 000000000..2a996964e --- /dev/null +++ b/docsbox-master/nginx/Dockerfile @@ -0,0 +1,3 @@ +FROM tutum/nginx +RUN rm /etc/nginx/sites-enabled/default +ADD sites-enabled/ /etc/nginx/sites-enabled diff --git a/docsbox-master/nginx/sites-enabled/docsbox b/docsbox-master/nginx/sites-enabled/docsbox new file mode 100644 index 000000000..6b0ddf60b --- /dev/null +++ b/docsbox-master/nginx/sites-enabled/docsbox @@ -0,0 +1,20 @@ +server { + + listen 80; + + client_max_body_size 10m; + + charset utf-8; + + location /media { + alias /home/docsbox/media; + } + + location / { + proxy_pass http://web:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + +} diff --git a/elastic-config/elasticsearch-custom.yml b/elastic-config/elasticsearch-custom.yml new file mode 100644 index 000000000..62c2ff915 --- /dev/null +++ b/elastic-config/elasticsearch-custom.yml @@ -0,0 +1,3 @@ +transport.host: 0.0.0.0 +network.host: 0.0.0.0 +xpack.security.enabled: false \ No newline at end of file