From 09d14d7dd3bbdf7dbf97f97487d125e327693237 Mon Sep 17 00:00:00 2001 From: lazaro Date: Mon, 24 Feb 2020 13:16:25 +0000 Subject: [PATCH 01/11] serialized objects and inicialized routes --- .../src/app/components/example.component.ts | 2 +- frontend/src/app/components/example.ts | 3 +-- frontend/src/app/service/example.service.ts | 6 ++--- src/Models/DataObject/v0_0_2/Approximate.py | 13 +++++++--- src/Models/DataObject/v0_0_2/DataObject.py | 19 +++++++++----- src/Models/DataObject/v0_0_2/Instant.py | 13 +++++++--- src/Models/DataObject/v0_0_2/Interval.py | 13 +++++++--- src/Models/DataObject/v0_0_2/PersonName.py | 13 +++++++--- src/Models/DataObject/v0_0_2/RegexString.py | 12 ++++++--- src/Models/DataObject/v0_0_2/String.py | 12 ++++++--- src/Routes/routes.py | 25 ++++++++++++------- 11 files changed, 86 insertions(+), 45 deletions(-) diff --git a/frontend/src/app/components/example.component.ts b/frontend/src/app/components/example.component.ts index fddc22aaf..c8b955b39 100644 --- a/frontend/src/app/components/example.component.ts +++ b/frontend/src/app/components/example.component.ts @@ -17,7 +17,7 @@ export class ExampleComponent { constructor(private exampleService: ExampleService) {} onSubmit(): void { - const dataExample: Example = {type: this.register.value.type, title: this.register.value.title} as Example; + const dataExample: Example = {id: 3443 } as Example; this.exampleService .sendExample(dataExample) .subscribe(result => console.log(result)); diff --git a/frontend/src/app/components/example.ts b/frontend/src/app/components/example.ts index 944c03b0c..9fa4b1a54 100644 --- a/frontend/src/app/components/example.ts +++ b/frontend/src/app/components/example.ts @@ -1,4 +1,3 @@ export interface Example { - title: string; - type: string; + id: number; } diff --git a/frontend/src/app/service/example.service.ts b/frontend/src/app/service/example.service.ts index 821e02edd..b08a89c0d 100644 --- a/frontend/src/app/service/example.service.ts +++ b/frontend/src/app/service/example.service.ts @@ -18,13 +18,13 @@ const httpOptions = { providedIn: 'root' }) export class ExampleService { - Url = 'http://localhost:3000/'; // URL to public api + Url = 'http://localhost:7474/create'; // URL to public api private handleError: HandleError; constructor(private http: HttpClient) { } - sendExample(example: Example): Observable { - return this.http.post(this.Url, example, httpOptions); + sendExample(id: Example): Observable { + return this.http.get(this.Url, httpOptions); } } diff --git a/src/Models/DataObject/v0_0_2/Approximate.py b/src/Models/DataObject/v0_0_2/Approximate.py index 813a870ae..be994d539 100644 --- a/src/Models/DataObject/v0_0_2/Approximate.py +++ b/src/Models/DataObject/v0_0_2/Approximate.py @@ -1,3 +1,5 @@ +import json + from marshmallow import Schema, fields from neomodel import DateTimeProperty from src.Models.DataObject.v0_0_2.Date import Date @@ -6,12 +8,15 @@ class Approximate(Date): approximateDateValue = DateTimeProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class ApproximateSchema(Schema): approximateDateValue = fields.Date() -approximate = Approximate() -approximate_schema = ApproximateSchema() - -approximate_schema.dump(approximate) +def getSchema(): + approximate = Approximate() + approximate_schema = ApproximateSchema() + approximate_schema.dump(approximate) diff --git a/src/Models/DataObject/v0_0_2/DataObject.py b/src/Models/DataObject/v0_0_2/DataObject.py index ce0a4f932..a9fbc3258 100644 --- a/src/Models/DataObject/v0_0_2/DataObject.py +++ b/src/Models/DataObject/v0_0_2/DataObject.py @@ -1,18 +1,25 @@ +import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema -from neomodel import StringProperty, StructuredNode +from neomodel import StringProperty, StructuredNode, UniqueIdProperty class DataObject(StructuredNode): + uid = UniqueIdProperty() name = StringProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class DataObjectSchema(Schema): + uid = fields.String() name = fields.String() -data_object_schema = DataObjectSchema() - -json_schema = JSONSchema() -json_schema.dump(data_object_schema) -# print(json_schema.dump(data_object_schema)) +def getSchema(): + data_object_schema = DataObjectSchema() + json_schema = JSONSchema() + json_schema.dump(data_object_schema) + # print(json_schema.dump(data_object_schema)) diff --git a/src/Models/DataObject/v0_0_2/Instant.py b/src/Models/DataObject/v0_0_2/Instant.py index b51ecc8a4..fb40c4339 100644 --- a/src/Models/DataObject/v0_0_2/Instant.py +++ b/src/Models/DataObject/v0_0_2/Instant.py @@ -1,3 +1,5 @@ +import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import DateTimeProperty @@ -7,12 +9,15 @@ class Instant(Date): timestamp = DateTimeProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class InstantSchema(Schema): timestamp = fields.Date() -instant_schema = InstantSchema() - -json_schema = JSONSchema() -json_schema.dump(instant_schema) +def getSchema(): + instant_schema = InstantSchema() + json_schema = JSONSchema() + json_schema.dump(instant_schema) diff --git a/src/Models/DataObject/v0_0_2/Interval.py b/src/Models/DataObject/v0_0_2/Interval.py index e6bd16ffe..5c9e6fba4 100644 --- a/src/Models/DataObject/v0_0_2/Interval.py +++ b/src/Models/DataObject/v0_0_2/Interval.py @@ -1,3 +1,5 @@ +import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import DateTimeProperty @@ -8,13 +10,16 @@ class Interval(Date): startDateValue = DateTimeProperty(unique_index=True, required=True) endDateValue = DateTimeProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class IntervalSchema(Schema): startDateValue = fields.Date() endDateValue = fields.Date() -interval_schema = IntervalSchema() - -json_schema = JSONSchema() -json_schema.dump(interval_schema) +def getSchema(): + interval_schema = IntervalSchema() + json_schema = JSONSchema() + json_schema.dump(interval_schema) diff --git a/src/Models/DataObject/v0_0_2/PersonName.py b/src/Models/DataObject/v0_0_2/PersonName.py index df09870e8..8ccad7ad9 100644 --- a/src/Models/DataObject/v0_0_2/PersonName.py +++ b/src/Models/DataObject/v0_0_2/PersonName.py @@ -1,18 +1,23 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty +import json + from src.Models.DataObject.v0_0_2.AuthorityString import AuthorityString class PersonName(AuthorityString): name = StringProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class PersonNameSchema(Schema): name = fields.String() -person_name_schema = PersonNameSchema() - -json_schema = JSONSchema() -json_schema.dump(person_name_schema) +def getSchema(): + person_name_schema = PersonNameSchema() + json_schema = JSONSchema() + json_schema.dump(person_name_schema) diff --git a/src/Models/DataObject/v0_0_2/RegexString.py b/src/Models/DataObject/v0_0_2/RegexString.py index 763dbaf91..ae9c852cb 100644 --- a/src/Models/DataObject/v0_0_2/RegexString.py +++ b/src/Models/DataObject/v0_0_2/RegexString.py @@ -1,3 +1,4 @@ +import json from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import RegexProperty @@ -7,12 +8,15 @@ class RegexString(String): hasRegex = RegexProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class RegexStringSchema(Schema): hasRegex = fields.String() -regex_string_schema = RegexStringSchema() - -json_schema = JSONSchema() -json_schema.dump(regex_string_schema) +def getSchema(): + regex_string_schema = RegexStringSchema() + json_schema = JSONSchema() + json_schema.dump(regex_string_schema) diff --git a/src/Models/DataObject/v0_0_2/String.py b/src/Models/DataObject/v0_0_2/String.py index f4bd16a6d..eeea9a609 100644 --- a/src/Models/DataObject/v0_0_2/String.py +++ b/src/Models/DataObject/v0_0_2/String.py @@ -1,18 +1,22 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty +import json from src.Models.DataObject.v0_0_2.DataObject import DataObject class String(DataObject): stringValue = StringProperty(unique_index=True, required=True) + def toJSON(self): + return json.dumps(self, default=lambda o: o.__dict__) + class StringSchema(Schema): stringValue = fields.String() -string_schema = StringSchema() - -json_schema = JSONSchema() -json_schema.dump(string_schema) +def getSchema(): + string_schema = StringSchema() + json_schema = JSONSchema() + return json_schema.dump(string_schema) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index 473085afb..c25a7b1b6 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -1,8 +1,20 @@ -from flask import Flask +from json import dumps +from flask import Flask, g, Response, request +from neomodel import (config) +from marshmallow_jsonschema import JSONSchema -app = Flask( - __name__, static_url_path="", static_folder="public", template_folder="src/Views" -) + +from src.Models.DataObject.v0_0_2.String import String +config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' + + +app = Flask(__name__, static_url_path="") + + +@app.route("/", methods=['GET']) +def view(uid): + returned_string = String.nodes.get(uid=uid) + return Response(dumps(returned_string.toJSON()), mimetype='application/json') @app.route("/create") @@ -20,10 +32,5 @@ def delete(uid): return "delete %s" % uid -@app.route("/") -def view(uid): - return "view %s" % uid - - if __name__ == "__main__": app.run() From 32c17679debcf14d24ac5248fdf22bf4b3e642b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Mon, 24 Feb 2020 13:25:10 +0000 Subject: [PATCH 02/11] add credentials --- src/Routes/routes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index c25a7b1b6..39f58f522 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -6,8 +6,6 @@ from src.Models.DataObject.v0_0_2.String import String config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' - - app = Flask(__name__, static_url_path="") From 9b8f5416e9ad8e91e7c98132cd51d61a3b5e0fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Mon, 24 Feb 2020 13:31:55 +0000 Subject: [PATCH 03/11] add credentials --- src/Routes/routes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index 39f58f522..9a4945050 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -2,8 +2,6 @@ from flask import Flask, g, Response, request from neomodel import (config) from marshmallow_jsonschema import JSONSchema - - from src.Models.DataObject.v0_0_2.String import String config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' app = Flask(__name__, static_url_path="") From 5b2e3e442769afc05d43e0ec0ede7128d771b15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rocha=20da=20Silva?= Date: Tue, 25 Feb 2020 16:08:32 +0000 Subject: [PATCH 04/11] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2bdeb547e..845425df9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # archgraph -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f3070810a6f946de93967d5a78acbfc0)](https://app.codacy.com/manual/feup-infolab/archgraph?utm_source=github.com&utm_medium=referral&utm_content=feup-infolab/archgraph&utm_campaign=Badge_Grade_Dashboard) [![Build Status](https://travis-ci.com/feup-infolab/archgraph.svg?branch=master)](https://travis-ci.com/feup-infolab/archgraph) [![Coverage Status](https://coveralls.io/repos/github/feup-infolab/archgraph/badge.svg?branch=master)](https://coveralls.io/github/feup-infolab/archgraph?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f3070810a6f946de93967d5a78acbfc0)](https://app.codacy.com/manual/feup-infolab/archgraph?utm_source=github.com&utm_medium=referral&utm_content=feup-infolab/archgraph&utm_campaign=Badge_Grade_Dashboard) @@ -43,4 +42,4 @@ The setup should automatically detect your operating system (Mac or Linux) and r ./conf/run.sh ``` -To exit, press Ctrl+C, and both the API server and the frontend server should be terminated. \ No newline at end of file +To exit, press Ctrl+C, and both the API server and the frontend server should be terminated. From 278f6aa9e1fad0cc31a91a517c496a0956eabe63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Tue, 25 Feb 2020 19:53:03 +0000 Subject: [PATCH 05/11] get object schema by routes --- src/Models/DataObject/v0_0_2/Approximate.py | 14 +++++++++----- src/Models/DataObject/v0_0_2/DataObject.py | 13 +++++++------ src/Models/DataObject/v0_0_2/Instant.py | 12 +++++++----- src/Models/DataObject/v0_0_2/Interval.py | 14 ++++++++------ src/Models/DataObject/v0_0_2/PersonName.py | 12 +++++++----- src/Models/DataObject/v0_0_2/RegexString.py | 12 +++++++----- src/Models/DataObject/v0_0_2/String.py | 12 ++++++------ src/Routes/routes.py | 13 ++++++++++--- 8 files changed, 61 insertions(+), 41 deletions(-) diff --git a/src/Models/DataObject/v0_0_2/Approximate.py b/src/Models/DataObject/v0_0_2/Approximate.py index be994d539..7c674a5d1 100644 --- a/src/Models/DataObject/v0_0_2/Approximate.py +++ b/src/Models/DataObject/v0_0_2/Approximate.py @@ -1,6 +1,8 @@ import json from marshmallow import Schema, fields +from marshmallow_jsonschema import JSONSchema + from neomodel import DateTimeProperty from src.Models.DataObject.v0_0_2.Date import Date @@ -11,12 +13,14 @@ class Approximate(Date): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + approximate_schema = ApproximateSchema() + json_schema = JSONSchema() + return json_schema.dump(approximate_schema) + class ApproximateSchema(Schema): - approximateDateValue = fields.Date() + approximateDateValue = fields.Date(required=True) + -def getSchema(): - approximate = Approximate() - approximate_schema = ApproximateSchema() - approximate_schema.dump(approximate) diff --git a/src/Models/DataObject/v0_0_2/DataObject.py b/src/Models/DataObject/v0_0_2/DataObject.py index a9fbc3258..b871cb1de 100644 --- a/src/Models/DataObject/v0_0_2/DataObject.py +++ b/src/Models/DataObject/v0_0_2/DataObject.py @@ -12,14 +12,15 @@ class DataObject(StructuredNode): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + data_object_schema = DataObjectSchema() + json_schema = JSONSchema() + return json_schema.dump(data_object_schema) + class DataObjectSchema(Schema): uid = fields.String() - name = fields.String() + name = fields.String(required=True) + -def getSchema(): - data_object_schema = DataObjectSchema() - json_schema = JSONSchema() - json_schema.dump(data_object_schema) - # print(json_schema.dump(data_object_schema)) diff --git a/src/Models/DataObject/v0_0_2/Instant.py b/src/Models/DataObject/v0_0_2/Instant.py index fb40c4339..3fe3cc8b6 100644 --- a/src/Models/DataObject/v0_0_2/Instant.py +++ b/src/Models/DataObject/v0_0_2/Instant.py @@ -12,12 +12,14 @@ class Instant(Date): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + instant_schema = InstantSchema() + json_schema = JSONSchema() + return json_schema.dump(instant_schema) + class InstantSchema(Schema): - timestamp = fields.Date() + timestamp = fields.Date(required=True) + -def getSchema(): - instant_schema = InstantSchema() - json_schema = JSONSchema() - json_schema.dump(instant_schema) diff --git a/src/Models/DataObject/v0_0_2/Interval.py b/src/Models/DataObject/v0_0_2/Interval.py index 5c9e6fba4..3c6946e52 100644 --- a/src/Models/DataObject/v0_0_2/Interval.py +++ b/src/Models/DataObject/v0_0_2/Interval.py @@ -13,13 +13,15 @@ class Interval(Date): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + interval_schema = IntervalSchema() + json_schema = JSONSchema() + return json_schema.dump(interval_schema) + class IntervalSchema(Schema): - startDateValue = fields.Date() - endDateValue = fields.Date() + startDateValue = fields.Date(required=True) + endDateValue = fields.Date(required=True) + -def getSchema(): - interval_schema = IntervalSchema() - json_schema = JSONSchema() - json_schema.dump(interval_schema) diff --git a/src/Models/DataObject/v0_0_2/PersonName.py b/src/Models/DataObject/v0_0_2/PersonName.py index 8ccad7ad9..5b0756e51 100644 --- a/src/Models/DataObject/v0_0_2/PersonName.py +++ b/src/Models/DataObject/v0_0_2/PersonName.py @@ -12,12 +12,14 @@ class PersonName(AuthorityString): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + person_name_schema = PersonNameSchema() + json_schema = JSONSchema() + return json_schema.dump(person_name_schema) + class PersonNameSchema(Schema): - name = fields.String() + name = fields.String(required=True) + -def getSchema(): - person_name_schema = PersonNameSchema() - json_schema = JSONSchema() - json_schema.dump(person_name_schema) diff --git a/src/Models/DataObject/v0_0_2/RegexString.py b/src/Models/DataObject/v0_0_2/RegexString.py index ae9c852cb..9805316b5 100644 --- a/src/Models/DataObject/v0_0_2/RegexString.py +++ b/src/Models/DataObject/v0_0_2/RegexString.py @@ -11,12 +11,14 @@ class RegexString(String): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + regex_string_schema = RegexStringSchema() + json_schema = JSONSchema() + return json_schema.dump(regex_string_schema) + class RegexStringSchema(Schema): - hasRegex = fields.String() + hasRegex = fields.String(required=True) + -def getSchema(): - regex_string_schema = RegexStringSchema() - json_schema = JSONSchema() - json_schema.dump(regex_string_schema) diff --git a/src/Models/DataObject/v0_0_2/String.py b/src/Models/DataObject/v0_0_2/String.py index eeea9a609..b5a26d7b9 100644 --- a/src/Models/DataObject/v0_0_2/String.py +++ b/src/Models/DataObject/v0_0_2/String.py @@ -11,12 +11,12 @@ class String(DataObject): def toJSON(self): return json.dumps(self, default=lambda o: o.__dict__) + def getSchema(self): + string_schema = StringSchema() + json_schema = JSONSchema() + return json_schema.dump(string_schema) -class StringSchema(Schema): - stringValue = fields.String() +class StringSchema(Schema): + stringValue = fields.String(required=True) -def getSchema(): - string_schema = StringSchema() - json_schema = JSONSchema() - return json_schema.dump(string_schema) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index 9a4945050..f880f6fb3 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -1,7 +1,6 @@ from json import dumps -from flask import Flask, g, Response, request +from flask import Flask, g, Response, request, jsonify from neomodel import (config) -from marshmallow_jsonschema import JSONSchema from src.Models.DataObject.v0_0_2.String import String config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' app = Flask(__name__, static_url_path="") @@ -10,7 +9,15 @@ @app.route("/", methods=['GET']) def view(uid): returned_string = String.nodes.get(uid=uid) - return Response(dumps(returned_string.toJSON()), mimetype='application/json') + return jsonify(returned_string.toJSON()) + # returned_string = String.nodes.get(uid=uid) + # return Response(dumps(returned_string.toJSON()), mimetype='application/json') + + +@app.route("/schema/", methods=['GET']) +def getSchema(uid): + returned_string = String.nodes.get(uid=uid) + return jsonify(returned_string.getSchema()) @app.route("/create") From 905fbbb97aca37a4d839f9fa10edde097b24db4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Sun, 1 Mar 2020 23:03:35 +0000 Subject: [PATCH 06/11] updated --- .../v5_0_2/NodeEntities/E18_Physical_Thing.py | 2 ++ src/Models/DataObject/v0_0_2/Approximate.py | 4 ---- src/Models/DataObject/v0_0_2/DataObject.py | 3 --- src/Models/DataObject/v0_0_2/Instant.py | 3 --- src/Models/DataObject/v0_0_2/Interval.py | 3 --- src/Models/DataObject/v0_0_2/PersonName.py | 7 ++----- src/Models/DataObject/v0_0_2/RegexString.py | 4 +--- src/Routes/routes.py | 16 +++++++++------- test/Unit/test_data_object.py | 4 +--- 9 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/Models/CRM/v5_0_2/NodeEntities/E18_Physical_Thing.py b/src/Models/CRM/v5_0_2/NodeEntities/E18_Physical_Thing.py index 875b58a82..190f9a4b8 100644 --- a/src/Models/CRM/v5_0_2/NodeEntities/E18_Physical_Thing.py +++ b/src/Models/CRM/v5_0_2/NodeEntities/E18_Physical_Thing.py @@ -1,4 +1,5 @@ from neomodel import RelationshipFrom, RelationshipTo, StructuredRel +from src.GCF.decorators.OntologyClass import ontology_class from src.Models.CRM.v5_0_2.NodeEntities.E6_Destruction import E6_Destruction from src.Models.CRM.v5_0_2.NodeEntities.E72_Legal_Object import \ E72_Legal_Object @@ -19,6 +20,7 @@ class P13_destroyed(StructuredRel): pass +@ontology_class class E18_Physical_Thing(E72_Legal_Object): is_composed_of = RelationshipTo( ".E18_Physical_Thing.E18_Physical_Thing", diff --git a/src/Models/DataObject/v0_0_2/Approximate.py b/src/Models/DataObject/v0_0_2/Approximate.py index 7c674a5d1..7fcc15524 100644 --- a/src/Models/DataObject/v0_0_2/Approximate.py +++ b/src/Models/DataObject/v0_0_2/Approximate.py @@ -2,7 +2,6 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema - from neomodel import DateTimeProperty from src.Models.DataObject.v0_0_2.Date import Date @@ -21,6 +20,3 @@ def getSchema(self): class ApproximateSchema(Schema): approximateDateValue = fields.Date(required=True) - - - diff --git a/src/Models/DataObject/v0_0_2/DataObject.py b/src/Models/DataObject/v0_0_2/DataObject.py index b871cb1de..f05615cd4 100644 --- a/src/Models/DataObject/v0_0_2/DataObject.py +++ b/src/Models/DataObject/v0_0_2/DataObject.py @@ -21,6 +21,3 @@ def getSchema(self): class DataObjectSchema(Schema): uid = fields.String() name = fields.String(required=True) - - - diff --git a/src/Models/DataObject/v0_0_2/Instant.py b/src/Models/DataObject/v0_0_2/Instant.py index 3fe3cc8b6..00c81537f 100644 --- a/src/Models/DataObject/v0_0_2/Instant.py +++ b/src/Models/DataObject/v0_0_2/Instant.py @@ -20,6 +20,3 @@ def getSchema(self): class InstantSchema(Schema): timestamp = fields.Date(required=True) - - - diff --git a/src/Models/DataObject/v0_0_2/Interval.py b/src/Models/DataObject/v0_0_2/Interval.py index 3c6946e52..43214900f 100644 --- a/src/Models/DataObject/v0_0_2/Interval.py +++ b/src/Models/DataObject/v0_0_2/Interval.py @@ -22,6 +22,3 @@ def getSchema(self): class IntervalSchema(Schema): startDateValue = fields.Date(required=True) endDateValue = fields.Date(required=True) - - - diff --git a/src/Models/DataObject/v0_0_2/PersonName.py b/src/Models/DataObject/v0_0_2/PersonName.py index 5b0756e51..2f37a28bf 100644 --- a/src/Models/DataObject/v0_0_2/PersonName.py +++ b/src/Models/DataObject/v0_0_2/PersonName.py @@ -1,8 +1,8 @@ +import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty -import json - from src.Models.DataObject.v0_0_2.AuthorityString import AuthorityString @@ -20,6 +20,3 @@ def getSchema(self): class PersonNameSchema(Schema): name = fields.String(required=True) - - - diff --git a/src/Models/DataObject/v0_0_2/RegexString.py b/src/Models/DataObject/v0_0_2/RegexString.py index 9805316b5..c6c5e4e09 100644 --- a/src/Models/DataObject/v0_0_2/RegexString.py +++ b/src/Models/DataObject/v0_0_2/RegexString.py @@ -1,4 +1,5 @@ import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import RegexProperty @@ -19,6 +20,3 @@ def getSchema(self): class RegexStringSchema(Schema): hasRegex = fields.String(required=True) - - - diff --git a/src/Routes/routes.py b/src/Routes/routes.py index f880f6fb3..90571869c 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -1,20 +1,22 @@ -from json import dumps -from flask import Flask, g, Response, request, jsonify -from neomodel import (config) +from flask import Flask, jsonify + +from neomodel import config from src.Models.DataObject.v0_0_2.String import String -config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' + +config.DATABASE_URL = "bolt://neo4j:password@localhost:7687" app = Flask(__name__, static_url_path="") -@app.route("/", methods=['GET']) +@app.route("/", methods=["GET"]) def view(uid): returned_string = String.nodes.get(uid=uid) return jsonify(returned_string.toJSON()) # returned_string = String.nodes.get(uid=uid) - # return Response(dumps(returned_string.toJSON()), mimetype='application/json') + # return Response(dumps(returned_string.toJSON()), + # mimetype='application/json') -@app.route("/schema/", methods=['GET']) +@app.route("/schema/", methods=["GET"]) def getSchema(uid): returned_string = String.nodes.get(uid=uid) return jsonify(returned_string.getSchema()) diff --git a/test/Unit/test_data_object.py b/test/Unit/test_data_object.py index b4dc08e59..5dd7be636 100644 --- a/test/Unit/test_data_object.py +++ b/test/Unit/test_data_object.py @@ -7,8 +7,6 @@ AttemptedCardinalityViolation) import json -from src.Utils.JsonEncoder import json_merge - config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' date = datetime.datetime.now().strftime("%H:%M:%S") @@ -23,5 +21,5 @@ def test_create_update_string_Node(self): returned_string.save() change_returned_string = String.nodes.get(name=date) self.assertAlmostEqual(string.id, returned_string.id) - self.assertAlmostEqual(change_returned_string.stringValue, new_name) + self.assertEqual(change_returned_string.stringValue, new_name) self.assertAlmostEqual(string.id, change_returned_string.id) From 447a6a350078e46396d3c176a720d595be506be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Sun, 1 Mar 2020 23:18:10 +0000 Subject: [PATCH 07/11] updated test --- src/Models/DataObject/v0_0_2/String.py | 4 ++-- test/Unit/test_data_object.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Models/DataObject/v0_0_2/String.py b/src/Models/DataObject/v0_0_2/String.py index b5a26d7b9..fe4dbb73c 100644 --- a/src/Models/DataObject/v0_0_2/String.py +++ b/src/Models/DataObject/v0_0_2/String.py @@ -1,7 +1,8 @@ +import json + from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty -import json from src.Models.DataObject.v0_0_2.DataObject import DataObject @@ -19,4 +20,3 @@ def getSchema(self): class StringSchema(Schema): stringValue = fields.String(required=True) - diff --git a/test/Unit/test_data_object.py b/test/Unit/test_data_object.py index 5dd7be636..285db73c0 100644 --- a/test/Unit/test_data_object.py +++ b/test/Unit/test_data_object.py @@ -8,13 +8,13 @@ import json config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' -date = datetime.datetime.now().strftime("%H:%M:%S") -string = String(name=date, stringValue="String_Value").save() class TestString(unittest.TestCase): def test_create_update_string_Node(self): + date = datetime.datetime.now().strftime("%H:%M:%S") + string = String(name=date, stringValue="String_Value").save() returned_string = String.nodes.get(name=date) new_name = "new_Name" returned_string.stringValue = new_name From d2d08181bce0dd40fb9cdaff291c65f7131ea1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rocha=20da=20Silva?= Date: Wed, 4 Mar 2020 13:34:46 +0000 Subject: [PATCH 08/11] Update install.sh --- conf/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/install.sh b/conf/install.sh index fa376e8fd..8c332cbc4 100755 --- a/conf/install.sh +++ b/conf/install.sh @@ -20,7 +20,7 @@ source "$HOME/.bash_profile" export PATH="$HOME/miniconda/bin":$PATH conda remove --quiet --name "$ENV_NAME" -y --all conda create --quiet -y -n "$ENV_NAME" python=3.7 anaconda -conda activate"$ENV_NAME" +conda activate "$ENV_NAME" conda init bash # install pip @@ -29,7 +29,7 @@ python get-pip.py # upgrade pip to latest version pip install --quiet --upgrade pip # (optional) install any requirements of your current app in this venv -pip install --quiet -r requirements.txt +pip install -r requirements.txt # Get location of python interpreter echo "Python interpreter is at: ---> $(which python) <---" From 21291faf79d22c5adfda3f6751e491b9b6f8cf7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Mon, 9 Mar 2020 12:24:34 +0000 Subject: [PATCH 09/11] code clean up --- frontend/package.json | 5 ++- .../src/app/components/example.component.html | 10 +++++ frontend/yarn.lock | 33 +++++++++++++++ src/Models/DataObject/v0_0_2/Approximate.py | 17 ++++---- src/Models/DataObject/v0_0_2/DataObject.py | 42 +++++++++++++------ src/Models/DataObject/v0_0_2/Instant.py | 13 ++---- src/Models/DataObject/v0_0_2/Interval.py | 20 ++++----- src/Models/DataObject/v0_0_2/PersonName.py | 17 ++++---- src/Models/DataObject/v0_0_2/RegexString.py | 18 ++++---- .../DataObject/v0_0_2/SerializeClass.py | 16 +++++++ src/Models/DataObject/v0_0_2/String.py | 25 ++++++----- src/Routes/routes.py | 8 +--- test/Unit/test_data_object.py | 5 ++- 13 files changed, 147 insertions(+), 82 deletions(-) create mode 100644 src/Models/DataObject/v0_0_2/SerializeClass.py diff --git a/frontend/package.json b/frontend/package.json index 4980d05db..f77262bed 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,6 +11,7 @@ }, "private": true, "dependencies": { + "@ajsf/material": "^0.1.3", "@angular/animations": "~9.0.0", "@angular/cdk": "~9.0.0-rc.10", "@angular/common": "~9.0.0", @@ -30,9 +31,9 @@ "@angular/cli": "~9.0.1", "@angular/compiler-cli": "~9.0.0", "@angular/language-service": "~9.0.0", - "@types/node": "^12.11.1", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", + "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", @@ -46,4 +47,4 @@ "tslint": "~5.18.0", "typescript": "~3.7.5" } -} \ No newline at end of file +} diff --git a/frontend/src/app/components/example.component.html b/frontend/src/app/components/example.component.html index 12ca76ca2..263e4d3d1 100644 --- a/frontend/src/app/components/example.component.html +++ b/frontend/src/app/components/example.component.html @@ -14,3 +14,13 @@ + + diff --git a/frontend/yarn.lock b/frontend/yarn.lock index b13f9f8c6..aeac3e56b 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,6 +2,24 @@ # yarn lockfile v1 +"@ajsf/core@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@ajsf/core/-/core-0.1.3.tgz#0c314142e5ec863ab4da1d1bbb56fd7df4aa26e0" + integrity sha512-fFJQMbtjWkMu10JGhUbdPUy2RXiXlHgBIc27AVBbRDa9/v621McHERsboscvCg7VbnI6pW4ZKXkCUnQLlM1mVA== + dependencies: + ajv "^6.10.0" + lodash-es "^4.17.15" + tslib "^1.9.0" + +"@ajsf/material@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@ajsf/material/-/material-0.1.3.tgz#fefbefa4e15b43caa1c2f78d7463a181ee71d952" + integrity sha512-HTTgBi5EhgAwpR1zqccK0lAj0HxEo8I/tvoU7OAyEYQwcGKq+QMAvKvuSRO0vTZq0ueqakeke2S7SfurWSQHUw== + dependencies: + "@ajsf/core" "^0.1.3" + lodash-es "^4.17.15" + tslib "^1.9.0" + "@angular-devkit/architect@0.900.1": version "0.900.1" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.900.1.tgz#60a39a388d1af24b64f01c16d852777e955d76da" @@ -1266,6 +1284,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -4921,6 +4949,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" diff --git a/src/Models/DataObject/v0_0_2/Approximate.py b/src/Models/DataObject/v0_0_2/Approximate.py index 7fcc15524..deba25f70 100644 --- a/src/Models/DataObject/v0_0_2/Approximate.py +++ b/src/Models/DataObject/v0_0_2/Approximate.py @@ -3,20 +3,17 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import DateTimeProperty + +from src.Models.DataObject.v0_0_2 import SerializeClass from src.Models.DataObject.v0_0_2.Date import Date -class Approximate(Date): - approximateDateValue = DateTimeProperty(unique_index=True, required=True) +class ApproximateSchema(Schema): + approximateDateValue = fields.Date(required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - def getSchema(self): - approximate_schema = ApproximateSchema() - json_schema = JSONSchema() - return json_schema.dump(approximate_schema) +class Approximate(Date): + super(SerializeClass).__init__(ApproximateSchema) + approximateDateValue = DateTimeProperty(unique_index=True, required=True) -class ApproximateSchema(Schema): - approximateDateValue = fields.Date(required=True) diff --git a/src/Models/DataObject/v0_0_2/DataObject.py b/src/Models/DataObject/v0_0_2/DataObject.py index f05615cd4..2b0ceb144 100644 --- a/src/Models/DataObject/v0_0_2/DataObject.py +++ b/src/Models/DataObject/v0_0_2/DataObject.py @@ -1,23 +1,39 @@ import json from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema -from neomodel import StringProperty, StructuredNode, UniqueIdProperty +from neomodel import StringProperty, StructuredNode, UniqueIdProperty, config +from src.Models.DataObject.v0_0_2.SerializeClass import SerializeClass -class DataObject(StructuredNode): - uid = UniqueIdProperty() - name = StringProperty(unique_index=True, required=True) - - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - - def getSchema(self): - data_object_schema = DataObjectSchema() - json_schema = JSONSchema() - return json_schema.dump(data_object_schema) +config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' +#from src.GCF.utils.db import clean_database +#clean_database() class DataObjectSchema(Schema): uid = fields.String() name = fields.String(required=True) + + +class DataObject(StructuredNode, SerializeClass, Schema): + name = StringProperty(unique_index=True, required=True) + uid = UniqueIdProperty() + + # def __init__(self, *args, **kwargs): + # super().__init__(*args, **kwargs) + # SerializeClass.__init__(self, schema=DataObjectSchema()) + # self.list.extend([self.uid, self.name]) + + def __init__(self, schema, *args, **kwargs): + super().__init__(*args, **kwargs) + SerializeClass.__init__(self, schema=DataObjectSchema()) + self.list.extend([self.uid, self.name]) + + +#ola =DataObject(name="ola").save() +# #ola.getSchema() +# print(ola.toJSON()) +# ola.nodes.get(name="ola") + + + diff --git a/src/Models/DataObject/v0_0_2/Instant.py b/src/Models/DataObject/v0_0_2/Instant.py index 00c81537f..0d0a78272 100644 --- a/src/Models/DataObject/v0_0_2/Instant.py +++ b/src/Models/DataObject/v0_0_2/Instant.py @@ -6,17 +6,12 @@ from src.Models.DataObject.v0_0_2.Date import Date +class InstantSchema(Schema): + timestamp = fields.Date(required=True) + + class Instant(Date): timestamp = DateTimeProperty(unique_index=True, required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - def getSchema(self): - instant_schema = InstantSchema() - json_schema = JSONSchema() - return json_schema.dump(instant_schema) - -class InstantSchema(Schema): - timestamp = fields.Date(required=True) diff --git a/src/Models/DataObject/v0_0_2/Interval.py b/src/Models/DataObject/v0_0_2/Interval.py index 43214900f..397020545 100644 --- a/src/Models/DataObject/v0_0_2/Interval.py +++ b/src/Models/DataObject/v0_0_2/Interval.py @@ -1,24 +1,20 @@ -import json - from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema from neomodel import DateTimeProperty + +from src.Models.DataObject.v0_0_2 import SerializeClass from src.Models.DataObject.v0_0_2.Date import Date +class IntervalSchema(Schema): + startDateValue = fields.Date(required=True) + endDateValue = fields.Date(required=True) + + class Interval(Date): + super(SerializeClass).__init__(IntervalSchema) startDateValue = DateTimeProperty(unique_index=True, required=True) endDateValue = DateTimeProperty(unique_index=True, required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - def getSchema(self): - interval_schema = IntervalSchema() - json_schema = JSONSchema() - return json_schema.dump(interval_schema) -class IntervalSchema(Schema): - startDateValue = fields.Date(required=True) - endDateValue = fields.Date(required=True) diff --git a/src/Models/DataObject/v0_0_2/PersonName.py b/src/Models/DataObject/v0_0_2/PersonName.py index 2f37a28bf..25dec98e3 100644 --- a/src/Models/DataObject/v0_0_2/PersonName.py +++ b/src/Models/DataObject/v0_0_2/PersonName.py @@ -3,20 +3,17 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty + +from src.Models.DataObject.v0_0_2 import SerializeClass from src.Models.DataObject.v0_0_2.AuthorityString import AuthorityString -class PersonName(AuthorityString): - name = StringProperty(unique_index=True, required=True) +class PersonNameSchema(Schema): + name = fields.String(required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - def getSchema(self): - person_name_schema = PersonNameSchema() - json_schema = JSONSchema() - return json_schema.dump(person_name_schema) +class PersonName(AuthorityString): + super(SerializeClass).__init__(PersonNameSchema) + name = StringProperty(unique_index=True, required=True) -class PersonNameSchema(Schema): - name = fields.String(required=True) diff --git a/src/Models/DataObject/v0_0_2/RegexString.py b/src/Models/DataObject/v0_0_2/RegexString.py index c6c5e4e09..9ca36cd5b 100644 --- a/src/Models/DataObject/v0_0_2/RegexString.py +++ b/src/Models/DataObject/v0_0_2/RegexString.py @@ -3,20 +3,20 @@ from marshmallow import Schema, fields from marshmallow_jsonschema import JSONSchema from neomodel import RegexProperty + +from src.Models.DataObject.v0_0_2 import SerializeClass from src.Models.DataObject.v0_0_2.String import String -class RegexString(String): +class RegexStringSchema(Schema): + hasRegex = fields.String(required=True) + + +class RegexString(String, SerializeClass): + super(SerializeClass).__init__(RegexStringSchema) hasRegex = RegexProperty(unique_index=True, required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - def getSchema(self): - regex_string_schema = RegexStringSchema() - json_schema = JSONSchema() - return json_schema.dump(regex_string_schema) -class RegexStringSchema(Schema): - hasRegex = fields.String(required=True) + diff --git a/src/Models/DataObject/v0_0_2/SerializeClass.py b/src/Models/DataObject/v0_0_2/SerializeClass.py new file mode 100644 index 000000000..6f071bbb4 --- /dev/null +++ b/src/Models/DataObject/v0_0_2/SerializeClass.py @@ -0,0 +1,16 @@ +import json +from marshmallow import Schema, fields +from marshmallow_jsonschema import JSONSchema + + +class SerializeClass: + def __init__(self, schema): + self.list = [] + self.schema = schema + + def getSchema(self): + json_schema = JSONSchema() + return json_schema.dump(self.schema) + + def toJSON(self): + return json.dumps(self.list, default=lambda o: o.__dict__) diff --git a/src/Models/DataObject/v0_0_2/String.py b/src/Models/DataObject/v0_0_2/String.py index fe4dbb73c..c6dfbf09c 100644 --- a/src/Models/DataObject/v0_0_2/String.py +++ b/src/Models/DataObject/v0_0_2/String.py @@ -1,22 +1,27 @@ import json from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema from neomodel import StringProperty from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.SerializeClass import SerializeClass +class StringSchema(Schema): + stringValue = fields.String(required=True) + + +# class String(DataObject): +# stringValue = StringProperty(unique_index=True, required=True) +# +# def __init__(self, *args, **kwargs): +# super().__init__(*args, **kwargs) +# self.list.append(self.stringValue) + class String(DataObject): stringValue = StringProperty(unique_index=True, required=True) - def toJSON(self): - return json.dumps(self, default=lambda o: o.__dict__) - - def getSchema(self): - string_schema = StringSchema() - json_schema = JSONSchema() - return json_schema.dump(string_schema) + def __init__(self, *args, **kwargs): + super().__init__(StringSchema(), *args, **kwargs) + self.list.append(self.stringValue) -class StringSchema(Schema): - stringValue = fields.String(required=True) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index 90571869c..d6fb0eccc 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -1,5 +1,4 @@ -from flask import Flask, jsonify - +from flask import Flask, jsonify, Response from neomodel import config from src.Models.DataObject.v0_0_2.String import String @@ -10,10 +9,7 @@ @app.route("/", methods=["GET"]) def view(uid): returned_string = String.nodes.get(uid=uid) - return jsonify(returned_string.toJSON()) - # returned_string = String.nodes.get(uid=uid) - # return Response(dumps(returned_string.toJSON()), - # mimetype='application/json') + return Response(returned_string.toJSON(), mimetype='application/json') @app.route("/schema/", methods=["GET"]) diff --git a/test/Unit/test_data_object.py b/test/Unit/test_data_object.py index 285db73c0..b121dfa1e 100644 --- a/test/Unit/test_data_object.py +++ b/test/Unit/test_data_object.py @@ -5,7 +5,8 @@ from neomodel import (config, OUTGOING, Traversal, DeflateError, AttemptedCardinalityViolation) -import json +from src.GCF.utils.db import clean_database +clean_database() config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' @@ -15,6 +16,8 @@ class TestString(unittest.TestCase): def test_create_update_string_Node(self): date = datetime.datetime.now().strftime("%H:%M:%S") string = String(name=date, stringValue="String_Value").save() + print(string.getSchema()) + print(string.toJSON()) returned_string = String.nodes.get(name=date) new_name = "new_Name" returned_string.stringValue = new_name From 0daacc37dfd1767cc8114fdd2f1430062b6ab5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Mon, 9 Mar 2020 15:02:25 +0000 Subject: [PATCH 10/11] dataObject modeling completed --- src/Models/DataObject/v0_0_2/Approximate.py | 26 ++++++++++----- src/Models/DataObject/v0_0_2/AuthorityFile.py | 13 +++++++- .../DataObject/v0_0_2/AuthorityString.py | 12 ++++++- src/Models/DataObject/v0_0_2/Boolean.py | 13 +++++++- src/Models/DataObject/v0_0_2/DataObject.py | 33 ++++++++----------- src/Models/DataObject/v0_0_2/Date.py | 13 +++++++- src/Models/DataObject/v0_0_2/Decimal.py | 13 +++++++- .../v0_0_2/GeospatialCoordinates.py | 13 +++++++- src/Models/DataObject/v0_0_2/Instant.py | 15 +++++---- src/Models/DataObject/v0_0_2/Integer.py | 13 +++++++- src/Models/DataObject/v0_0_2/Interval.py | 16 ++++----- src/Models/DataObject/v0_0_2/Latitude.py | 14 ++++++-- src/Models/DataObject/v0_0_2/Longitude.py | 14 ++++++-- src/Models/DataObject/v0_0_2/PersonName.py | 23 ++++++++----- src/Models/DataObject/v0_0_2/Polygon.py | 14 ++++++-- src/Models/DataObject/v0_0_2/RegexString.py | 27 ++++++++------- .../DataObject/v0_0_2/SerializeClass.py | 2 +- src/Models/DataObject/v0_0_2/String.py | 31 ++++++++--------- src/Routes/routes.py | 5 +-- 19 files changed, 217 insertions(+), 93 deletions(-) diff --git a/src/Models/DataObject/v0_0_2/Approximate.py b/src/Models/DataObject/v0_0_2/Approximate.py index deba25f70..829851714 100644 --- a/src/Models/DataObject/v0_0_2/Approximate.py +++ b/src/Models/DataObject/v0_0_2/Approximate.py @@ -1,19 +1,29 @@ -import json -from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema -from neomodel import DateTimeProperty +from marshmallow import fields +from neomodel import DateTimeProperty, config +from src.Models.DataObject.v0_0_2.Date import Date, DateSchema -from src.Models.DataObject.v0_0_2 import SerializeClass -from src.Models.DataObject.v0_0_2.Date import Date +config.DATABASE_URL = "bolt://neo4j:password@localhost:7687" -class ApproximateSchema(Schema): +class ApproximateSchema(DateSchema): approximateDateValue = fields.Date(required=True) class Approximate(Date): - super(SerializeClass).__init__(ApproximateSchema) approximateDateValue = DateTimeProperty(unique_index=True, required=True) + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = ApproximateSchema() + super().__init__(schema, *args, **kwargs) + self.list.append(self.approximateDateValue.__str__()) + + +# print(ApproximateSchema()) +# datetime_object = datetime.datetime(2020, 5, 17) +# print(datetime_object) +# a = Approximate(name="name", approximateDateValue=datetime_object, ).save() +# print(a.toJSON()) +# print(a.getSchema()) diff --git a/src/Models/DataObject/v0_0_2/AuthorityFile.py b/src/Models/DataObject/v0_0_2/AuthorityFile.py index 0ee88dc4a..26d86ea55 100644 --- a/src/Models/DataObject/v0_0_2/AuthorityFile.py +++ b/src/Models/DataObject/v0_0_2/AuthorityFile.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class AuthorityFileSchema(DataObjectSchema): + pass class AuthorityFile(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = AuthorityFileSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/AuthorityString.py b/src/Models/DataObject/v0_0_2/AuthorityString.py index 6c9d4b24f..eee346ac0 100644 --- a/src/Models/DataObject/v0_0_2/AuthorityString.py +++ b/src/Models/DataObject/v0_0_2/AuthorityString.py @@ -1,5 +1,15 @@ -from src.Models.DataObject.v0_0_2.String import String +from src.Models.DataObject.v0_0_2.String import String, StringSchema + + +class AuthorityStringSchema(StringSchema): + pass class AuthorityString(String): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = AuthorityStringSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/Boolean.py b/src/Models/DataObject/v0_0_2/Boolean.py index d6435c751..156726451 100644 --- a/src/Models/DataObject/v0_0_2/Boolean.py +++ b/src/Models/DataObject/v0_0_2/Boolean.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class BooleanSchema(DataObjectSchema): + pass class Boolean(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = BooleanSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/DataObject.py b/src/Models/DataObject/v0_0_2/DataObject.py index 2b0ceb144..b29ae7e49 100644 --- a/src/Models/DataObject/v0_0_2/DataObject.py +++ b/src/Models/DataObject/v0_0_2/DataObject.py @@ -1,13 +1,10 @@ -import json - from marshmallow import Schema, fields -from neomodel import StringProperty, StructuredNode, UniqueIdProperty, config - +from neomodel import StringProperty, StructuredNode, UniqueIdProperty from src.Models.DataObject.v0_0_2.SerializeClass import SerializeClass -config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' -#from src.GCF.utils.db import clean_database -#clean_database() +# config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' +# from src.GCF.utils.db import clean_database +# clean_database() class DataObjectSchema(Schema): @@ -15,25 +12,21 @@ class DataObjectSchema(Schema): name = fields.String(required=True) -class DataObject(StructuredNode, SerializeClass, Schema): +class DataObject(StructuredNode, SerializeClass): name = StringProperty(unique_index=True, required=True) uid = UniqueIdProperty() - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - # SerializeClass.__init__(self, schema=DataObjectSchema()) - # self.list.extend([self.uid, self.name]) - - def __init__(self, schema, *args, **kwargs): + def __init__(self, schema=None, *args, **kwargs): super().__init__(*args, **kwargs) - SerializeClass.__init__(self, schema=DataObjectSchema()) + if schema is None: + schema = DataObjectSchema() + + SerializeClass.__init__(self, schema) + self.schema = schema self.list.extend([self.uid, self.name]) -#ola =DataObject(name="ola").save() -# #ola.getSchema() +# ola =DataObject(name="ola").save() +# ola.getSchema() # print(ola.toJSON()) # ola.nodes.get(name="ola") - - - diff --git a/src/Models/DataObject/v0_0_2/Date.py b/src/Models/DataObject/v0_0_2/Date.py index 73203b4c5..66ab6a6d3 100644 --- a/src/Models/DataObject/v0_0_2/Date.py +++ b/src/Models/DataObject/v0_0_2/Date.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class DateSchema(DataObjectSchema): + pass class Date(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = DateSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/Decimal.py b/src/Models/DataObject/v0_0_2/Decimal.py index e036f2a61..2004caa30 100644 --- a/src/Models/DataObject/v0_0_2/Decimal.py +++ b/src/Models/DataObject/v0_0_2/Decimal.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class DecimalSchema(DataObjectSchema): + pass class Decimal(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = DecimalSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/GeospatialCoordinates.py b/src/Models/DataObject/v0_0_2/GeospatialCoordinates.py index 30cd1d2fd..fb8d26f67 100644 --- a/src/Models/DataObject/v0_0_2/GeospatialCoordinates.py +++ b/src/Models/DataObject/v0_0_2/GeospatialCoordinates.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class GeospatialCoordinatesSchema(DataObjectSchema): + pass class GeospatialCoordinates(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = GeospatialCoordinatesSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/Instant.py b/src/Models/DataObject/v0_0_2/Instant.py index 0d0a78272..24af3b872 100644 --- a/src/Models/DataObject/v0_0_2/Instant.py +++ b/src/Models/DataObject/v0_0_2/Instant.py @@ -1,17 +1,18 @@ -import json - -from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema +from marshmallow import fields from neomodel import DateTimeProperty -from src.Models.DataObject.v0_0_2.Date import Date +from src.Models.DataObject.v0_0_2.Date import Date, DateSchema -class InstantSchema(Schema): +class InstantSchema(DateSchema): timestamp = fields.Date(required=True) class Instant(Date): timestamp = DateTimeProperty(unique_index=True, required=True) + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = InstantSchema() - + super().__init__(schema, *args, **kwargs) + self.list.append(self.timestamp) diff --git a/src/Models/DataObject/v0_0_2/Integer.py b/src/Models/DataObject/v0_0_2/Integer.py index 9547c76e2..77fe3c2e7 100644 --- a/src/Models/DataObject/v0_0_2/Integer.py +++ b/src/Models/DataObject/v0_0_2/Integer.py @@ -1,5 +1,16 @@ -from src.Models.DataObject.v0_0_2.DataObject import DataObject +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) + + +class IntegerSchema(DataObjectSchema): + pass class Integer(DataObject): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = IntegerSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/Interval.py b/src/Models/DataObject/v0_0_2/Interval.py index 397020545..06bcb0e3a 100644 --- a/src/Models/DataObject/v0_0_2/Interval.py +++ b/src/Models/DataObject/v0_0_2/Interval.py @@ -1,20 +1,20 @@ -from marshmallow import Schema, fields +from marshmallow import fields from neomodel import DateTimeProperty +from src.Models.DataObject.v0_0_2.Date import Date, DateSchema -from src.Models.DataObject.v0_0_2 import SerializeClass -from src.Models.DataObject.v0_0_2.Date import Date - -class IntervalSchema(Schema): +class IntervalSchema(DateSchema): startDateValue = fields.Date(required=True) endDateValue = fields.Date(required=True) class Interval(Date): - super(SerializeClass).__init__(IntervalSchema) startDateValue = DateTimeProperty(unique_index=True, required=True) endDateValue = DateTimeProperty(unique_index=True, required=True) + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = IntervalSchema() - - + super().__init__(schema, *args, **kwargs) + self.list.extend([self.startDateValue, self.startDateValue]) diff --git a/src/Models/DataObject/v0_0_2/Latitude.py b/src/Models/DataObject/v0_0_2/Latitude.py index 504a1b333..dba69bf74 100644 --- a/src/Models/DataObject/v0_0_2/Latitude.py +++ b/src/Models/DataObject/v0_0_2/Latitude.py @@ -1,6 +1,16 @@ -from src.Models.DataObject.v0_0_2.GeospatialCoordinates import \ - GeospatialCoordinates +from src.Models.DataObject.v0_0_2.GeospatialCoordinates import ( + GeospatialCoordinates, GeospatialCoordinatesSchema) + + +class LatitudeSchema(GeospatialCoordinatesSchema): + pass class Latitude(GeospatialCoordinates): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = LatitudeSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/Longitude.py b/src/Models/DataObject/v0_0_2/Longitude.py index 74e8f772a..7ab1034f1 100644 --- a/src/Models/DataObject/v0_0_2/Longitude.py +++ b/src/Models/DataObject/v0_0_2/Longitude.py @@ -1,6 +1,16 @@ -from src.Models.DataObject.v0_0_2.GeospatialCoordinates import \ - GeospatialCoordinates +from src.Models.DataObject.v0_0_2.GeospatialCoordinates import ( + GeospatialCoordinates, GeospatialCoordinatesSchema) + + +class LongitudeSchema(GeospatialCoordinatesSchema): + pass class Longitude(GeospatialCoordinates): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = LongitudeSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/PersonName.py b/src/Models/DataObject/v0_0_2/PersonName.py index 25dec98e3..4d7b3cc70 100644 --- a/src/Models/DataObject/v0_0_2/PersonName.py +++ b/src/Models/DataObject/v0_0_2/PersonName.py @@ -1,19 +1,26 @@ -import json - -from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema +from marshmallow import fields from neomodel import StringProperty - -from src.Models.DataObject.v0_0_2 import SerializeClass from src.Models.DataObject.v0_0_2.AuthorityString import AuthorityString +from src.Models.DataObject.v0_0_2.DataObject import DataObject + +#config.DATABASE_URL = "bolt://neo4j:password@localhost:7687" +# from src.GCF.utils.db import clean_database +# clean_database() -class PersonNameSchema(Schema): +class PersonNameSchema(DataObject): name = fields.String(required=True) class PersonName(AuthorityString): - super(SerializeClass).__init__(PersonNameSchema) name = StringProperty(unique_index=True, required=True) + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = PersonNameSchema() + + super().__init__(schema, *args, **kwargs) + self.list.append(self.name) + +#a = PersonName(name="new").save() diff --git a/src/Models/DataObject/v0_0_2/Polygon.py b/src/Models/DataObject/v0_0_2/Polygon.py index a71924af0..60b94dda5 100644 --- a/src/Models/DataObject/v0_0_2/Polygon.py +++ b/src/Models/DataObject/v0_0_2/Polygon.py @@ -1,6 +1,16 @@ -from src.Models.DataObject.v0_0_2.GeospatialCoordinates import \ - GeospatialCoordinates +from src.Models.DataObject.v0_0_2.GeospatialCoordinates import ( + GeospatialCoordinates, GeospatialCoordinatesSchema) + + +class PolygonSchema(GeospatialCoordinatesSchema): + pass class Polygon(GeospatialCoordinates): pass + + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = PolygonSchema() + + super().__init__(schema, *args, **kwargs) diff --git a/src/Models/DataObject/v0_0_2/RegexString.py b/src/Models/DataObject/v0_0_2/RegexString.py index 9ca36cd5b..ac826feb5 100644 --- a/src/Models/DataObject/v0_0_2/RegexString.py +++ b/src/Models/DataObject/v0_0_2/RegexString.py @@ -1,22 +1,27 @@ -import json - -from marshmallow import Schema, fields -from marshmallow_jsonschema import JSONSchema +from marshmallow import fields from neomodel import RegexProperty - -from src.Models.DataObject.v0_0_2 import SerializeClass +from src.Models.DataObject.v0_0_2.DataObject import DataObject from src.Models.DataObject.v0_0_2.String import String -class RegexStringSchema(Schema): +class RegexStringSchema(DataObject): hasRegex = fields.String(required=True) -class RegexString(String, SerializeClass): - super(SerializeClass).__init__(RegexStringSchema) - hasRegex = RegexProperty(unique_index=True, required=True) - +class RegexString(String): + def __init__(self, expression=None, schema=None, *args, **kwargs): + hasRegex = RegexProperty( + expression=expression, unique_index=True, required=True + ) + if schema is None: + schema = RegexStringSchema(hasRegex=expression) + super().__init__(schema, *args, **kwargs) + self.list.append(hasRegex) +# config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' +# a = RegexString(expression=r'dw', name="new", stringValue="ola").save() +# print(a.toJSON()) +# print(a.getSchema()) diff --git a/src/Models/DataObject/v0_0_2/SerializeClass.py b/src/Models/DataObject/v0_0_2/SerializeClass.py index 6f071bbb4..81011a226 100644 --- a/src/Models/DataObject/v0_0_2/SerializeClass.py +++ b/src/Models/DataObject/v0_0_2/SerializeClass.py @@ -1,5 +1,5 @@ import json -from marshmallow import Schema, fields + from marshmallow_jsonschema import JSONSchema diff --git a/src/Models/DataObject/v0_0_2/String.py b/src/Models/DataObject/v0_0_2/String.py index c6dfbf09c..560d103d6 100644 --- a/src/Models/DataObject/v0_0_2/String.py +++ b/src/Models/DataObject/v0_0_2/String.py @@ -1,27 +1,28 @@ -import json - -from marshmallow import Schema, fields +from marshmallow import fields from neomodel import StringProperty -from src.Models.DataObject.v0_0_2.DataObject import DataObject -from src.Models.DataObject.v0_0_2.SerializeClass import SerializeClass +from src.Models.DataObject.v0_0_2.DataObject import (DataObject, + DataObjectSchema) -class StringSchema(Schema): +class StringSchema(DataObjectSchema): stringValue = fields.String(required=True) -# class String(DataObject): -# stringValue = StringProperty(unique_index=True, required=True) -# -# def __init__(self, *args, **kwargs): -# super().__init__(*args, **kwargs) -# self.list.append(self.stringValue) - class String(DataObject): stringValue = StringProperty(unique_index=True, required=True) - def __init__(self, *args, **kwargs): - super().__init__(StringSchema(), *args, **kwargs) + def __init__(self, schema=None, *args, **kwargs): + if schema is None: + schema = StringSchema() + + super().__init__(schema, *args, **kwargs) self.list.append(self.stringValue) +# config.DATABASE_URL = 'bolt://neo4j:password@localhost:7687' +# +# a = String(name="new", stringValue="ola").save() +# print(a.toJSON()) +# print(a.getSchema()) + +# print(StringSchema()) diff --git a/src/Routes/routes.py b/src/Routes/routes.py index d6fb0eccc..3518fafee 100644 --- a/src/Routes/routes.py +++ b/src/Routes/routes.py @@ -1,4 +1,5 @@ -from flask import Flask, jsonify, Response +from flask import Flask, Response, jsonify + from neomodel import config from src.Models.DataObject.v0_0_2.String import String @@ -9,7 +10,7 @@ @app.route("/", methods=["GET"]) def view(uid): returned_string = String.nodes.get(uid=uid) - return Response(returned_string.toJSON(), mimetype='application/json') + return Response(returned_string.toJSON(), mimetype="application/json") @app.route("/schema/", methods=["GET"]) From 24a22f46a5937b3cc6abb69cedfaabee3d64126b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Costa?= Date: Fri, 13 Mar 2020 14:08:50 +0000 Subject: [PATCH 11/11] angular7-json-schema --- frontend/.editorconfig | 2 +- frontend/.gitignore | 39 + frontend/.travis.yml | 25 + frontend/LICENSE | 21 + frontend/README.md | 489 +- frontend/angular.json | 124 +- frontend/browserslist | 12 - frontend/docs/issue_template.md | 48 + frontend/e2e/protractor.conf.js | 8 +- frontend/e2e/src/app.e2e-spec.ts | 11 +- frontend/e2e/src/app.po.ts | 9 +- .../e2e/{tsconfig.json => tsconfig.e2e.json} | 4 +- frontend/package-lock.json | 11550 ++++++++++++++++ frontend/package.json | 109 +- .../angular7-json-schema-form}/karma.conf.js | 7 +- .../angular7-json-schema-form/ng-package.json | 8 + .../ng-package.prod.json | 7 + .../package-lock.json | 5 + .../angular7-json-schema-form/package.json | 37 + .../bootstrap-3-framework.component.ts | 316 + .../bootstrap-3-framework.module.ts | 24 + .../bootstrap-3.framework.ts | 25 + .../bootstrap-4-framework.component.ts | 312 + .../bootstrap-4-framework.module.ts | 22 + .../bootstrap-4.framework.ts | 23 + .../framework-library.service.ts | 82 + .../src/lib/framework-library/framework.ts | 10 + .../src/lib/framework-library/index.ts | 13 + .../flex-layout-root.component.ts | 52 + .../flex-layout-section.component.ts | 216 + .../material-design-framework/index.ts | 54 + .../material-add-reference.component.ts | 56 + .../material-button-group.component.ts | 69 + .../material-button.component.ts | 60 + .../material-checkbox.component.ts | 111 + .../material-checkboxes.component.ts | 109 + .../material-chip-list.component.ts | 35 + .../material-datepicker.component.ts | 98 + .../material-design-framework.component.ts | 167 + .../material-design-framework.module.ts | 61 + .../material-design.framework.ts | 73 + .../material-file.component.ts | 35 + .../material-input.component.ts | 91 + .../material-number.component.ts | 91 + .../material-one-of.component.ts | 35 + .../material-radios.component.ts | 90 + .../material-select.component.ts | 114 + .../material-slider.component.ts | 61 + .../material-stepper.component.ts | 35 + .../material-tabs.component.ts | 69 + .../material-textarea.component.ts | 84 + .../no-framework/no-framework.component.ts | 16 + .../no-framework/no-framework.module.ts | 22 + .../no-framework/no.framework.ts | 11 + .../src/lib/json-schema-form.component.ts | 746 + .../src/lib/json-schema-form.module.ts | 19 + .../src/lib/json-schema-form.service.ts | 681 + .../src/lib/locale/en-validation-messages.ts | 58 + .../src/lib/locale/fr-validation-messages.ts | 58 + .../convert-schema-to-draft6.function.ts | 321 + .../src/lib/shared/date.functions.ts | 100 + .../src/lib/shared/form-group.functions.ts | 533 + .../src/lib/shared/format-regex.constants.ts | 73 + .../src/lib/shared/index.ts | 42 + .../src/lib/shared/json-schema.functions.ts | 788 ++ .../src/lib/shared/json.validators.ts | 878 ++ .../src/lib/shared/jsonpointer.functions.ts | 895 ++ .../src/lib/shared/layout.functions.ts | 1067 ++ .../src/lib/shared/merge-schemas.function.ts | 329 + .../src/lib/shared/utility.functions.ts | 320 + .../src/lib/shared/validator.functions.ts | 591 + .../widget-library/add-reference.component.ts | 59 + .../lib/widget-library/button.component.ts | 54 + .../lib/widget-library/checkbox.component.ts | 74 + .../widget-library/checkboxes.component.ts | 104 + .../src/lib/widget-library/file.component.ts | 36 + .../lib/widget-library/hidden.component.ts | 39 + .../src/lib/widget-library/index.ts | 56 + .../src/lib/widget-library/input.component.ts | 76 + .../lib/widget-library/message.component.ts | 29 + .../src/lib/widget-library/none.component.ts | 12 + .../lib/widget-library/number.component.ts | 79 + .../lib/widget-library/one-of.component.ts | 36 + .../lib/widget-library/orderable.directive.ts | 129 + .../lib/widget-library/radios.component.ts | 101 + .../src/lib/widget-library/root.component.ts | 78 + .../lib/widget-library/section.component.ts | 133 + .../select-framework.component.ts | 46 + .../widget-library/select-widget.component.ts | 46 + .../lib/widget-library/select.component.ts | 96 + .../lib/widget-library/submit.component.ts | 62 + .../src/lib/widget-library/tab.component.ts | 29 + .../src/lib/widget-library/tabs.component.ts | 83 + .../lib/widget-library/template.component.ts | 52 + .../lib/widget-library/textarea.component.ts | 68 + .../widget-library/widget-library.module.ts | 22 + .../widget-library/widget-library.service.ts | 232 + .../src/public_api.ts | 14 + .../angular7-json-schema-form/src/test.ts | 22 + .../tsconfig.lib.json | 39 + .../tsconfig.spec.json | 17 + .../angular7-json-schema-form/tslint.json | 17 + frontend/src/app/ace-editor.directive.ts | 86 + frontend/src/app/app.component.css | 0 frontend/src/app/app.component.html | 1 - frontend/src/app/app.component.spec.ts | 31 - frontend/src/app/app.component.ts | 12 - frontend/src/app/app.module.ts | 25 - .../src/app/components/example.component.css | 0 .../src/app/components/example.component.html | 26 - .../app/components/example.component.spec.ts | 25 - .../src/app/components/example.component.ts | 26 - frontend/src/app/components/example.ts | 3 - frontend/src/app/demo-root.component.ts | 8 + frontend/src/app/demo.component.html | 196 + frontend/src/app/demo.component.ts | 254 + frontend/src/app/demo.module.ts | 58 + frontend/src/app/demo.routes.ts | 8 + frontend/src/app/example-schemas.model.ts | 171 + .../src/app/service/example.service.spec.ts | 16 - frontend/src/app/service/example.service.ts | 30 - frontend/src/assets/.gitkeep | 0 .../src/assets/example-schemas/asf-array.json | 65 + .../asf-basic-json-schema-type.json | 24 + .../example-schemas/asf-bootstrap-grid.json | 65 + .../asf-complex-key-support.json | 53 + .../asf-hack-conditional-required.json | 41 + .../example-schemas/asf-kitchen-sink.json | 207 + .../assets/example-schemas/asf-simple.json | 43 + .../assets/example-schemas/asf-tab-array.json | 53 + .../asf-titlemap-examples.json | 91 + .../assets/example-schemas/jsf-events.json | 22 + .../example-schemas/jsf-factory-sleek.json | 70 + .../example-schemas/jsf-fields-ace.json | 16 + .../example-schemas/jsf-fields-actions.json | 21 + .../jsf-fields-advancedfieldset.json | 21 + .../jsf-fields-array-simple.json | 39 + .../example-schemas/jsf-fields-array.json | 62 + .../jsf-fields-authfieldset.json | 21 + .../jsf-fields-autocomplete.json | 40 + .../example-schemas/jsf-fields-checkbox.json | 37 + .../jsf-fields-checkboxbuttons.json | 21 + .../jsf-fields-checkboxes.json | 75 + .../example-schemas/jsf-fields-color.json | 9 + .../example-schemas/jsf-fields-common.json | 28 + .../example-schemas/jsf-fields-fieldset.json | 28 + .../example-schemas/jsf-fields-help.json | 30 + .../example-schemas/jsf-fields-hidden.json | 22 + .../jsf-fields-iconselect.json | 41 + .../jsf-fields-imageselect.json | 24 + .../example-schemas/jsf-fields-password.json | 12 + .../example-schemas/jsf-fields-questions.json | 42 + .../jsf-fields-radiobuttons.json | 30 + .../example-schemas/jsf-fields-radios.json | 48 + .../example-schemas/jsf-fields-range.json | 18 + .../example-schemas/jsf-fields-section.json | 27 + .../example-schemas/jsf-fields-select.json | 54 + .../jsf-fields-selectfieldset-key.json | 31 + .../jsf-fields-selectfieldset.json | 28 + .../example-schemas/jsf-fields-submit.json | 22 + .../jsf-fields-tabarray-maxitems.json | 41 + .../jsf-fields-tabarray-value.json | 23 + .../example-schemas/jsf-fields-tabarray.json | 39 + .../example-schemas/jsf-fields-textarea.json | 12 + .../example-schemas/jsf-gettingstarted.json | 14 + .../jsf-previousvalues-multidimensional.json | 22 + .../example-schemas/jsf-previousvalues.json | 34 + .../example-schemas/jsf-schema-array.json | 27 + .../example-schemas/jsf-schema-basic.json | 15 + .../example-schemas/jsf-schema-default.json | 47 + .../example-schemas/jsf-schema-inlineref.json | 29 + .../jsf-schema-morecomplex.json | 28 + .../example-schemas/jsf-schema-required.json | 68 + .../example-schemas/jsf-templating-idx.json | 18 + .../jsf-templating-tpldata.json | 15 + .../example-schemas/jsf-templating-value.json | 25 + .../jsf-templating-values.json | 19 + .../example-schemas/json-schema-draft01.json | 81 + .../example-schemas/json-schema-draft02.json | 95 + .../example-schemas/json-schema-draft03.json | 84 + .../example-schemas/json-schema-draft04.json | 88 + .../example-schemas/json-schema-draft06.json | 77 + .../example-schemas/ng-jsf-data-only.json | 20 + .../example-schemas/ng-jsf-deep-ref.json | 53 + .../example-schemas/ng-jsf-flex-layout.json | 101 + .../example-schemas/ng-jsf-layout-only.json | 25 + .../example-schemas/ng-jsf-nested-arrays.json | 38 + .../ng-jsf-select-list-examples.json | 132 + .../ng-jsf-select-widget-examples.json | 139 + .../example-schemas/ng-jsf-simple-array.json | 18 + .../example-schemas/rjsf-alternatives.json | 45 + .../assets/example-schemas/rjsf-arrays.json | 112 + .../example-schemas/rjsf-custom-array.json | 54 + .../assets/example-schemas/rjsf-custom.json | 13 + .../example-schemas/rjsf-date-and-time.json | 33 + .../assets/example-schemas/rjsf-errors.json | 42 + .../assets/example-schemas/rjsf-files.json | 23 + .../assets/example-schemas/rjsf-large.json | 47 + .../assets/example-schemas/rjsf-nested.json | 53 + .../assets/example-schemas/rjsf-numbers.json | 58 + .../assets/example-schemas/rjsf-ordering.json | 27 + .../example-schemas/rjsf-references.json | 59 + .../assets/example-schemas/rjsf-simple.json | 47 + .../assets/example-schemas/rjsf-single.json | 8 + .../example-schemas/rjsf-validation.json | 46 + .../assets/example-schemas/rjsf-widgets.json | 151 + .../src/assets/example-schemas/sources.md | 15 + frontend/src/browserslist | 9 + frontend/src/environments/environment.prod.ts | 4 +- frontend/src/environments/environment.ts | 17 +- frontend/src/favicon.ico | Bin 948 -> 5430 bytes frontend/src/index.html | 26 +- frontend/src/karma.conf.js | 31 + frontend/src/main.ts | 9 +- frontend/src/polyfills.ts | 68 +- frontend/src/styles.css | 4 - frontend/src/styles.scss | 71 + frontend/src/test.ts | 21 +- frontend/src/tsconfig.app.json | 12 + frontend/src/tsconfig.spec.json | 19 + frontend/src/tslint.json | 17 + frontend/tsconfig.app.json | 14 - frontend/tsconfig.json | 39 +- frontend/tsconfig.spec.json | 18 - frontend/tslint.json | 127 +- frontend/yarn.lock | 8193 +++++------ 226 files changed, 33244 insertions(+), 4968 deletions(-) create mode 100644 frontend/.gitignore create mode 100644 frontend/.travis.yml create mode 100644 frontend/LICENSE delete mode 100644 frontend/browserslist create mode 100644 frontend/docs/issue_template.md rename frontend/e2e/{tsconfig.json => tsconfig.e2e.json} (84%) create mode 100644 frontend/package-lock.json rename frontend/{ => projects/angular7-json-schema-form}/karma.conf.js (83%) create mode 100644 frontend/projects/angular7-json-schema-form/ng-package.json create mode 100644 frontend/projects/angular7-json-schema-form/ng-package.prod.json create mode 100644 frontend/projects/angular7-json-schema-form/package-lock.json create mode 100644 frontend/projects/angular7-json-schema-form/package.json create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3.framework.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4.framework.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework-library.service.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/index.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-root.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-section.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/index.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-add-reference.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button-group.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkbox.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkboxes.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-chip-list.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-datepicker.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design.framework.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-file.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-input.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-number.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-one-of.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-radios.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-select.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-slider.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-stepper.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-tabs.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-textarea.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no.framework.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.service.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/locale/en-validation-messages.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/locale/fr-validation-messages.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/convert-schema-to-draft6.function.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/date.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/form-group.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/format-regex.constants.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/index.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/json-schema.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/json.validators.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/jsonpointer.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/layout.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/merge-schemas.function.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/utility.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/shared/validator.functions.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/add-reference.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/button.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkbox.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkboxes.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/file.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/hidden.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/index.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/input.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/message.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/none.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/number.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/one-of.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/orderable.directive.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/radios.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/root.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/section.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-framework.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-widget.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/select.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/submit.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/tab.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/tabs.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/template.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/textarea.component.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.module.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.service.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/public_api.ts create mode 100644 frontend/projects/angular7-json-schema-form/src/test.ts create mode 100644 frontend/projects/angular7-json-schema-form/tsconfig.lib.json create mode 100644 frontend/projects/angular7-json-schema-form/tsconfig.spec.json create mode 100644 frontend/projects/angular7-json-schema-form/tslint.json create mode 100755 frontend/src/app/ace-editor.directive.ts delete mode 100644 frontend/src/app/app.component.css delete mode 100644 frontend/src/app/app.component.html delete mode 100644 frontend/src/app/app.component.spec.ts delete mode 100644 frontend/src/app/app.component.ts delete mode 100644 frontend/src/app/app.module.ts delete mode 100644 frontend/src/app/components/example.component.css delete mode 100644 frontend/src/app/components/example.component.html delete mode 100644 frontend/src/app/components/example.component.spec.ts delete mode 100644 frontend/src/app/components/example.component.ts delete mode 100644 frontend/src/app/components/example.ts create mode 100755 frontend/src/app/demo-root.component.ts create mode 100755 frontend/src/app/demo.component.html create mode 100755 frontend/src/app/demo.component.ts create mode 100755 frontend/src/app/demo.module.ts create mode 100755 frontend/src/app/demo.routes.ts create mode 100755 frontend/src/app/example-schemas.model.ts delete mode 100644 frontend/src/app/service/example.service.spec.ts delete mode 100644 frontend/src/app/service/example.service.ts delete mode 100644 frontend/src/assets/.gitkeep create mode 100755 frontend/src/assets/example-schemas/asf-array.json create mode 100755 frontend/src/assets/example-schemas/asf-basic-json-schema-type.json create mode 100755 frontend/src/assets/example-schemas/asf-bootstrap-grid.json create mode 100755 frontend/src/assets/example-schemas/asf-complex-key-support.json create mode 100755 frontend/src/assets/example-schemas/asf-hack-conditional-required.json create mode 100755 frontend/src/assets/example-schemas/asf-kitchen-sink.json create mode 100755 frontend/src/assets/example-schemas/asf-simple.json create mode 100755 frontend/src/assets/example-schemas/asf-tab-array.json create mode 100755 frontend/src/assets/example-schemas/asf-titlemap-examples.json create mode 100755 frontend/src/assets/example-schemas/jsf-events.json create mode 100755 frontend/src/assets/example-schemas/jsf-factory-sleek.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-ace.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-actions.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-advancedfieldset.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-array-simple.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-array.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-authfieldset.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-autocomplete.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-checkbox.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-checkboxbuttons.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-checkboxes.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-color.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-common.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-fieldset.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-help.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-hidden.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-iconselect.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-imageselect.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-password.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-questions.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-radiobuttons.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-radios.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-range.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-section.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-select.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-selectfieldset-key.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-selectfieldset.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-submit.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-tabarray-maxitems.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-tabarray-value.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-tabarray.json create mode 100755 frontend/src/assets/example-schemas/jsf-fields-textarea.json create mode 100755 frontend/src/assets/example-schemas/jsf-gettingstarted.json create mode 100755 frontend/src/assets/example-schemas/jsf-previousvalues-multidimensional.json create mode 100755 frontend/src/assets/example-schemas/jsf-previousvalues.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-array.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-basic.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-default.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-inlineref.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-morecomplex.json create mode 100755 frontend/src/assets/example-schemas/jsf-schema-required.json create mode 100755 frontend/src/assets/example-schemas/jsf-templating-idx.json create mode 100755 frontend/src/assets/example-schemas/jsf-templating-tpldata.json create mode 100755 frontend/src/assets/example-schemas/jsf-templating-value.json create mode 100755 frontend/src/assets/example-schemas/jsf-templating-values.json create mode 100644 frontend/src/assets/example-schemas/json-schema-draft01.json create mode 100644 frontend/src/assets/example-schemas/json-schema-draft02.json create mode 100755 frontend/src/assets/example-schemas/json-schema-draft03.json create mode 100755 frontend/src/assets/example-schemas/json-schema-draft04.json create mode 100755 frontend/src/assets/example-schemas/json-schema-draft06.json create mode 100755 frontend/src/assets/example-schemas/ng-jsf-data-only.json create mode 100644 frontend/src/assets/example-schemas/ng-jsf-deep-ref.json create mode 100755 frontend/src/assets/example-schemas/ng-jsf-flex-layout.json create mode 100755 frontend/src/assets/example-schemas/ng-jsf-layout-only.json create mode 100644 frontend/src/assets/example-schemas/ng-jsf-nested-arrays.json create mode 100644 frontend/src/assets/example-schemas/ng-jsf-select-list-examples.json create mode 100644 frontend/src/assets/example-schemas/ng-jsf-select-widget-examples.json create mode 100755 frontend/src/assets/example-schemas/ng-jsf-simple-array.json create mode 100644 frontend/src/assets/example-schemas/rjsf-alternatives.json create mode 100755 frontend/src/assets/example-schemas/rjsf-arrays.json create mode 100644 frontend/src/assets/example-schemas/rjsf-custom-array.json create mode 100755 frontend/src/assets/example-schemas/rjsf-custom.json create mode 100755 frontend/src/assets/example-schemas/rjsf-date-and-time.json create mode 100755 frontend/src/assets/example-schemas/rjsf-errors.json create mode 100755 frontend/src/assets/example-schemas/rjsf-files.json create mode 100755 frontend/src/assets/example-schemas/rjsf-large.json create mode 100755 frontend/src/assets/example-schemas/rjsf-nested.json create mode 100755 frontend/src/assets/example-schemas/rjsf-numbers.json create mode 100755 frontend/src/assets/example-schemas/rjsf-ordering.json create mode 100755 frontend/src/assets/example-schemas/rjsf-references.json create mode 100755 frontend/src/assets/example-schemas/rjsf-simple.json create mode 100644 frontend/src/assets/example-schemas/rjsf-single.json create mode 100755 frontend/src/assets/example-schemas/rjsf-validation.json create mode 100755 frontend/src/assets/example-schemas/rjsf-widgets.json create mode 100755 frontend/src/assets/example-schemas/sources.md create mode 100644 frontend/src/browserslist mode change 100644 => 100755 frontend/src/environments/environment.prod.ts mode change 100644 => 100755 frontend/src/environments/environment.ts mode change 100644 => 100755 frontend/src/index.html create mode 100644 frontend/src/karma.conf.js mode change 100644 => 100755 frontend/src/main.ts mode change 100644 => 100755 frontend/src/polyfills.ts delete mode 100644 frontend/src/styles.css create mode 100755 frontend/src/styles.scss mode change 100644 => 100755 frontend/src/test.ts create mode 100755 frontend/src/tsconfig.app.json create mode 100644 frontend/src/tsconfig.spec.json create mode 100644 frontend/src/tslint.json delete mode 100644 frontend/tsconfig.app.json delete mode 100644 frontend/tsconfig.spec.json diff --git a/frontend/.editorconfig b/frontend/.editorconfig index e89330a61..6e87a003d 100644 --- a/frontend/.editorconfig +++ b/frontend/.editorconfig @@ -1,4 +1,4 @@ -# Editor configuration, see https://editorconfig.org +# Editor configuration, see http://editorconfig.org root = true [*] diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 000000000..ee5c9d833 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,39 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/frontend/.travis.yml b/frontend/.travis.yml new file mode 100644 index 000000000..a33cb52ec --- /dev/null +++ b/frontend/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +node_js: + - "8.9.4" + +branches: + only: + - master + - develop + +before_script: + - yarn install --frozen-lockfile + +script: + - yarn buildlib + - yarn build + +deploy: + provider: pages + skip-cleanup: true + github-token: $GITHUB_TOKEN # Set in travis-ci.org dashboard, marked secure + keep-history: true + on: + branch: master + local_dir: dist/angular7-json-schema-form-app + \ No newline at end of file diff --git a/frontend/LICENSE b/frontend/LICENSE new file mode 100644 index 000000000..7c9e95a7d --- /dev/null +++ b/frontend/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Hamza Hamidi + +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/frontend/README.md b/frontend/README.md index 53d73d7cf..8044b69d3 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,27 +1,488 @@ -# Frontend +# Angular7-json-schema-form -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.0.1. +[![Build Status](https://travis-ci.org/adampenn/Angular7-json-schema-form.svg?branch=master)](https://travis-ci.org/adampenn/Angular7-json-schema-form) +[![GitHub release](https://img.shields.io/github/release/adampenn/angular7-json-schema-form.svg)](https://github.com/adampenn/angular7-json-schema-form/releases/latest) +[![npm downloads](https://img.shields.io/npm/dm/angular7-json-schema-form.svg?style=plastic)](https://www.npmjs.com/package/angular7-json-schema-form) [![GitHub MIT License](https://img.shields.io/github/license/adampenn/angular7-json-schema-form.svg?style=social)](https://github.com/adampenn/angular7-json-schema-form) -## Development server +Note: This project is a fork of [hamzahamidi/Angular6-json-schema-form](https://github.com/hamzahamidi/Angular6-json-schema-form) so that I could upgrade it to Angular 7 & is and is not affiliated with any organization. -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. +A [JSON Schema](http://json-schema.org) Form builder for Angular, similar to, and mostly API compatible with, -## Code scaffolding +* [JSON Schema Form](https://github.com/json-schema-form)'s [Angular Schema Form](http://schemaform.io) for [AngularJS](https://angularjs.org) ([examples](http://schemaform.io/examples/bootstrap-example.html)) +* [Mozilla](https://blog.mozilla.org/services/)'s [React JSON Schema Form](https://github.com/mozilla-services/react-jsonschema-form) for [React](https://facebook.github.io/react/) ([examples](https://mozilla-services.github.io/react-jsonschema-form/)), and +* [Joshfire](http://www.joshfire.com)'s [JSON Form](http://github.com/joshfire/jsonform/wiki) for [jQuery](https://jquery.com) ([examples](http://ulion.github.io/jsonform/playground/)) -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. +## Check out the live demo and play with the examples from the Angular 6 version -## Build +[Check out some examples here.](https://hamidihamza.com/Angular6-json-schema-form) -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. +This example playground features over 70 different JSON Schemas for you to try (including all examples used by each of the three libraries listed above), and the ability to quickly view any example formatted with Material Design, Bootstrap 3, Bootstrap 4, or without any formatting. -## Running unit tests +## Installation -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). +### To install from GitHub -## Running end-to-end tests +To install [the library and the example playground from GitHub](https://github.com/adampenn/angular7-json-schema-form), clone `https://github.com/adampenn/angular7-json-schema-form.git` with your favorite git program. Or, assuming you have [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and [Node/YARN](https://nodejs.org/en/download/) installed, enter the following in your terminal: -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +```shell +git clone https://github.com/adampenn/angular7-json-schema-form.git angular7-json-schema-form +cd angular7-json-schema-form +yarn install +yarn buildlib +yarn start +``` -## Further help +This should start a server with the example playground, which you can view in your browser at `http://localhost:4200` -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). +The source code is composed as the following: + +* `projects/json-schema-form` - Angular JSON Schema Form main library +* `projects/json-schema-form/src/lib/framework-library` - framework library +* `projects/json-schema-form/src/lib/widget-library` - widget library +* `projects/json-schema-form/src/lib/shared` - various utilities and helper functions +* `src` - the demonstration playground example application +* `src/assets/example-schemas` - JSON Schema examples used in the playground + +If you want detailed documentation describing the individual functions used in this library, run `npm run docs` to generate TypeDoc documentation, and then look in the generated `/docs/api` folder. (Angular JSON Schema Form is still a work in progress, so right now this documentation varies from highly detailed to completely missing.) + +### To install from NPM/YARN and use in your own project + +If, after playing with the examples, you decide this library is functional enough to use in your own project, you can [install it from NPM](https://www.npmjs.com/package/angular7-json-schema-form) using either [NPM](https://www.npmjs.com) or [Yarn](https://yarnpkg.com). To install with NPM, run the following from your terminal: + +```shell +npm install angular7-json-schema-form +``` + +With YARN, run the following: + +```shell +yarn add angular7-json-schema-form +``` + +Then import `MaterialDesignFrameworkModule` in your main application module if you want to use `material-angular` UI, like this: + +```javascript +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; + +import { MaterialDesignFrameworkModule } from 'angular7-json-schema-form'; + +import { AppComponent } from './app.component'; + +@NgModule({ + declarations: [ AppComponent ], + imports: [ + MaterialDesignFrameworkModule + ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule { } +``` + +Four framework modules are currently included, the import is the same as above : + +* MaterialDesignFrameworkModule — Material Design +* Bootstrap3FrameworkModule — Bootstrap 3 +* Bootstrap4FrameworkModule — Bootstrap 4 +* NoFrameworkModule — plain HTML (for testing) + +It is also possible to load multiple frameworks and switch between them at runtime, like the example playground on GitHub. But most typical sites will just load one framework. + +## Using Angular JSON Schema Form + +### Basic use + +For basic use, after loading JsonSchemaFormModule as described above, to display a form in your Angular component, simply add the following to your component's template: + +```html + + +``` + +Where `schema` is a valid JSON schema object, and `onSubmit` calls a function to process the submitted JSON form data. If you don't already have your own schemas, you can find a bunch of samples to test with in the `src/demo/assets/example-schemas` folder, as described above. + +`framework` is for the template you want to use, the default value is `no-framwork`. The possible values are: + +* `material-design` for Material Design. +* `bootstrap-3` for Bootstrap 3. +* `bootstrap-4` for 'Bootstrap 4. +* `no-framework` for (plain HTML). + +Setting `loadExternalAssets="true"` will automatically load any additional assets needed by the display framework. It is useful when you are trying out this library, but production sites should instead load all required assets separately. For full details see 'Changing or adding frameworks', below. + +### Data-only mode + +Angular JSON Schema Form can also create a form entirely from a JSON object—with no schema—like so: + +```html + + +``` + +```javascript +exampleJsonObject = { + "first_name": "Jane", "last_name": "Doe", "age": 25, "is_company": false, + "address": { + "street_1": "123 Main St.", "street_2": null, + "city": "Las Vegas", "state": "NV", "zip_code": "89123" + }, + "phone_numbers": [ + { "number": "702-123-4567", "type": "cell" }, + { "number": "702-987-6543", "type": "work" } + ], "notes": "" +}; +``` + +In this mode, Angular JSON Schema Form automatically generates a schema from your data. The generated schema is relatively simple, compared to what you could create on your own. However, as the above example shows, it does detect and enforce string, number, and boolean values (nulls are also assumed to be strings), and automatically allows array elements to be added, removed, and reordered. + +After displaying a form in this mode, you can also use the `formSchema` and `formLayout` outputs (described in 'Debugging inputs and outputs', below), to return the generated schema and layout, which will give you a head start on writing your own schemas and layouts by showing you examples created from your own data. + +Also, notice that the 'ngModel' input supports Angular's 2-way data binding, just like other form controls, which is why it is not always necessary to use an onSubmit function. + +### Advanced use + +#### Additional inputs an outputs + +For more control over your form, you may provide these additional inputs: + +* `layout` array with a custom form layout (see Angular Schema Form's [form definitions](https://github.com/json-schema-form/angular-schema-form/blob/master/docs/index.md#form-definitions) for information about how to construct a form layout) +* `data` object to populate the form with default or previously submitted values +* `options` object to set any global options for the form +* `widgets` object to add custom widgets +* `language` string to set the error message language (currently supports 'en' and 'fr') +* `framework` string or object to set which framework to use + +For `framework`, you can pass in your own custom framework object, or, if you've loaded multiple frameworks, you can specify the name of the framework you want to use. To switch between the included frameworks, use 'material-design', 'bootstrap-3', 'bootstrap-4', and 'no-framework'. + +If you want more detailed output, you may provide additional functions for `onChanges` to read the values in real time as the form is being filled out, and you may implement your own custom validation indicators from the boolean `isValid` or the detailed `validationErrors` outputs. + +Here is an example: + +```html + + +``` + +Note: If you prefer brackets around all your attributes, the following is functionally equivalent: + +```html + + +``` + +If you use this syntax, make sure to include the nested quotes (`"'` and `'"`) around the language and framework names. (If you leave out the inner quotes, Angular will read them as a variable names, rather than strings, which will cause errors. All un-bracketed attributes, however, are automatically read as strings, so they don't need inner quotes.) + +#### Single-input mode + +You may also combine all your inputs into one compound object and include it as a `form` input, like so: + +```javascript +const yourCompoundInputObject = { + schema: { ... }, // REQUIRED + layout: [ ... ], // optional + data: { ... }, // optional + options: { ... }, // optional + widgets: { ... }, // optional + language: '...' , // optional + framework: '...' // (or { ... }) optional +} +``` + +```html + + +``` + +You can also mix these two styles depending on your needs. In the example playground, all examples use the combined `form` input for `schema`, `layout`, and `data`, which enables each example to control those three inputs, but the playground uses separate inputs for `language` and `framework`, enabling it to change those settings independent of the example. + +Combining inputs is useful if you have many unique forms and store each form's data and schema together. If you have one form (or many identical forms), it will likely be more useful to use separate inputs for your data and schema. Though even in that case, if you use a custom layout, you could store your schema and layout together and use one input for both. + +#### Compatibility modes + +If you have previously used another JSON form creation library—Angular Schema Form (for AngularJS), React JSON Schema Form, or JSON Form (for jQuery)—in order to make the transition easier, Angular JSON Schema Form will recognize the input names and custom input objects used by those libraries. It should automatically work with JSON Schemas in [version 6](http://json-schema.org/draft-06/schema), [version 4](http://json-schema.org/draft-04/schema), [version 3](http://json-schema.org/draft-03/schema), or the [truncated version 3 format supported by JSON Form](https://github.com/joshfire/jsonform/wiki#schema-shortcut). So the following will all work: + +Angular Schema Form (AngularJS) compatibility: + +```html + + +``` + +React JSON Schema Form compatibility: + +```html + + +``` + +JSON Form (jQuery) compatibility: + +```html + + +``` + +Note: 2-way data binding will work with any dedicated data input, including 'data', 'model', 'ngModel', or 'formData'. However, 2-way binding will _not_ work with the combined 'form' input. + +#### Debugging inputs and outputs + +Finally, Angular JSON Schema Form includes some additional inputs and outputs for debugging: + +* `debug` input — Activates debugging mode. +* `loadExternalAssets` input — Causes external JavaScript and CSS needed by the selected framework to be automatically loaded from a CDN (this is not 100% reliable, so while this can be helpful during development and testing, it is not recommended for production)—Note: If you are using this mode and get a console error saying an external asset has not loaded (such as jQuery, required for Bootstrap 3) simply reloading your web browser will usually fix it. +* `formSchema` and `formLayout` outputs — Returns the final schema and layout used to create the form (which will either show how your original input schema and layout were modified, if you provided inputs, or show you the automatically generated ones, if you didn't). + +```html + + +``` + +## Customizing + +In addition to a large number of user-settable options, Angular JSON Schema Form also has the ability to load custom form control widgets and layout frameworks. All forms are constructed from these basic components. The default widget library includes all standard HTML 5 form controls, as well as several common layout patterns, such as multiple checkboxes and tab sets. The default framework library includes templates to style forms using Material Design, Bootstrap 3, or Bootstrap 4 (or plain HTML with no formatting, which is not useful in production, but can be helpful for development and debugging). + +### User settings + +(TODO: List all available user settings, and configuration options for each.) + +### Creating custom input validation error messages + +You can easily add your own custom input validation error messages, either for individual control widgets, or for your entire form. + +#### Setting error messages for individual controls or the entire form + +To set messages for individual form controls, add them to that control's node in the form layout, like this: + +```javascript +const yourFormLayout = [ + { key: 'name', + title: 'Enter your name', + validationMessages: { + // Put your error messages for the 'name' field here + } + }, + { type: 'submit', title: 'Submit' } +] +``` + +To set messages for the entire form, add them to the form options, inside the defautWidgetOptions validationMessages object, like this: + +```javascript +const yourFormOptions = { + defautWidgetOptions: { + validationMessages: { + // Put your error messages for the entire form here + } + } +} +``` + +#### How to format error messages + +The validationMessages object—in either a layout node or the form options—contains the names of each error message you want to set as keys, and the corresponding messages as values. Messages may be in any of the following formats: + +* String: A plain text message, which is always the same. +* String template: A text message that includes Angular template-style {{variables}}, which will be be replaced with values from the returned error object. +* Function: A JavaScript function which accepts the error object as input, and returns a string error message. + +Here are examples of all three error message types: + +```javascript +validationMessages: { + + // String error message + required: 'This field is required.', + + // String template error message + // - minimumLength variable will be replaced + minLength: 'Must be at least {{minimumLength}} characters long.', + + // Function error message + // - example error object: { multipleOfValue: 0.01, currentValue: 3.456 } + // - resulting error message: 'Must have 2 or fewer decimal places.' + multipleOf: function(error) { + if ((1 / error.multipleOfValue) % 10 === 0) { + const decimals = Math.log10(1 / error.multipleOfValue); + return `Must have ${decimals} or fewer decimal places.`; + } else { + return `Must be a multiple of ${error.multipleOfValue}.`; + } + } +} +``` + +(Note: These examples are from the default set of built-in error messages, which includes messages for all JSON Schema errors except type, const, enum, and dependencies.) + +#### Available input validation errors and object values + +Here is a list of all the built-in JSON Schema errors, which data type each error is available for, and the values in their returned error objects: + +Error name | Data type | Returned error object values +-----------------|-----------|----------------------------------------- +required | any | (none) +type | any | requiredType, currentValue +const | any | requiredValue, currentValue +enum | any | allowedValues, currentValue +minLength | string | minimumLength, currentLength +maxLength | string | maximumLength, currentLength +pattern | string | requiredPattern, currentValue +format | string | requiredFormat, currentValue +minimum | number | minimumValue, currentValue +exclusiveMinimum | number | exclusiveMinimumValue, currentValue +maximum | number | maximumValue, currentValue +exclusiveMaximum | number | exclusiveMaximumValue, currentValue +multipleOf | number | multipleOfValue, currentValue +minProperties | object | minimumProperties, currentProperties +maxProperties | object | maximumProperties, currentProperties + dependencies * | object | (varies, based on dependencies schema) +minItems | array | minimumItems, currentItems +maxItems | array | maximumItems, currentItems +uniqueItems | array | duplicateItems + contains * | array | requiredItem + +* Note: The `contains` and `dependencies` validators are still in development, and do not yet work correctly. + +### Changing or adding widgets + +To add a new widget or override an existing widget, either add an object containing your new widgets to the `widgets` input of the `` tag, or load the `WidgetLibraryService` and call `registerWidget(widgetType, widgetComponent)`, with a string type name and an Angular component to be used whenever a form needs that widget type. + +Example: + +```javascript +import { YourInputWidgetComponent } from './your-input-widget.component'; +import { YourCustomWidgetComponent } from './your-custom-widget.component'; +... +const yourNewWidgets = { + input: YourInputWidgetComponent, // Replace existing 'input' widget + custom-control: YourCustomWidgetComponent // Add new 'custom-control' widget +} +``` + +...and... + +```html + + +``` + +...or... + +```javascript +import { WidgetLibraryService } from 'angular7-json-schema-form'; +... +constructor(private widgetLibrary: WidgetLibraryService) { } +... +// Replace existing 'input' widget: +widgetLibrary.registerWidget('input', YourInputWidgetComponent); +// Add new 'custom-control' widget: +widgetLibrary.registerWidget('custom-control', YourCustomWidgetComponent); +``` + +To see many examples of widgets, explore the source code, or call `getAllWidgets()` from the `WidgetLibraryService` to see all widgets currently available in the library. All default widget components are in the `projects/json-schema-form/src/lib/widget-library` folder, and all custom Material Design widget components are in the `projects/json-schema-form/src/lib/framework-library/material-design-framework` folder. (The Bootstrap 3 and Bootstrap 4 frameworks just reformat the default widgets, and so do not include any custom widgets of their own.) + +### Changing or adding frameworks + +To change the active framework, either use the `framework` input of the `` tag, or load the `FrameworkLibraryService` and call `setFramework(yourCustomFramework)`, with either the name of an available framework ('bootstrap-3', 'bootstrap-4', 'material-design', or 'no-framework'), or with your own custom framework object, like so: + +```javascript +import { YourFrameworkComponent } from './your-framework.component'; +import { YourWidgetComponent } from './your-widget.component'; +... +const yourCustomFramework = { + framework: YourFrameworkComponent, // required + widgets: { 'your-widget-name': YourWidgetComponent, ... }, // optional + stylesheets: [ '//url-to-framework-external-style-sheet', ... ], // optional + scripts: [ '//url-to-framework-external-script', ... ] // optional +} +``` + +...and... + +```html + + +``` + +...or... + +```javascript +import { FrameworkLibraryService } from 'angular7-json-schema-form'; +... +constructor(private frameworkLibrary: FrameworkLibraryService) { } +... +frameworkLibrary.setFramework(yourCustomFramework); +``` + +The value of the required `framework` key is an Angular component which will be called to format each widget before it is displayed. The optional `widgets` object contains any custom widgets, which will override or supplement the built-in widgets. And the optional `stylesheets` and `scripts` arrays contain URLs to any additional external style sheets or JavaScript libraries required by the framework. These are the external stylesheets and scripts that will be loaded if the "loadExternalAssets" option is set to "true". + +#### Loading external assets required by a framework + +Most Web layout framework libraries (including both Bootstrap and Material Design) need additional external JavaScript and/or CSS assets loaded in order to work properly. The best practice is to load these assets separately in your site, before calling Angular JSON Schema Form. (For the included libraries, follow these links for more information about how to do this: [Bootstrap](http://getbootstrap.com/getting-started/) and [Material Design](https://github.com/angular/material2/blob/master/GETTING_STARTED.md).) + +Alternately, during development, you may find it helpful to let Angular JSON Schema Form load these resources for you (as wed did in the 'Basic use' example, above), which you can do in several ways: + +* Call `setFramework` with a second parameter of `true` (e.g. `setFramework('material-design', true)`), or +* Add `loadExternalAssets: true` to your `options` object, or +* Add `loadExternalAssets="true"` to your `` tag, as shown above + +Finally, if you want to see what scripts a particular framework will automatically load, after setting that framework you can call `getFrameworkStylesheets()` or `getFrameworkScritps()` from the `FrameworkLibraryService` to return the built-in arrays of URLs. + +However, if you are creating a production site you should load these assets separately, and make sure to remove all references to `loadExternalAssets` to prevent the assets from being loaded twice. + +## License + +[MIT](/LICENSE) diff --git a/frontend/angular.json b/frontend/angular.json index 58eab0f4c..bf74c0a63 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -3,29 +3,27 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "frontend": { - "projectType": "application", - "schematics": {}, + "angular7-json-schema-form-app": { "root": "", "sourceRoot": "src", + "projectType": "application", "prefix": "app", + "schematics": {}, "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist/frontend", + "outputPath": "dist/angular7-json-schema-form-app", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "aot": true, + "tsConfig": "src/tsconfig.app.json", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", - "src/styles.css" + "src/styles.scss" ], "scripts": [] }, @@ -42,39 +40,28 @@ "sourceMap": false, "extractCss": true, "namedChunks": false, + "aot": true, "extractLicenses": true, "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] + "buildOptimizer": true } } }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "frontend:build" + "browserTarget": "angular7-json-schema-form-app:build" }, "configurations": { "production": { - "browserTarget": "frontend:build:production" + "browserTarget": "angular7-json-schema-form-app:build:production" } } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "frontend:build" + "browserTarget": "angular7-json-schema-form-app:build" } }, "test": { @@ -82,49 +69,104 @@ "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.scss" + ], + "scripts": [], "assets": [ "src/favicon.ico", "src/assets" - ], - "styles": [ - "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", - "src/styles.css" - ], - "scripts": [] + ] } }, "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" + "src/tsconfig.app.json", + "src/tsconfig.spec.json" ], "exclude": [ "**/node_modules/**" ] } - }, + } + } + }, + "angular7-json-schema-form-app-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { "e2e": { "builder": "@angular-devkit/build-angular:protractor", "options": { "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "frontend:serve" + "devServerTarget": "angular7-json-schema-form-app:serve" }, "configurations": { "production": { - "devServerTarget": "frontend:serve:production" + "devServerTarget": "angular7-json-schema-form-app:serve:production" } } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "angular7-json-schema-form": { + "root": "projects/angular7-json-schema-form", + "sourceRoot": "projects/angular7-json-schema-form/src", + "projectType": "library", + "prefix": "", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/angular7-json-schema-form/tsconfig.lib.json", + "project": "projects/angular7-json-schema-form/ng-package.json" + }, + "configurations": { + "production": { + "project": "projects/angular7-json-schema-form/ng-package.prod.json" + } + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/angular7-json-schema-form/src/test.ts", + "tsConfig": "projects/angular7-json-schema-form/tsconfig.spec.json", + "karmaConfig": "projects/angular7-json-schema-form/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/angular7-json-schema-form/tsconfig.lib.json", + "projects/angular7-json-schema-form/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } } } } }, - "defaultProject": "frontend", - "cli": { - "analytics": false + "defaultProject": "angular7-json-schema-form-app", + "schematics": { + "@schematics/angular:component": { + "styleext": "scss" + } } } \ No newline at end of file diff --git a/frontend/browserslist b/frontend/browserslist deleted file mode 100644 index 80848532e..000000000 --- a/frontend/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/frontend/docs/issue_template.md b/frontend/docs/issue_template.md new file mode 100644 index 000000000..625827c17 --- /dev/null +++ b/frontend/docs/issue_template.md @@ -0,0 +1,48 @@ +**Describe the bug** +which template: + +* [ ] MaterialDesignFrameworkModule — Material Design +* [ ] Bootstrap3FrameworkModule — Bootstrap 3 +* [ ] Bootstrap4FrameworkModule — Bootstrap 4 +* [ ] NoFrameworkModule — plain HTML +* [ ] Other (please specify below) + +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. ... + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] + +**Log output covering before error and any error statements** + +```logs +Insert log hereCopy +``` + +**Additional context** +Add any other context about the problem here. + + + +**Detailed Description** + + +**Context** + + + +**Possible Implementation** + diff --git a/frontend/e2e/protractor.conf.js b/frontend/e2e/protractor.conf.js index 7c798cfff..86776a391 100644 --- a/frontend/e2e/protractor.conf.js +++ b/frontend/e2e/protractor.conf.js @@ -1,19 +1,15 @@ -// @ts-check // Protractor configuration file, see link for more information // https://github.com/angular/protractor/blob/master/lib/config.ts const { SpecReporter } = require('jasmine-spec-reporter'); -/** - * @type { import("protractor").Config } - */ exports.config = { allScriptsTimeout: 11000, specs: [ './src/**/*.e2e-spec.ts' ], capabilities: { - browserName: 'chrome' + 'browserName': 'chrome' }, directConnect: true, baseUrl: 'http://localhost:4200/', @@ -25,7 +21,7 @@ exports.config = { }, onPrepare() { require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') + project: require('path').join(__dirname, './tsconfig.e2e.json') }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } diff --git a/frontend/e2e/src/app.e2e-spec.ts b/frontend/e2e/src/app.e2e-spec.ts index f8b8268fb..678797666 100644 --- a/frontend/e2e/src/app.e2e-spec.ts +++ b/frontend/e2e/src/app.e2e-spec.ts @@ -1,5 +1,4 @@ import { AppPage } from './app.po'; -import { browser, logging } from 'protractor'; describe('workspace-project App', () => { let page: AppPage; @@ -10,14 +9,6 @@ describe('workspace-project App', () => { it('should display welcome message', () => { page.navigateTo(); - expect(page.getTitleText()).toEqual('frontend app is running!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); + expect(page.getParagraphText()).toEqual('Welcome to angular7-json-schema-form-app!'); }); }); diff --git a/frontend/e2e/src/app.po.ts b/frontend/e2e/src/app.po.ts index b68475e0f..b34a77651 100644 --- a/frontend/e2e/src/app.po.ts +++ b/frontend/e2e/src/app.po.ts @@ -1,11 +1,12 @@ import { browser, by, element } from 'protractor'; +import { promise as wdpromise } from 'selenium-webdriver'; export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; + navigateTo(): wdpromise.Promise { + return browser.get('/'); } - getTitleText(): Promise { - return element(by.css('app-root .content span')).getText() as Promise; + getParagraphText(): wdpromise.Promise { + return element(by.css('app-root h1')).getText(); } } diff --git a/frontend/e2e/tsconfig.json b/frontend/e2e/tsconfig.e2e.json similarity index 84% rename from frontend/e2e/tsconfig.json rename to frontend/e2e/tsconfig.e2e.json index 39b800f78..a6dd62202 100644 --- a/frontend/e2e/tsconfig.json +++ b/frontend/e2e/tsconfig.e2e.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "../out-tsc/e2e", + "outDir": "../out-tsc/app", "module": "commonjs", "target": "es5", "types": [ @@ -10,4 +10,4 @@ "node" ] } -} +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 000000000..b6ca084e2 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,11550 @@ +{ + "name": "angular7-json-schema-form-app", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.10.2.tgz", + "integrity": "sha512-jMok3FvXpj1zfI7tPmrMYe9yyBP2qivaBGxJqKa0H5SdwJFdudD+KwQOwamBdqz68WfEfzwvS2YCqE67thak7g==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.0.2", + "rxjs": "6.3.3" + } + }, + "@angular-devkit/build-angular": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.10.2.tgz", + "integrity": "sha512-0bLcql8Hf0W9G4pgMFc5vhRIGPUjLreGt+NiJgGP2SaM8bhWYm2097tybS18hdDi2eVfALpzsSOUYCtAowh4Pw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.10.2", + "@angular-devkit/build-optimizer": "0.10.2", + "@angular-devkit/build-webpack": "0.10.2", + "@angular-devkit/core": "7.0.2", + "@ngtools/webpack": "7.0.2", + "ajv": "6.5.3", + "autoprefixer": "8.4.1", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "4.5.3", + "file-loader": "2.0.0", + "glob": "7.1.3", + "istanbul": "0.4.5", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "3.8.1", + "less-loader": "4.1.0", + "license-webpack-plugin": "2.0.1", + "loader-utils": "1.1.0", + "mini-css-extract-plugin": "0.4.3", + "minimatch": "3.0.4", + "node-sass": "4.9.3", + "opn": "5.3.0", + "parse5": "4.0.0", + "portfinder": "1.0.17", + "postcss": "6.0.23", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.6", + "raw-loader": "0.5.1", + "rxjs": "6.3.3", + "sass-loader": "7.1.0", + "semver": "5.5.1", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.9", + "speed-measure-webpack-plugin": "^1.2.3", + "stats-webpack-plugin": "0.7.0", + "style-loader": "0.23.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.1.0", + "tree-kill": "1.2.0", + "webpack": "4.19.1", + "webpack-dev-middleware": "3.3.0", + "webpack-dev-server": "3.1.8", + "webpack-merge": "4.1.4", + "webpack-sources": "1.2.0", + "webpack-subresource-integrity": "1.1.0-rc.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "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" + }, + "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" + } + } + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "node-sass": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", + "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "2.87.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": 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 + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + } + } + }, + "@angular-devkit/build-ng-packagr": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.10.2.tgz", + "integrity": "sha512-JS+h60gkP3a+z5fWg36wA19inSHZuBtuO3H2K4i722jlcymZp8EcYDR8CsWOAX0DeP1LtCjSWqEnvvZvXhsrag==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.10.2", + "@angular-devkit/core": "7.0.2", + "rxjs": "6.3.3", + "semver": "5.5.1" + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.10.2.tgz", + "integrity": "sha512-vPX3VqpZ6Gu2cSDOAnMxqU/VwQ0isj1iI89DM3E8yJK2D+Sh82WEeGo9rpTEbGps9Y1VOddSRu8M3UXOlSEkdw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.6", + "typescript": "3.1.3", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.10.2.tgz", + "integrity": "sha512-anJQdhDTCoqloMn28+xHDMottBwnPUzzvm996aEOE8ziEHesdTYTR1JU8LeL149+HPFnufqVVkkzn2+lfG0yOg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.10.2", + "@angular-devkit/core": "7.0.2", + "rxjs": "6.3.3" + } + }, + "@angular-devkit/core": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.2.tgz", + "integrity": "sha512-liVqobArUfTvf0cZcjr3VI5tnHR+QjzfvC4HFBwIArls6/RxIATqd9GE9mFMWpy17xgVq8N7WmD6bymv1trbfA==", + "dev": true, + "requires": { + "ajv": "6.5.3", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.0.2.tgz", + "integrity": "sha512-b+ex7La9ZFxdh1JyuTvjhPKHsyCcXpGG2MQ43QQm0xbR1IigzVv5N2eyvm02rvQK+rY36+rG+FvO+korUeoLhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.0.2", + "rxjs": "6.3.3" + } + }, + "@angular/animations": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.0.0.tgz", + "integrity": "sha512-IYdryQXdYfPvhJpExLSAr0o9rlUeyVS++a6h/sjqN1dkUt/yJBHLRreuHx8Udvlj2nH70raHJgevk8FwhAkTdA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.0.1.tgz", + "integrity": "sha512-WCIz2kbNMrEXkGxbHfBMRvjH7sxzp+nBR2gEhBvUEm9Ap/wBIJaTnHOF743D2fEhtW3IgpaYsTDTKiVryOFcQg==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.0.2.tgz", + "integrity": "sha512-z53fPkdwm+l4yii8+EwJqeYHgDtyTPywe9ZnpeUu4IvIoM5Mffeu+Rlen3sdwb4+7iL3qpLKtwdMosLJwin85w==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.10.2", + "@angular-devkit/core": "7.0.2", + "@angular-devkit/schematics": "7.0.2", + "@schematics/angular": "7.0.2", + "@schematics/update": "0.10.2", + "inquirer": "6.2.0", + "opn": "5.3.0", + "rxjs": "6.3.3", + "semver": "5.5.1", + "symbol-observable": "1.2.0" + } + }, + "@angular/common": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.0.0.tgz", + "integrity": "sha512-jp6MA6EOq/a1m+F0c1aZC345pAYYYFpN1m7GMM91JlqkjzJMhyYVk+Bod9xQOEWadcpY+RFudG+jRsPCMO8bvQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.0.0.tgz", + "integrity": "sha512-4fkohfGyG1BEpeYenOartuJmduyZ/R3XQx46hDDiR/9A8/Go4qLGkgr9Bd/JL/gPIR1XAHH9D5ii2sh+28ZEmA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.0.0.tgz", + "integrity": "sha512-fj5ixB4X3BsUnUukFx+dK5z2KkO7lCx5vlbUT2GOMbGCG43dIH6JKUfy5HbpCodLsJHG0gRgZZuY7/k+pbzS+g==", + "dev": true, + "requires": { + "canonical-path": "0.0.2", + "chokidar": "^1.4.2", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "shelljs": "^0.8.1", + "source-map": "^0.6.1", + "yargs": "9.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 + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "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" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://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" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "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": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "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", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "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" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@angular/core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.0.0.tgz", + "integrity": "sha512-DjVyWNGBWKEeBvxeXy8FGBNlnr/W/tNygOZEd6/uCktcXTG4DNyNQrWuNZUKEpr7RuIT3YVMj+UNwgTq0jB/9g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-7.0.0-beta.19.tgz", + "integrity": "sha512-MXq+zZ6/s5/+GsL9fZ42mKL0LjZ/+L0sVU5FaQuSAJ57soLl5QAGWvdxVmROtqcHd3Htp35R49nKSZBJ0nfAjg==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.0.0.tgz", + "integrity": "sha512-rTg1UHq9gHR6zY3Kkip1KCm/YTck/rlR8CvVFIMwF0bdQxUCT51SXVn58nXts9yDaieABcGaQHNkQn1mARslgw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/http": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.0.0.tgz", + "integrity": "sha512-gHMVKosbhXu+2sXccR1fnKpaJBtZioneW+jpG6CW3oo6f4L5FXnGGx/lqYLsgKFM8yHiOs6OXqvuHh8wYEjayA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.0.0.tgz", + "integrity": "sha512-JlBAXvKrXCCdFc9AnQRaMDl9c0qmASagmmbEX+fuxJbcyqtsUF2y/15Hy5UUmmA+ldZ+mwAoX/naPZZrFSP2rw==", + "dev": true + }, + "@angular/material": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.0.1.tgz", + "integrity": "sha512-/gf2G+/W/SB/54Q+EDKWfaDFuj403XYMSY3IcFJmuR4H8KkDtDr6bM9/HrRpYWNIlrVwOrKE9ByeoFzm5yDmvA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.0.0.tgz", + "integrity": "sha512-XyvL30d6meJ+SXlOmdR+sxoLdSvkQdmVNvpdvUzAHC/EqwA/byg4V3bTe5lpZmypclgFCjkGoTsz6uOnnwlQhw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.0.0.tgz", + "integrity": "sha512-lH2KuH+Em1y/mTOE6yTJmsOxYkMbYKzKLP9gYzc9vZu3er1df6Jx6jxefeBmAr9v+kNCLnpnHWHz2y4GzAesJA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.0.0.tgz", + "integrity": "sha512-BK6Ho/7ckldFKc724piuPuMX0HPYXD8SUfwNj6yc0wgzDxdWzSmZj/xPEYll2pGNIA9x8Tg1NQKCD+kp1WXngw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz", + "integrity": "sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==", + "dev": true, + "requires": { + "@babel/types": "^7.1.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz", + "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz", + "integrity": "sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.3", + "@babel/types": "^7.1.3", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz", + "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@ngtools/json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", + "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", + "dev": true + }, + "@ngtools/webpack": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.0.2.tgz", + "integrity": "sha512-xEZEsZZgwmL/sCv3hAbZVgf+wVB7UzPcTkyprzD2K+2zFivCDd43uYAOdlrOnihCoEIpwnPTn69urjopMqmcjg==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.0.2", + "enhanced-resolve": "4.1.0", + "rxjs": "6.3.3", + "tree-kill": "1.2.0", + "webpack-sources": "1.2.0" + } + }, + "@schematics/angular": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.0.2.tgz", + "integrity": "sha512-EMYo3CguVFqpVkXPlyXdyMaPA3LIDDfHtrjc4kAkb+yLorTsKETTWoVFwOzG7xoF3uIG+inkeKr/MzU0OejrUw==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.0.2", + "@angular-devkit/schematics": "7.0.2", + "typescript": "3.1.3" + } + }, + "@schematics/update": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.10.2.tgz", + "integrity": "sha512-/U/HlA/1DRmN2rj/P5htxEWDiMyJE/pa/gGbG2z0IBabOaGsMfEDHPqqXphpB2+03lc2tmC+B19j6pHKtgXZUg==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.0.2", + "@angular-devkit/schematics": "7.0.2", + "npm-registry-client": "8.6.0", + "rxjs": "6.3.3", + "semver": "5.5.1", + "semver-intersect": "1.4.0" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/jasmine": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.9.tgz", + "integrity": "sha512-8dPZwjosElZOGGYw1nwTvOEMof4gjwAWNFS93nBI091BoEfd5drnHOLRMiRF/LOPuMTn5LgEdv0bTUO8QFVuHQ==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.5.tgz", + "integrity": "sha512-1awkm/O4pQCR9hI2F80HmIOda/L+ogkSL8Arj1k00eue5VLY5ooewhSOyF/cUJE0S+/34uD5EYY3zmd6fu2OCA==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/lodash": { + "version": "4.14.117", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.117.tgz", + "integrity": "sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw==", + "dev": true + }, + "@types/node": { + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", + "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.12.tgz", + "integrity": "sha512-hYn+eoOehVUIdMwp5h34ZsGAO1ydja10GDup4BwyoFCdcH5MQ35nQq+AInSaBMEMopD5hEooFCyKo2Pajbe1ag==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.6.tgz", + "integrity": "sha512-8nkZS48EVsMUU0v6F1LCIOw4RYWLm2plMtbhFTjNgeXmsTNLuU3xTRtnljt9BFQB+iPbLRobkNrCWftWnNC7wQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.6", + "@webassemblyjs/helper-wasm-bytecode": "1.7.6", + "@webassemblyjs/wast-parser": "1.7.6", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz", + "integrity": "sha512-VBOZvaOyBSkPZdIt5VBMg3vPWxouuM13dPXGWI1cBh3oFLNcFJ8s9YA7S9l4mPI7+Q950QqOmqj06oa83hNWBA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz", + "integrity": "sha512-SCzhcQWHXfrfMSKcj8zHg1/kL9kb3aa5TN4plc/EREOs5Xop0ci5bdVBApbk2yfVi8aL+Ly4Qpp3/TRAUInjrg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz", + "integrity": "sha512-1/gW5NaGsEOZ02fjnFiU8/OEEXU1uVbv2um0pQ9YVL3IHSkyk6xOwokzyqqO1qDZQUAllb+V8irtClPWntbVqw==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz", + "integrity": "sha512-+suMJOkSn9+vEvDvgyWyrJo5vJsWSDXZmJAjtoUq4zS4eqHyXImpktvHOZwXp1XQjO5H+YQwsBgqTQEc0J/5zg==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.6" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz", + "integrity": "sha512-HCS6KN3wgxUihGBW7WFzEC/o8Eyvk0d56uazusnxXthDPnkWiMv+kGi9xXswL2cvfYfeK5yiM17z2K5BVlwypw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz", + "integrity": "sha512-e8/6GbY7OjLM+6OsN7f2krC2qYVNaSr0B0oe4lWdmq5sL++8dYDD1TFbD1TdAdWMRTYNr/Qq7ovXWzia2EbSjw==", + "dev": true, + "requires": { + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz", + "integrity": "sha512-PzYFCb7RjjSdAOljyvLWVqd6adAOabJW+8yRT+NWhXuf1nNZWH+igFZCUK9k7Cx7CsBbzIfXjJc7u56zZgFj9Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz", + "integrity": "sha512-3GS628ppDPSuwcYlQ7cDCGr4W2n9c4hLzvnRKeuz+lGsJSmc/ADVoYpm1ts2vlB1tGHkjtQMni+yu8mHoMlKlA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-buffer": "1.7.6", + "@webassemblyjs/helper-wasm-bytecode": "1.7.6", + "@webassemblyjs/wasm-gen": "1.7.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz", + "integrity": "sha512-V4cIp0ruyw+hawUHwQLn6o2mFEw4t50tk530oKsYXQhEzKR+xNGDxs/SFFuyTO7X3NzEu4usA3w5jzhl2RYyzQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.6.tgz", + "integrity": "sha512-ojdlG8WpM394lBow4ncTGJoIVZ4aAtNOWHhfAM7m7zprmkVcKK+2kK5YJ9Bmj6/ketTtOn7wGSHCtMt+LzqgYQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.6.tgz", + "integrity": "sha512-oId+tLxQ+AeDC34ELRYNSqJRaScB0TClUU6KQfpB8rNT6oelYlz8axsPhf6yPTg7PBJ/Z5WcXmUYiHEWgbbHJw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz", + "integrity": "sha512-pTNjLO3o41v/Vz9VFLl+I3YLImpCSpodFW77pNoH4agn5I6GgSxXHXtvWDTvYJFty0jSeXZWLEmbaSIRUDlekg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-buffer": "1.7.6", + "@webassemblyjs/helper-wasm-bytecode": "1.7.6", + "@webassemblyjs/helper-wasm-section": "1.7.6", + "@webassemblyjs/wasm-gen": "1.7.6", + "@webassemblyjs/wasm-opt": "1.7.6", + "@webassemblyjs/wasm-parser": "1.7.6", + "@webassemblyjs/wast-printer": "1.7.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz", + "integrity": "sha512-mQvFJVumtmRKEUXMohwn8nSrtjJJl6oXwF3FotC5t6e2hlKMh8sIaW03Sck2MDzw9xPogZD7tdP5kjPlbH9EcQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-wasm-bytecode": "1.7.6", + "@webassemblyjs/ieee754": "1.7.6", + "@webassemblyjs/leb128": "1.7.6", + "@webassemblyjs/utf8": "1.7.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz", + "integrity": "sha512-go44K90fSIsDwRgtHhX14VtbdDPdK2sZQtZqUcMRvTojdozj5tLI0VVJAzLCfz51NOkFXezPeVTAYFqrZ6rI8Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-buffer": "1.7.6", + "@webassemblyjs/wasm-gen": "1.7.6", + "@webassemblyjs/wasm-parser": "1.7.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz", + "integrity": "sha512-t1T6TfwNY85pDA/HWPA8kB9xA4sp9ajlRg5W7EKikqrynTyFo+/qDzIpvdkOkOGjlS6d4n4SX59SPuIayR22Yg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-api-error": "1.7.6", + "@webassemblyjs/helper-wasm-bytecode": "1.7.6", + "@webassemblyjs/ieee754": "1.7.6", + "@webassemblyjs/leb128": "1.7.6", + "@webassemblyjs/utf8": "1.7.6" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz", + "integrity": "sha512-1MaWTErN0ziOsNUlLdvwS+NS1QWuI/kgJaAGAMHX8+fMJFgOJDmN/xsG4h/A1Gtf/tz5VyXQciaqHZqp2q0vfg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/floating-point-hex-parser": "1.7.6", + "@webassemblyjs/helper-api-error": "1.7.6", + "@webassemblyjs/helper-code-frame": "1.7.6", + "@webassemblyjs/helper-fsm": "1.7.6", + "@xtuc/long": "4.2.1", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz", + "integrity": "sha512-vHdHSK1tOetvDcl1IV1OdDeGNe/NDDQ+KzuZHMtqTVP1xO/tZ/IKNpj5BaGk1OYFdsDWQqb31PIwdEyPntOWRQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/wast-parser": "1.7.6", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "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": "^5.0.0" + } + }, + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "ansi-colors": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", + "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "app-root-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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 + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.4.1.tgz", + "integrity": "sha512-YqUclCBDXUT9Y7aQ8Xv+ja8yhTZYJoMsOD7WS++gZIJLCpCu+gPcKGDlhk6S3WxhLkTcNVdaMZAWys2nzZCH7g==", + "dev": true, + "requires": { + "browserslist": "^3.2.6", + "caniuse-lite": "^1.0.30000832", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.22", + "postcss-value-parser": "^3.2.3" + } + }, + "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=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.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" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "brace": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "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.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "browserstack": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", + "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "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", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000898", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000898.tgz", + "integrity": "sha512-ytlTZqO4hYe4rNAJhMynUAIUI33jsP2Bb1two/9OVC39wZjPZ8exIO0eCLw5mqAtegOGiGF0kkTWTn3B02L+mw==", + "dev": true + }, + "canonical-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", + "integrity": "sha1-4x65N6jJPuKgHfGDl5RyGQKHRXQ=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, + "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" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "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": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "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 + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", + "dev": true, + "requires": { + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", + "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, + "requires": { + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.3.tgz", + "integrity": "sha512-VKCiNXQcc8zyznaepXfKpCH2cZD+/j3T3B+gsFY97P7qMlEsj34wr/sI9OCG7QPUUh7gAHVx3q8Q1rdQIDM4bA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.81", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.81.tgz", + "integrity": "sha512-+rym2xtzwPWmoi8AYRrCdW65QOT0vfUHjZb5mjgh0VLyj31pGM3CpP3znKhQNBzQaWujR/KEl/mfC2lnKYgADA==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "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" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "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" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "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", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "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" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "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" + } + } + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "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" + } + }, + "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" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.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" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", + "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "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" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "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", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "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" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + } + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "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": "http://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.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "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-middleware": { + "version": "0.18.0", + "resolved": "http://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" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "injection-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", + "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", + "dev": true + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "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", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.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" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "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" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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=" + }, + "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": { + "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 + }, + "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" + } + } + } + }, + "istanbul-api": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.6.tgz", + "integrity": "sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-hook": "^2.0.1", + "istanbul-lib-instrument": "^3.0.0", + "istanbul-lib-report": "^2.0.2", + "istanbul-lib-source-maps": "^2.0.1", + "istanbul-reports": "^2.0.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", + "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.1", + "semver": "^5.5.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "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" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "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" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + } + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "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 + } + } + }, + "istanbul-reports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.2.1.tgz", + "integrity": "sha512-pa9tbBWgU0EE4SWgc85T4sa886ufuQdsgruQANhECYjwqgV4z7Vw/499aCaP8ZH79JDS4vhm8doDG9HO4+e4sA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "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" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "dev": true, + "requires": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "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 + } + } + }, + "karma": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.1.tgz", + "integrity": "sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^3.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "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 + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz", + "integrity": "sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw==", + "dev": true, + "requires": { + "istanbul-api": "^2.0.5", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.3.1.tgz", + "integrity": "sha512-J8pUc58QeRhpHQ+sXBRZ016ZW9ZOjU4vjYA6Jah69WvBaqR7tGvXUzy7w/DoULbNrD8+hnZCpvdeEtqXtirY2g==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "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 + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", + "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "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, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "promise": { + "version": "7.0.4", + "resolved": "http://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "license-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-XUSJoU+M2w/N5ZdzHm++mFSM2BVKAdnSORXF7nbkpBJVdfi3hiiMpNdiuUR7S4OvsceiXQp1yoBwhiAP+gtC2g==", + "dev": true, + "requires": { + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "optional": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "dev": true, + "requires": { + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "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": { + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz", + "integrity": "sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.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", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "ng-packagr": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-4.4.0.tgz", + "integrity": "sha512-dLpC/kmQsdbkL96ZclGjNRhq/J4MwpPKwPYNom74lvXqFC2jbbT/fnwmxX9WKXjvE8MEGsg2D2x8MsRURiNscg==", + "dev": true, + "requires": { + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^9.0.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^2.0.3", + "clean-css": "^4.1.11", + "commander": "^2.12.0", + "fs-extra": "^7.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass": "^4.9.3", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^4.0.0", + "rimraf": "^2.6.1", + "rollup": "^0.66.0", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-json": "^3.1.0", + "rollup-plugin-node-resolve": "^3.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "stylus": "^0.54.5", + "uglify-js": "^3.0.7", + "update-notifier": "^2.3.0" + }, + "dependencies": { + "autoprefixer": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.3.0.tgz", + "integrity": "sha512-rpp+REfk0Ii3lCoiXhU4+CGYn8FbYckmvj6JJbJGSdzaxYCGJ7EvpHncDqgfAn/P6XhWig4u9BBNnsFAfAd5wg==", + "dev": true, + "requires": { + "browserslist": "^4.3.2", + "caniuse-lite": "^1.0.30000898", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.5", + "postcss-value-parser": "^3.3.1" + } + }, + "browserslist": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.2.tgz", + "integrity": "sha512-wgZJWlYcDvsjRtf8socmAHf1nXq88KrQLB/gMYHGPUc2bzPWsgltSXwPWYHx4Sw0G9E/XGNW5wJDaWlpHRMpjA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000898", + "electron-to-chromium": "^1.3.80", + "node-releases": "^1.0.0-alpha.14" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.14.tgz", + "integrity": "sha512-G8nnF9cP9QPP/jUmYWw/uUUhumHmkm+X/EarCugYFjYm2uXRMFeOD6CVT3RLdoyCvDUNy51nirGfUItKWs/S1g==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-sass": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "dev": true, + "requires": { + "find-parent-dir": "^0.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "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", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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" + } + }, + "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" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "http://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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", + "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "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", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "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 + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, + "requires": { + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "postcss": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protractor": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.1.tgz", + "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", + "dev": true, + "requires": { + "@types/node": "^6.0.46", + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "@types/node": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.0.tgz", + "integrity": "sha512-6tQyh4Q4B5pECcXBOQDZ5KjyBIxRZGzrweGPM47sAYTdVG4+7R+2EGMTmp0h6ZwgqHrFRCeg2gdhsG9xXEl2Sg==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", + "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": 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==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "0.66.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", + "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*" + } + }, + "rollup-plugin-commonjs": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.2.0.tgz", + "integrity": "sha512-0RM5U4Vd6iHjL6rLvr3lKBwnPsaVml+qxOGaaNUWN1lSq6S33KhITOfHmvxV3z2vy9Mk4t0g4rNlVaJJsNQPWA==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "magic-string": "^0.25.1", + "resolve": "^1.8.1", + "rollup-pluginutils": "^2.3.3" + }, + "dependencies": { + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, + "rollup-plugin-json": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz", + "integrity": "sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.3.1" + } + }, + "rollup-plugin-node-resolve": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true + } + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-pluginutils": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "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" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^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" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "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 + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.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" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "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" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.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" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "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" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "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" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "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-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", + "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + } + }, + "speed-measure-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", + "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stats-webpack-plugin": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz", + "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.0.tgz", + "integrity": "sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "terser": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.2.tgz", + "integrity": "sha512-+QrFoqBImmsQGB4c/HvaqgZynmbNvNBwoBxuu7fYXtq5EEtlLUzph+WimDj+xMkuqawXPMl2lgCIz81CdXvt+w==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "cacache": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", + "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.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" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.33.0.tgz", + "integrity": "sha512-ww4jhOaKhHHjZzs+dm381hffl1GOHhfA3LgbSoHMogWKm5mazpglVhMl1zJrSzOdhYHlZvrT7hRWCbGptzIpSA==", + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.7.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tslint": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + }, + "dependencies": { + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.3.tgz", + "integrity": "sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^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 + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "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" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "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", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "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-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "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", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.19.1.tgz", + "integrity": "sha512-j7Q/5QqZRqIFXJvC0E59ipLV5Hf6lAnS3ezC3I4HMUybwEDikQBVad5d+IpPtmaQPQArvgUZLXIN6lWijHBn4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.6", + "@webassemblyjs/helper-module-context": "1.7.6", + "@webassemblyjs/wasm-edit": "1.7.6", + "@webassemblyjs/wasm-parser": "1.7.6", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "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", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.2.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz", + "integrity": "sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "ws": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz", + "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.3.0.tgz", + "integrity": "sha512-5C5gXtOo1I6+0AEg4UPglYEtu3Rai6l5IiO6aUu65scHXz29dc3oIWMiRwvcNLXgL0HwRkRxa9N02ZjFt4hY8w==", + "dev": true, + "requires": { + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "url-join": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "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": "3.1.8", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz", + "integrity": "sha512-c+tcJtDqnPdxCAzEEZKdIPmg3i5i7cAHe+B+0xFNK0BlCc2HF/unYccbU7xTgfGc5xxhCztCQzFmsqim+KhI+A==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "3.2.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.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 + }, + "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": "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.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz", + "integrity": "sha512-YJLMF/96TpKXaEQwaLEo+Z4NDK8aV133ROF6xp9pe3gQoS7sxfpXh4Rv9eC+8vCvWfmDjRQaMSlRPbO+9G6jgA==", + "dev": true, + "requires": { + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "url-join": "^4.0.0", + "webpack-log": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.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 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "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, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.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 + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "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", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + } + } + }, + "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=", + "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=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + } + } +} diff --git a/frontend/package.json b/frontend/package.json index f77262bed..46363d991 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,50 +1,89 @@ { - "name": "frontend", - "version": "0.0.0", + "name": "angular7-json-schema-form-app", + "version": "1.0.0", + "author": "https://github.com/adampenn/Angular7-json-schema-form/graphs/contributors", + "description": "Angular JSON Schema Form builder Demo", + "engines": { + "node": ">=8.9.0", + "yarn": ">=1.3.0" + }, + "keywords": [ + "Angular", + "ng", + "Angular7", + "Angular 7", + "ng6", + "JSON Schema", + "form", + "forms", + "form builder" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/adampenn/angular7-json-schema-form" + }, + "bugs": { + "url": "https://github.com/adampenn/angular7-json-schema-form/issues" + }, + "homepage": "https://github.com/adampenn/Angular7-json-schema-form#readme", "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", + "start-prod": "ng serve --prod", + "build": "ng build --prod --base-href ./", + "buildlib": "ng build angular7-json-schema-form --prod", + "postbuildlib": "cp README.md LICENSE dist/angular7-json-schema-form/", + "prestats": "ng build --prod --stats-json", + "stats": "webpack-bundle-analyzer dist/angular7-json-schema-form-app/stats.json", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, - "private": true, "dependencies": { - "@ajsf/material": "^0.1.3", - "@angular/animations": "~9.0.0", - "@angular/cdk": "~9.0.0-rc.10", - "@angular/common": "~9.0.0", - "@angular/compiler": "~9.0.0", - "@angular/core": "~9.0.0", - "@angular/forms": "~9.0.0", - "@angular/material": "~9.0.0-rc.10", - "@angular/platform-browser": "~9.0.0", - "@angular/platform-browser-dynamic": "~9.0.0", - "@angular/router": "~9.0.0", - "rxjs": "~6.5.4", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" + "@angular/animations": "^7.0.0", + "@angular/cdk": "^7.0.1", + "@angular/common": "^7.0.0", + "@angular/compiler": "^7.0.0", + "@angular/core": "^7.0.0", + "@angular/flex-layout": "^7.0.0-beta.19", + "@angular/forms": "^7.0.0", + "@angular/http": "^7.0.0", + "@angular/material": "^7.0.1", + "@angular/platform-browser": "^7.0.0", + "@angular/platform-browser-dynamic": "^7.0.0", + "@angular/router": "^7.0.0", + "brace": "^0.11.1", + "core-js": "^2.5.4", + "node-sass": "^4.13.1", + "rxjs": "^6.0.0", + "tsickle": "^0.33.0", + "zone.js": "^0.8.26" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.900.1", - "@angular/cli": "~9.0.1", - "@angular/compiler-cli": "~9.0.0", - "@angular/language-service": "~9.0.0", - "@types/jasmine": "~3.5.0", + "@angular-devkit/build-angular": "~0.10.2", + "@angular-devkit/build-ng-packagr": "~0.10.2", + "@angular/cli": "~7.0.2", + "@angular/compiler-cli": "^7.0.0", + "@angular/language-service": "^7.0.0", + "@types/jasmine": "~2.8.6", "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", - "jasmine-core": "~3.5.0", + "@types/lodash": "^4.14.110", + "@types/node": "~10.12.0", + "codelyzer": "~4.5.0", + "jasmine-core": "~3.2.1", "jasmine-spec-reporter": "~4.2.1", - "karma": "~4.3.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "protractor": "~5.4.3", - "ts-node": "~8.3.0", - "tslint": "~5.18.0", - "typescript": "~3.7.5" + "karma": "~3.1.1", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.0", + "karma-jasmine": "~1.1.1", + "karma-jasmine-html-reporter": "^1.3.1", + "ng-packagr": "^4.4.0", + "protractor": "~5.4.1", + "ts-node": "~7.0.1", + "tslib": "^1.9.0", + "tslint": "~5.11.0", + "typescript": "~3.1.3", + "webpack-bundle-analyzer": "^3.0.3" } } diff --git a/frontend/karma.conf.js b/frontend/projects/angular7-json-schema-form/karma.conf.js similarity index 83% rename from frontend/karma.conf.js rename to frontend/projects/angular7-json-schema-form/karma.conf.js index d26663c10..4c5f8d03f 100644 --- a/frontend/karma.conf.js +++ b/frontend/projects/angular7-json-schema-form/karma.conf.js @@ -16,8 +16,8 @@ module.exports = function (config) { clearContext: false // leave Jasmine Spec Runner output visible in browser }, coverageIstanbulReporter: { - dir: require('path').join(__dirname, './coverage/frontend'), - reports: ['html', 'lcovonly', 'text-summary'], + dir: require('path').join(__dirname, '../../coverage'), + reports: ['html', 'lcovonly'], fixWebpackSourcePaths: true }, reporters: ['progress', 'kjhtml'], @@ -26,7 +26,6 @@ module.exports = function (config) { logLevel: config.LOG_INFO, autoWatch: true, browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true + singleRun: false }); }; diff --git a/frontend/projects/angular7-json-schema-form/ng-package.json b/frontend/projects/angular7-json-schema-form/ng-package.json new file mode 100644 index 000000000..75f12e577 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/angular7-json-schema-form", + "deleteDestPath": false, + "lib": { + "entryFile": "src/public_api.ts" + } +} diff --git a/frontend/projects/angular7-json-schema-form/ng-package.prod.json b/frontend/projects/angular7-json-schema-form/ng-package.prod.json new file mode 100644 index 000000000..6c24a86a5 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/ng-package.prod.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/angular7-json-schema-form", + "lib": { + "entryFile": "src/public_api.ts" + } +} \ No newline at end of file diff --git a/frontend/projects/angular7-json-schema-form/package-lock.json b/frontend/projects/angular7-json-schema-form/package-lock.json new file mode 100644 index 000000000..776238744 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "angular7-json-schema-form", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/frontend/projects/angular7-json-schema-form/package.json b/frontend/projects/angular7-json-schema-form/package.json new file mode 100644 index 000000000..45bff291e --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/package.json @@ -0,0 +1,37 @@ +{ + "name": "angular7-json-schema-form", + "version": "1.0.0", + "description": "Angular JSON Schema Form builder", + "author": "https://github.com/adampenn/Angular7-json-schema-form/graphs/contributors", + "keywords": [ + "Angular", + "ng", + "Angular6", + "Angular 6", + "ng6", + "JSON Schema", + "form", + "forms", + "form builder" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/adampenn/angular7-json-schema-form" + }, + "bugs": { + "url": "https://github.com/adampenn/angular7-json-schema-form/issues" + }, + "private": false, + "peerDependencies": { + "@angular/common": "^7.0.0", + "@angular/core": "^7.0.0", + "@angular/forms": "^7.0.0", + "@angular/platform-browser": "^7.0.0", + "@angular/material": "^7.0.1", + "@angular/flex-layout": "^7.0.0-beta.19", + "rxjs": "^6.0.0", + "ajv": "^6.0.1", + "lodash": "^4.17.4" + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.component.ts new file mode 100644 index 000000000..8256de920 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.component.ts @@ -0,0 +1,316 @@ +import _ from 'lodash'; +import { addClasses, inArray } from '../../shared'; +import { + ChangeDetectorRef, + Component, + Input, + OnChanges, + OnInit + } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + + + +/** + * Bootstrap 3 framework for Angular JSON Schema Form. + * + */ +@Component({ + // tslint:disable-next-line:component-selector + selector: 'bootstrap-3-framework', + template: ` +
+ + +
+

+
+ + +

+ * = required fields +

+
+ + + + + +
+ + +
+

+
+
+ +
debug:
{{debugOutput}}
+ `, + styles: [` + :host /deep/ .list-group-item .form-control-feedback { top: 40; } + :host /deep/ .checkbox, + :host /deep/ .radio { margin-top: 0; margin-bottom: 0; } + :host /deep/ .checkbox-inline, + :host /deep/ .checkbox-inline + .checkbox-inline, + :host /deep/ .checkbox-inline + .radio-inline, + :host /deep/ .radio-inline, + :host /deep/ .radio-inline + .radio-inline, + :host /deep/ .radio-inline + .checkbox-inline { margin-left: 0; margin-right: 10px; } + :host /deep/ .checkbox-inline:last-child, + :host /deep/ .radio-inline:last-child { margin-right: 0; } + :host /deep/ .ng-invalid.ng-touched { border: 1px solid #f44336; } + `], +}) +export class Bootstrap3FrameworkComponent implements OnInit, OnChanges { + frameworkInitialized = false; + widgetOptions: any; // Options passed to child widget + widgetLayoutNode: any; // layoutNode passed to child widget + options: any; // Options used in this framework + formControl: any = null; + debugOutput: any = ''; + debug: any = ''; + parentArray: any = null; + isOrderable = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + public changeDetector: ChangeDetectorRef, + public jsf: JsonSchemaFormService + ) { } + + get showRemoveButton(): boolean { + if (!this.options.removable || this.options.readonly || + this.layoutNode.type === '$ref' + ) { return false; } + if (this.layoutNode.recursiveReference) { return true; } + if (!this.layoutNode.arrayItem || !this.parentArray) { return false; } + // If array length <= minItems, don't allow removing any items + return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false : + // For removable list items, allow removing any item + this.layoutNode.arrayItemType === 'list' ? true : + // For removable tuple items, only allow removing last item in list + this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2; + } + + ngOnInit() { + this.initializeFramework(); + if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') { + this.parentArray = this.jsf.getParentNode(this); + if (this.parentArray) { + this.isOrderable = this.layoutNode.arrayItemType === 'list' && + !this.options.readonly && this.parentArray.options.orderable; + } + } + } + + ngOnChanges() { + if (!this.frameworkInitialized) { this.initializeFramework(); } + } + + initializeFramework() { + if (this.layoutNode) { + this.options = _.cloneDeep(this.layoutNode.options); + if (!this.options) { + this.options = {}; + } + this.widgetLayoutNode = { + ...this.layoutNode, + options: _.cloneDeep(this.layoutNode.options) + }; + this.widgetOptions = this.widgetLayoutNode.options; + if (!this.widgetOptions) { + this.widgetOptions = {}; + } + this.formControl = this.jsf.getFormControl(this); + + this.options.isInputWidget = inArray(this.layoutNode.type, [ + 'button', 'checkbox', 'checkboxes-inline', 'checkboxes', 'color', + 'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden', + 'image', 'integer', 'month', 'number', 'password', 'radio', + 'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search', + 'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week' + ]); + + this.options.title = this.setTitle(); + + this.options.htmlClass = + addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type); + if (this.layoutNode.type !== 'flex') { + this.options.htmlClass = + this.layoutNode.type === 'array' ? + addClasses(this.options.htmlClass, 'list-group') : + this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ? + addClasses(this.options.htmlClass, 'list-group-item') : + addClasses(this.options.htmlClass, 'form-group'); + } + this.widgetOptions.htmlClass = ''; + this.options.labelHtmlClass = + addClasses(this.options.labelHtmlClass, 'control-label'); + this.widgetOptions.activeClass = + addClasses(this.widgetOptions.activeClass, 'active'); + this.options.fieldAddonLeft = + this.options.fieldAddonLeft || this.options.prepend; + this.options.fieldAddonRight = + this.options.fieldAddonRight || this.options.append; + + // Add asterisk to titles if required + if (this.options.title && this.layoutNode.type !== 'tab' && + !this.options.notitle && this.options.required && + !this.options.title.includes('*') + ) { + this.options.title += ' *'; + } + // Set miscelaneous styles and settings for each control type + switch (this.layoutNode.type) { + // Checkbox controls + case 'checkbox': case 'checkboxes': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'checkbox'); + break; + case 'checkboxes-inline': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'checkbox'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'checkbox-inline'); + break; + // Radio controls + case 'radio': case 'radios': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'radio'); + break; + case 'radios-inline': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'radio'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'radio-inline'); + break; + // Button sets - checkboxbuttons and radiobuttons + case 'checkboxbuttons': case 'radiobuttons': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'btn-group'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'btn'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, this.options.style || 'btn-default'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'sr-only'); + break; + // Single button controls + case 'button': case 'submit': + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'btn'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-info'); + break; + // Containers - arrays and fieldsets + case 'array': case 'fieldset': case 'section': case 'conditional': + case 'advancedfieldset': case 'authfieldset': + case 'selectfieldset': case 'optionfieldset': + this.options.messageLocation = 'top'; + break; + case 'tabarray': case 'tabs': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'tab-content'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'tab-pane'); + this.widgetOptions.labelHtmlClass = addClasses( + this.widgetOptions.labelHtmlClass, 'nav nav-tabs'); + break; + // 'Add' buttons - references + case '$ref': + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'btn pull-right'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-default'); + this.options.icon = 'glyphicon glyphicon-plus'; + break; + // Default - including regular inputs + default: + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'form-control'); + } + + if (this.formControl) { + this.updateHelpBlock(this.formControl.status); + this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status)); + + if (this.options.debug) { + const vars: any[] = []; + this.debugOutput = _.map(vars, thisVar => JSON.stringify(thisVar, null, 2)).join('\n'); + } + } + this.frameworkInitialized = true; + } + + } + + updateHelpBlock(status) { + this.options.helpBlock = status === 'INVALID' && + this.options.enableErrorState && this.formControl.errors && + (this.formControl.dirty || this.options.feedbackOnRender) ? + this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) : + this.options.description || this.options.help || null; + } + + setTitle(): string { + switch (this.layoutNode.type) { + case 'button': case 'checkbox': case 'section': case 'help': case 'msg': + case 'submit': case 'message': case 'tabarray': case 'tabs': case '$ref': + return null; + case 'advancedfieldset': + this.widgetOptions.expandable = true; + this.widgetOptions.title = 'Advanced options'; + return null; + case 'authfieldset': + this.widgetOptions.expandable = true; + this.widgetOptions.title = 'Authentication settings'; + return null; + case 'fieldset': + this.widgetOptions.title = this.options.title; + return null; + default: + this.widgetOptions.title = null; + return this.jsf.setItemTitle(this); + } + } + + removeItem() { + this.jsf.removeItem(this); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.module.ts new file mode 100644 index 000000000..ba4097337 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3-framework.module.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { JsonSchemaFormModule } from '../../json-schema-form.module'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { WidgetLibraryModule } from '../../widget-library/widget-library.module'; +import { WidgetLibraryService } from '../../widget-library/widget-library.service'; +import { Framework } from '../framework'; +import { FrameworkLibraryService } from '../framework-library.service'; +import { Bootstrap3FrameworkComponent } from './bootstrap-3-framework.component'; +import { Bootstrap3Framework } from './bootstrap-3.framework'; + + + + +@NgModule({ + imports: [JsonSchemaFormModule, CommonModule, WidgetLibraryModule], + declarations: [Bootstrap3FrameworkComponent], + exports: [JsonSchemaFormModule, Bootstrap3FrameworkComponent], + providers: [JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService, + { provide: Framework, useClass: Bootstrap3Framework, multi: true } + ], + entryComponents: [Bootstrap3FrameworkComponent] +}) +export class Bootstrap3FrameworkModule { } diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3.framework.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3.framework.ts new file mode 100644 index 000000000..8e6ea9b25 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-3-framework/bootstrap-3.framework.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { Framework } from '../framework'; +import { Bootstrap3FrameworkComponent } from './bootstrap-3-framework.component'; + + +// Bootstrap 3 Framework +// https://github.com/valor-software/ng2-bootstrap + +@Injectable() +export class Bootstrap3Framework extends Framework { + name = 'bootstrap-3'; + + framework = Bootstrap3FrameworkComponent; + + stylesheets = [ + '//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css', + '//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css', + ]; + + scripts = [ + '//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js', + '//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js', + '//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js', + ]; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.component.ts new file mode 100644 index 000000000..1f8b0e073 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.component.ts @@ -0,0 +1,312 @@ +import _ from 'lodash'; +import { addClasses, inArray } from '../../shared'; +import { + ChangeDetectorRef, + Component, + Input, + OnChanges, + OnInit + } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +/** + * Bootstrap 4 framework for Angular JSON Schema Form. + * + */ +@Component({ + // tslint:disable-next-line:component-selector + selector: 'bootstrap-4-framework', + template: ` +
+ + +
+

+
+ + +

+ * = required fields +

+
+ + + + + +
+ + +
+

+
+
+ +
debug:
{{debugOutput}}
+ `, + styles: [` + :host /deep/ .list-group-item .form-control-feedback { top: 40px; } + :host /deep/ .checkbox, + :host /deep/ .radio { margin-top: 0; margin-bottom: 0; } + :host /deep/ .checkbox-inline, + :host /deep/ .checkbox-inline + .checkbox-inline, + :host /deep/ .checkbox-inline + .radio-inline, + :host /deep/ .radio-inline, + :host /deep/ .radio-inline + .radio-inline, + :host /deep/ .radio-inline + .checkbox-inline { margin-left: 0; margin-right: 10px; } + :host /deep/ .checkbox-inline:last-child, + :host /deep/ .radio-inline:last-child { margin-right: 0; } + :host /deep/ .ng-invalid.ng-touched { border: 1px solid #f44336; } + `], +}) +export class Bootstrap4FrameworkComponent implements OnInit, OnChanges { + frameworkInitialized = false; + widgetOptions: any; // Options passed to child widget + widgetLayoutNode: any; // layoutNode passed to child widget + options: any; // Options used in this framework + formControl: any = null; + debugOutput: any = ''; + debug: any = ''; + parentArray: any = null; + isOrderable = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + public changeDetector: ChangeDetectorRef, + public jsf: JsonSchemaFormService + ) { } + + get showRemoveButton(): boolean { + if (!this.options.removable || this.options.readonly || + this.layoutNode.type === '$ref' + ) { return false; } + if (this.layoutNode.recursiveReference) { return true; } + if (!this.layoutNode.arrayItem || !this.parentArray) { return false; } + // If array length <= minItems, don't allow removing any items + return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false : + // For removable list items, allow removing any item + this.layoutNode.arrayItemType === 'list' ? true : + // For removable tuple items, only allow removing last item in list + this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2; + } + + ngOnInit() { + this.initializeFramework(); + if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') { + this.parentArray = this.jsf.getParentNode(this); + if (this.parentArray) { + this.isOrderable = this.layoutNode.arrayItemType === 'list' && + !this.options.readonly && this.parentArray.options.orderable; + } + } + } + + ngOnChanges() { + if (!this.frameworkInitialized) { this.initializeFramework(); } + } + + initializeFramework() { + if (this.layoutNode) { + this.options = _.cloneDeep(this.layoutNode.options); + if (!this.options) { + this.options = {}; + } + this.widgetLayoutNode = { + ...this.layoutNode, + options: _.cloneDeep(this.layoutNode.options) + }; + this.widgetOptions = this.widgetLayoutNode.options; + if (!this.widgetOptions) { + this.widgetOptions = {}; + } + this.formControl = this.jsf.getFormControl(this); + + this.options.isInputWidget = inArray(this.layoutNode.type, [ + 'button', 'checkbox', 'checkboxes-inline', 'checkboxes', 'color', + 'date', 'datetime-local', 'datetime', 'email', 'file', 'hidden', + 'image', 'integer', 'month', 'number', 'password', 'radio', + 'radiobuttons', 'radios-inline', 'radios', 'range', 'reset', 'search', + 'select', 'submit', 'tel', 'text', 'textarea', 'time', 'url', 'week' + ]); + + this.options.title = this.setTitle(); + + this.options.htmlClass = + addClasses(this.options.htmlClass, 'schema-form-' + this.layoutNode.type); + this.options.htmlClass = + this.layoutNode.type === 'array' ? + addClasses(this.options.htmlClass, 'list-group') : + this.layoutNode.arrayItem && this.layoutNode.type !== '$ref' ? + addClasses(this.options.htmlClass, 'list-group-item') : + addClasses(this.options.htmlClass, 'form-group'); + this.widgetOptions.htmlClass = ''; + this.options.labelHtmlClass = + addClasses(this.options.labelHtmlClass, 'control-label'); + this.widgetOptions.activeClass = + addClasses(this.widgetOptions.activeClass, 'active'); + this.options.fieldAddonLeft = + this.options.fieldAddonLeft || this.options.prepend; + this.options.fieldAddonRight = + this.options.fieldAddonRight || this.options.append; + + // Add asterisk to titles if required + if (this.options.title && this.layoutNode.type !== 'tab' && + !this.options.notitle && this.options.required && + !this.options.title.includes('*') + ) { + this.options.title += ' *'; + } + // Set miscelaneous styles and settings for each control type + switch (this.layoutNode.type) { + // Checkbox controls + case 'checkbox': case 'checkboxes': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'checkbox'); + break; + case 'checkboxes-inline': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'checkbox'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'checkbox-inline'); + break; + // Radio controls + case 'radio': case 'radios': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'radio'); + break; + case 'radios-inline': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'radio'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'radio-inline'); + break; + // Button sets - checkboxbuttons and radiobuttons + case 'checkboxbuttons': case 'radiobuttons': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'btn-group'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, 'btn'); + this.widgetOptions.itemLabelHtmlClass = addClasses( + this.widgetOptions.itemLabelHtmlClass, this.options.style || 'btn-default'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'sr-only'); + break; + // Single button controls + case 'button': case 'submit': + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'btn'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-info'); + break; + // Containers - arrays and fieldsets + case 'array': case 'fieldset': case 'section': case 'conditional': + case 'advancedfieldset': case 'authfieldset': + case 'selectfieldset': case 'optionfieldset': + this.options.messageLocation = 'top'; + break; + case 'tabarray': case 'tabs': + this.widgetOptions.htmlClass = addClasses( + this.widgetOptions.htmlClass, 'tab-content'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'tab-pane'); + this.widgetOptions.labelHtmlClass = addClasses( + this.widgetOptions.labelHtmlClass, 'nav nav-tabs'); + break; + // 'Add' buttons - references + case '$ref': + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'btn pull-right'); + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, this.options.style || 'btn-default'); + this.options.icon = 'glyphicon glyphicon-plus'; + break; + // Default - including regular inputs + default: + this.widgetOptions.fieldHtmlClass = addClasses( + this.widgetOptions.fieldHtmlClass, 'form-control'); + } + + if (this.formControl) { + this.updateHelpBlock(this.formControl.status); + this.formControl.statusChanges.subscribe(status => this.updateHelpBlock(status)); + + if (this.options.debug) { + const vars: any[] = []; + this.debugOutput = _.map(vars, thisVar => JSON.stringify(thisVar, null, 2)).join('\n'); + } + } + this.frameworkInitialized = true; + } + + } + + updateHelpBlock(status) { + this.options.helpBlock = status === 'INVALID' && + this.options.enableErrorState && this.formControl.errors && + (this.formControl.dirty || this.options.feedbackOnRender) ? + this.jsf.formatErrors(this.formControl.errors, this.options.validationMessages) : + this.options.description || this.options.help || null; + } + + setTitle(): string { + switch (this.layoutNode.type) { + case 'button': case 'checkbox': case 'section': case 'help': case 'msg': + case 'submit': case 'message': case 'tabarray': case 'tabs': case '$ref': + return null; + case 'advancedfieldset': + this.widgetOptions.expandable = true; + this.widgetOptions.title = 'Advanced options'; + return null; + case 'authfieldset': + this.widgetOptions.expandable = true; + this.widgetOptions.title = 'Authentication settings'; + return null; + case 'fieldset': + this.widgetOptions.title = this.options.title; + return null; + default: + this.widgetOptions.title = null; + return this.jsf.setItemTitle(this); + } + } + + removeItem() { + this.jsf.removeItem(this); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.module.ts new file mode 100644 index 000000000..e00dbabe5 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4-framework.module.ts @@ -0,0 +1,22 @@ +import { Bootstrap4Framework } from './bootstrap-4.framework'; +import { Bootstrap4FrameworkComponent } from './bootstrap-4-framework.component'; +import { CommonModule } from '@angular/common'; +import { Framework } from '../framework'; +import { FrameworkLibraryService } from '../framework-library.service'; +import { JsonSchemaFormModule } from '../../json-schema-form.module'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { NgModule } from '@angular/core'; +import { WidgetLibraryModule } from '../../widget-library/widget-library.module'; +import { WidgetLibraryService } from '../../widget-library/widget-library.service'; + + +@NgModule({ + imports: [JsonSchemaFormModule, CommonModule, WidgetLibraryModule], + declarations: [Bootstrap4FrameworkComponent], + exports: [JsonSchemaFormModule, Bootstrap4FrameworkComponent], + providers: [JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService, + { provide: Framework, useClass: Bootstrap4Framework, multi: true } + ], + entryComponents: [Bootstrap4FrameworkComponent] +}) +export class Bootstrap4FrameworkModule { } diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4.framework.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4.framework.ts new file mode 100644 index 000000000..a27de7788 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/bootstrap-4-framework/bootstrap-4.framework.ts @@ -0,0 +1,23 @@ +import { Bootstrap4FrameworkComponent } from './bootstrap-4-framework.component'; +import { Framework } from '../framework'; +import { Injectable } from '@angular/core'; + +// Bootstrap 4 Framework +// https://github.com/ng-bootstrap/ng-bootstrap + +@Injectable() +export class Bootstrap4Framework extends Framework { + name = 'bootstrap-4'; + + framework = Bootstrap4FrameworkComponent; + + stylesheets = [ + '//maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css' + ]; + + scripts = [ + '//code.jquery.com/jquery-3.2.1.slim.min.js', + '//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js', + '//maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js', + ]; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework-library.service.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework-library.service.ts new file mode 100644 index 000000000..cb9e2fa9b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework-library.service.ts @@ -0,0 +1,82 @@ +import { Framework } from './framework'; +import { hasOwn } from '../shared/utility.functions'; +import { Inject, Injectable } from '@angular/core'; +import { WidgetLibraryService } from '../widget-library/widget-library.service'; + +// Possible future frameworks: +// - Foundation 6: +// http://justindavis.co/2017/06/15/using-foundation-6-in-angular-4/ +// https://github.com/zurb/foundation-sites +// - Semantic UI: +// https://github.com/edcarroll/ng2-semantic-ui +// https://github.com/vladotesanovic/ngSemantic + +@Injectable() +export class FrameworkLibraryService { + activeFramework: Framework = null; + stylesheets: (HTMLStyleElement|HTMLLinkElement)[]; + scripts: HTMLScriptElement[]; + loadExternalAssets = false; + defaultFramework: string; + frameworkLibrary: { [name: string]: Framework } = {}; + + constructor( + @Inject(Framework) private frameworks: any[], + @Inject(WidgetLibraryService) private widgetLibrary: WidgetLibraryService + ) { + this.frameworks.forEach(framework => + this.frameworkLibrary[framework.name] = framework + ); + this.defaultFramework = this.frameworks[0].name; + this.setFramework(this.defaultFramework); + } + + public setLoadExternalAssets(loadExternalAssets = true): void { + // Sometimes loadExternalAssets is coming across as a string so check for that. + if (typeof loadExternalAssets === 'string') { + const stringLoadExternalAssets = loadExternalAssets as string; + loadExternalAssets = stringLoadExternalAssets.toLowerCase() === 'false' ? false : true; + } + this.loadExternalAssets = !!loadExternalAssets; + } + + public setFramework( + framework: string|Framework = this.defaultFramework, + loadExternalAssets = this.loadExternalAssets + ): boolean { + this.activeFramework = + typeof framework === 'string' && this.hasFramework(framework) ? + this.frameworkLibrary[framework] : + typeof framework === 'object' && hasOwn(framework, 'framework') ? + framework : + this.frameworkLibrary[this.defaultFramework]; + return this.registerFrameworkWidgets(this.activeFramework); + } + + registerFrameworkWidgets(framework: Framework): boolean { + return hasOwn(framework, 'widgets') ? + this.widgetLibrary.registerFrameworkWidgets(framework.widgets) : + this.widgetLibrary.unRegisterFrameworkWidgets(); + } + + public hasFramework(type: string): boolean { + return hasOwn(this.frameworkLibrary, type); + } + + public getFramework(): any { + if (!this.activeFramework) { this.setFramework('default', true); } + return this.activeFramework.framework; + } + + public getFrameworkWidgets(): any { + return this.activeFramework.widgets || {}; + } + + public getFrameworkStylesheets(load: boolean = this.loadExternalAssets): string[] { + return (load && this.activeFramework.stylesheets) || []; + } + + public getFrameworkScripts(load: boolean = this.loadExternalAssets): string[] { + return (load && this.activeFramework.scripts) || []; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework.ts new file mode 100644 index 000000000..61e0143c2 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/framework.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class Framework { + name: string; + framework: any; + widgets?: { [key: string]: any } = {}; + stylesheets?: string[] = []; + scripts?: string[] = []; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/index.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/index.ts new file mode 100644 index 000000000..9a9553e9f --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/index.ts @@ -0,0 +1,13 @@ +export { FrameworkLibraryService } from './framework-library.service'; + +export { NoFramework } from './no-framework/no.framework'; +export { NoFrameworkModule } from './no-framework/no-framework.module'; + +export { MaterialDesignFramework } from './material-design-framework/material-design.framework'; +export { MaterialDesignFrameworkModule } from './material-design-framework/material-design-framework.module'; + +export { Bootstrap3Framework } from './bootstrap-3-framework/bootstrap-3.framework'; +export { Bootstrap3FrameworkModule } from './bootstrap-3-framework/bootstrap-3-framework.module'; + +export { Bootstrap4Framework } from './bootstrap-4-framework/bootstrap-4.framework'; +export { Bootstrap4FrameworkModule } from './bootstrap-4-framework/bootstrap-4-framework.module'; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-root.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-root.component.ts new file mode 100644 index 000000000..8f8c0373f --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-root.component.ts @@ -0,0 +1,52 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'flex-layout-root-widget', + template: ` +
+ +
`, + changeDetection: ChangeDetectionStrategy.Default, +}) +export class FlexLayoutRootComponent { + @Input() dataIndex: number[]; + @Input() layoutIndex: number[]; + @Input() layout: any[]; + @Input() isFlexItem = false; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + removeItem(item) { + this.jsf.removeItem(item); + } + + // Set attributes for flexbox child + // (container attributes are set in flex-layout-section.component) + getFlexAttribute(node: any, attribute: string) { + const index = ['flex-grow', 'flex-shrink', 'flex-basis'].indexOf(attribute); + return ((node.options || {}).flex || '').split(/\s+/)[index] || + (node.options || {})[attribute] || ['1', '1', 'auto'][index]; + } + + showWidget(layoutNode: any): boolean { + return this.jsf.evaluateCondition(layoutNode, this.dataIndex); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-section.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-section.component.ts new file mode 100644 index 000000000..9eb59cf49 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/flex-layout-section.component.ts @@ -0,0 +1,216 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'flex-layout-section-widget', + template: ` +
+ + + +
+ +
+ + + +
+ + + + + + +
+ +
+
+ + + +
+ + + + + + + +
+ +
+ +
`, + styles: [` + fieldset { border: 0; margin: 0; padding: 0; } + .legend { font-weight: bold; } + .expandable > .legend:before { content: 'â–¶'; padding-right: .3em; } + .expanded > .legend:before { content: 'â–¼'; padding-right: .2em; } + `], +}) +export class FlexLayoutSectionComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + expanded = true; + containerType = 'div'; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + get sectionTitle() { + return this.options.notitle ? null : this.jsf.setItemTitle(this); + } + + ngOnInit() { + this.jsf.initializeControl(this); + this.options = this.layoutNode.options || {}; + this.expanded = typeof this.options.expanded === 'boolean' ? + this.options.expanded : !this.options.expandable; + switch (this.layoutNode.type) { + case 'section': case 'array': case 'fieldset': case 'advancedfieldset': + case 'authfieldset': case 'optionfieldset': case 'selectfieldset': + this.containerType = 'fieldset'; + break; + case 'card': + this.containerType = 'card'; + break; + case 'expansion-panel': + this.containerType = 'expansion-panel'; + break; + default: // 'div', 'flex', 'tab', 'conditional', 'actions' + this.containerType = 'div'; + } + } + + toggleExpanded() { + if (this.options.expandable) { this.expanded = !this.expanded; } + } + + // Set attributes for flexbox container + // (child attributes are set in flex-layout-root.component) + getFlexAttribute(attribute: string) { + const flexActive: boolean = + this.layoutNode.type === 'flex' || + !!this.options.displayFlex || + this.options.display === 'flex'; + // if (attribute !== 'flex' && !flexActive) { return null; } + switch (attribute) { + case 'is-flex': + return flexActive; + case 'display': + return flexActive ? 'flex' : 'initial'; + case 'flex-direction': case 'flex-wrap': + const index = ['flex-direction', 'flex-wrap'].indexOf(attribute); + return (this.options['flex-flow'] || '').split(/\s+/)[index] || + this.options[attribute] || ['column', 'nowrap'][index]; + case 'justify-content': case 'align-items': case 'align-content': + return this.options[attribute]; + case 'layout': + return (this.options.fxLayout || 'row') + + this.options.fxLayoutWrap ? ' ' + this.options.fxLayoutWrap : ''; + + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/index.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/index.ts new file mode 100644 index 000000000..e4f93c58b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/index.ts @@ -0,0 +1,54 @@ +import { FlexLayoutRootComponent } from './flex-layout-root.component'; +import { FlexLayoutSectionComponent } from './flex-layout-section.component'; +import { MaterialAddReferenceComponent } from './material-add-reference.component'; +import { MaterialButtonComponent } from './material-button.component'; +import { MaterialButtonGroupComponent } from './material-button-group.component'; +import { MaterialCheckboxComponent } from './material-checkbox.component'; +import { MaterialCheckboxesComponent } from './material-checkboxes.component'; +import { MaterialChipListComponent } from './material-chip-list.component'; +import { MaterialDatepickerComponent } from './material-datepicker.component'; +import { MaterialDesignFrameworkComponent } from './material-design-framework.component'; +import { MaterialFileComponent } from './material-file.component'; +import { MaterialInputComponent } from './material-input.component'; +import { MaterialNumberComponent } from './material-number.component'; +import { MaterialOneOfComponent } from './material-one-of.component'; +import { MaterialRadiosComponent } from './material-radios.component'; +import { MaterialSelectComponent } from './material-select.component'; +import { MaterialSliderComponent } from './material-slider.component'; +import { MaterialStepperComponent } from './material-stepper.component'; +import { MaterialTabsComponent } from './material-tabs.component'; +import { MaterialTextareaComponent } from './material-textarea.component'; + + +export const MATERIAL_FRAMEWORK_COMPONENTS = [ + FlexLayoutRootComponent, FlexLayoutSectionComponent, + MaterialAddReferenceComponent, MaterialOneOfComponent, + MaterialButtonComponent, MaterialButtonGroupComponent, + MaterialCheckboxComponent, MaterialCheckboxesComponent, + MaterialChipListComponent, MaterialDatepickerComponent, + MaterialFileComponent, MaterialInputComponent, MaterialNumberComponent, + MaterialRadiosComponent, MaterialSelectComponent, MaterialSliderComponent, + MaterialStepperComponent, MaterialTabsComponent, MaterialTextareaComponent, + MaterialDesignFrameworkComponent +]; + +export { FlexLayoutRootComponent } from './flex-layout-root.component'; +export { FlexLayoutSectionComponent } from './flex-layout-section.component'; +export { MaterialAddReferenceComponent } from './material-add-reference.component'; +export { MaterialOneOfComponent } from './material-one-of.component'; +export { MaterialButtonComponent } from './material-button.component'; +export { MaterialButtonGroupComponent } from './material-button-group.component'; +export { MaterialCheckboxComponent } from './material-checkbox.component'; +export { MaterialCheckboxesComponent } from './material-checkboxes.component'; +export { MaterialChipListComponent } from './material-chip-list.component'; +export { MaterialDatepickerComponent } from './material-datepicker.component'; +export { MaterialFileComponent } from './material-file.component'; +export { MaterialInputComponent } from './material-input.component'; +export { MaterialNumberComponent } from './material-number.component'; +export { MaterialRadiosComponent } from './material-radios.component'; +export { MaterialSelectComponent } from './material-select.component'; +export { MaterialSliderComponent } from './material-slider.component'; +export { MaterialStepperComponent } from './material-stepper.component'; +export { MaterialTabsComponent } from './material-tabs.component'; +export { MaterialTextareaComponent } from './material-textarea.component'; +export { MaterialDesignFrameworkComponent } from './material-design-framework.component'; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-add-reference.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-add-reference.component.ts new file mode 100644 index 000000000..83d6fe2a7 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-add-reference.component.ts @@ -0,0 +1,56 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-add-reference-widget', + template: ` +
+ +
`, + changeDetection: ChangeDetectionStrategy.Default, +}) +export class MaterialAddReferenceComponent implements OnInit { + options: any; + itemCount: number; + previousLayoutIndex: number[]; + previousDataIndex: number[]; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + } + + get showAddButton(): boolean { + return !this.layoutNode.arrayItem || + this.layoutIndex[this.layoutIndex.length - 1] < this.options.maxItems; + } + + addItem(event) { + event.preventDefault(); + this.jsf.addItem(this); + } + + get buttonText(): string { + const parent: any = { + dataIndex: this.dataIndex.slice(0, -1), + layoutIndex: this.layoutIndex.slice(0, -1), + layoutNode: this.jsf.getParentNode(this), + }; + return parent.layoutNode.add || + this.jsf.setArrayItemTitle(parent, this.layoutNode, this.itemCount); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button-group.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button-group.component.ts new file mode 100644 index 000000000..42f325477 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button-group.component.ts @@ -0,0 +1,69 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap } from '../../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-button-group-widget', + template: ` +
+
+ +
+ + + + + + +
`, + styles: [` mat-error { font-size: 75%; } `], +}) +export class MaterialButtonGroupComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + radiosList: any[] = []; + vertical = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.radiosList = buildTitleMap( + this.options.titleMap || this.options.enumNames, + this.options.enum, true + ); + this.jsf.initializeControl(this); + } + + updateValue(value) { + this.options.showErrors = true; + this.jsf.updateValue(this, value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button.component.ts new file mode 100644 index 000000000..d7724de64 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-button.component.ts @@ -0,0 +1,60 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { hasOwn } from '../../shared/utility.functions'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-button-widget', + template: ` +
+ +
`, + styles: [` button { margin-top: 10px; } `], +}) +export class MaterialButtonComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (hasOwn(this.options, 'disabled')) { + this.controlDisabled = this.options.disabled; + } else if (this.jsf.formOptions.disableInvalidSubmit) { + this.controlDisabled = !this.jsf.isValid; + this.jsf.isValidChanges.subscribe(isValid => this.controlDisabled = !isValid); + } + } + + updateValue(event) { + if (typeof this.options.onClick === 'function') { + this.options.onClick(event); + } else { + this.jsf.updateValue(this, event.target.value); + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkbox.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkbox.component.ts new file mode 100644 index 000000000..b317b2d76 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkbox.component.ts @@ -0,0 +1,111 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-checkbox-widget', + template: ` + + + + + + + + + + + + + `, + styles: [` + .checkbox-name { white-space: nowrap; } + mat-error { font-size: 75%; } + `], +}) +export class MaterialCheckboxComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + trueValue: any = true; + falseValue: any = false; + showSlideToggle = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this, !this.options.readonly); + if (this.controlValue === null || this.controlValue === undefined) { + this.controlValue = false; + this.jsf.updateValue(this, this.falseValue); + } + if (this.layoutNode.type === 'slide-toggle' || + this.layoutNode.format === 'slide-toggle' + ) { + this.showSlideToggle = true; + } + } + + updateValue(event) { + this.options.showErrors = true; + this.jsf.updateValue(this, event.checked ? this.trueValue : this.falseValue); + } + + get isChecked() { + return this.jsf.getFormControlValue(this) === this.trueValue; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkboxes.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkboxes.component.ts new file mode 100644 index 000000000..052c7e630 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-checkboxes.component.ts @@ -0,0 +1,109 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap } from '../../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService, TitleMapItem } from '../../json-schema-form.service'; + +// TODO: Change this to use a Selection List instead? +// https://material.angular.io/components/list/overview + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-checkboxes-widget', + template: ` +
+ + + + +
    +
  • + + + +
  • +
+ +
`, + styles: [` + .title { font-weight: bold; } + .checkbox-list { list-style-type: none; } + .horizontal-list > li { display: inline-block; margin-right: 10px; zoom: 1; } + .checkbox-name { white-space: nowrap; } + mat-error { font-size: 75%; } + `], +}) +export class MaterialCheckboxesComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + horizontalList = false; + formArray: AbstractControl; + checkboxList: TitleMapItem[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.horizontalList = this.layoutNode.type === 'checkboxes-inline' || + this.layoutNode.type === 'checkboxbuttons'; + this.jsf.initializeControl(this); + this.checkboxList = buildTitleMap( + this.options.titleMap || this.options.enumNames, this.options.enum, true + ); + if (this.boundControl) { + const formArray = this.jsf.getFormControl(this); + for (const checkboxItem of this.checkboxList) { + checkboxItem.checked = formArray.value.includes(checkboxItem.value); + } + } + } + + get allChecked(): boolean { + return this.checkboxList.filter(t => t.checked).length === this.checkboxList.length; + } + + get someChecked(): boolean { + const checkedItems = this.checkboxList.filter(t => t.checked).length; + return checkedItems > 0 && checkedItems < this.checkboxList.length; + } + + updateValue() { + this.options.showErrors = true; + if (this.boundControl) { + this.jsf.updateArrayCheckboxList(this, this.checkboxList); + } + } + + updateAllValues(event: any) { + this.options.showErrors = true; + this.checkboxList.forEach(t => t.checked = event.checked); + this.updateValue(); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-chip-list.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-chip-list.component.ts new file mode 100644 index 000000000..fc3830e7b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-chip-list.component.ts @@ -0,0 +1,35 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-chip-list-widget', + template: ``, +}) +export class MaterialChipListComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-datepicker.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-datepicker.component.ts new file mode 100644 index 000000000..c7e756951 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-datepicker.component.ts @@ -0,0 +1,98 @@ +import { Component, Input, OnChanges, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { dateToString, stringToDate } from '../../shared'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-datepicker-widget', + template: ` + + + + + + + + + + `, + styles: [` + mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; } + ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex + .mat-form-field-infix { width: initial; } + `], +}) +export class MaterialDatepickerComponent implements OnInit, OnChanges { + formControl: AbstractControl; + controlName: string; + controlValue: any; + dateValue: any; + controlDisabled = false; + boundControl = false; + options: any; + autoCompleteList: string[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this, !this.options.readonly); + this.setControlDate(this.controlValue); + if (!this.options.notitle && !this.options.description && this.options.placeholder) { + this.options.description = this.options.placeholder; + } + } + + ngOnChanges() { + this.setControlDate(this.controlValue); + } + + setControlDate(dateString: string) { + this.dateValue = stringToDate(dateString); + } + + updateValue(event) { + this.options.showErrors = true; + this.jsf.updateValue(this, dateToString(event, this.options)); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.component.ts new file mode 100644 index 000000000..2852ad913 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.component.ts @@ -0,0 +1,167 @@ +import { ChangeDetectorRef, Component, Input, OnChanges, OnInit } from '@angular/core'; +import _ from 'lodash'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { isDefined } from '../../shared'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-design-framework', + template: ` +
+ + + + +
+
`, + styles: [` + .array-item { + border-radius: 2px; + box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), + 0 2px 2px 0 rgba(0,0,0,.14), + 0 1px 5px 0 rgba(0,0,0,.12); + padding: 6px; + position: relative; + transition: all 280ms cubic-bezier(.4, 0, .2, 1); + } + .close-button { + cursor: pointer; + position: absolute; + top: 6px; + right: 6px; + fill: rgba(0,0,0,.4); + visibility: hidden; + z-index: 500; + } + .close-button:hover { fill: rgba(0,0,0,.8); } + .array-item:hover > .close-button { visibility: visible; } + .spacer { margin: 6px 0; } + [draggable=true]:hover { + box-shadow: 0 5px 5px -3px rgba(0,0,0,.2), + 0 8px 10px 1px rgba(0,0,0,.14), + 0 3px 14px 2px rgba(0,0,0,.12); + cursor: move; + z-index: 10; + } + [draggable=true].drag-target-top { + box-shadow: 0 -2px 0 #000; + position: relative; z-index: 20; + } + [draggable=true].drag-target-bottom { + box-shadow: 0 2px 0 #000; + position: relative; z-index: 20; + } + `], +}) +export class MaterialDesignFrameworkComponent implements OnInit, OnChanges { + frameworkInitialized = false; + inputType: string; + options: any; // Options used in this framework + widgetLayoutNode: any; // layoutNode passed to child widget + widgetOptions: any; // Options passed to child widget + formControl: any = null; + parentArray: any = null; + isOrderable = false; + dynamicTitle: string = null; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private changeDetector: ChangeDetectorRef, + private jsf: JsonSchemaFormService + ) { } + + get showRemoveButton(): boolean { + if (!this.layoutNode || !this.widgetOptions.removable || + this.widgetOptions.readonly || this.layoutNode.type === '$ref' + ) { return false; } + if (this.layoutNode.recursiveReference) { return true; } + if (!this.layoutNode.arrayItem || !this.parentArray) { return false; } + // If array length <= minItems, don't allow removing any items + return this.parentArray.items.length - 1 <= this.parentArray.options.minItems ? false : + // For removable list items, allow removing any item + this.layoutNode.arrayItemType === 'list' ? true : + // For removable tuple items, only allow removing last item in list + this.layoutIndex[this.layoutIndex.length - 1] === this.parentArray.items.length - 2; + } + + ngOnInit() { + this.initializeFramework(); + } + + ngOnChanges() { + if (!this.frameworkInitialized) { this.initializeFramework(); } + if (this.dynamicTitle) { this.updateTitle(); } + } + + initializeFramework() { + if (this.layoutNode) { + this.options = _.cloneDeep(this.layoutNode.options || {}); + this.widgetLayoutNode = { + ...this.layoutNode, + options: _.cloneDeep(this.layoutNode.options || {}) + }; + this.widgetOptions = this.widgetLayoutNode.options; + this.formControl = this.jsf.getFormControl(this); + + if ( + isDefined(this.widgetOptions.minimum) && + isDefined(this.widgetOptions.maximum) && + this.widgetOptions.multipleOf >= 1 + ) { + this.layoutNode.type = 'range'; + } + + if ( + !['$ref', 'advancedfieldset', 'authfieldset', 'button', 'card', + 'checkbox', 'expansion-panel', 'help', 'message', 'msg', 'section', + 'submit', 'tabarray', 'tabs'].includes(this.layoutNode.type) && + /{{.+?}}/.test(this.widgetOptions.title || '') + ) { + this.dynamicTitle = this.widgetOptions.title; + this.updateTitle(); + } + + if (this.layoutNode.arrayItem && this.layoutNode.type !== '$ref') { + this.parentArray = this.jsf.getParentNode(this); + if (this.parentArray) { + this.isOrderable = + this.parentArray.type.slice(0, 3) !== 'tab' && + this.layoutNode.arrayItemType === 'list' && + !this.widgetOptions.readonly && + this.parentArray.options.orderable; + } + } + + this.frameworkInitialized = true; + } else { + this.options = {}; + } + } + + updateTitle() { + this.widgetLayoutNode.options.title = this.jsf.parseText( + this.dynamicTitle, + this.jsf.getFormControlValue(this), + this.jsf.getFormControlGroup(this).value, + this.dataIndex[this.dataIndex.length - 1] + ); + } + + removeItem() { + this.jsf.removeItem(this); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.module.ts new file mode 100644 index 000000000..e7232bd7a --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design-framework.module.ts @@ -0,0 +1,61 @@ +import { CommonModule } from '@angular/common'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { Framework } from '../framework'; +import { FrameworkLibraryService } from '../framework-library.service'; +import { JsonSchemaFormModule } from '../../json-schema-form.module'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { + MatAutocompleteModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatDatepickerModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatNativeDateModule, + MatRadioModule, + MatSelectModule, + MatSliderModule, + MatSlideToggleModule, + MatStepperModule, + MatTabsModule, + MatTooltipModule + } from '@angular/material'; +import { MATERIAL_FRAMEWORK_COMPONENTS } from './index'; +import { MaterialDesignFramework } from './material-design.framework'; +import { NgModule } from '@angular/core'; +import { WidgetLibraryModule } from '../../widget-library/widget-library.module'; +import { WidgetLibraryService } from '../../widget-library/widget-library.service'; +/** + * unused @angular/material modules: + * MatDialogModule, MatGridListModule, MatListModule, MatMenuModule, + * MatPaginatorModule, MatProgressBarModule, MatProgressSpinnerModule, + * MatSidenavModule, MatSnackBarModule, MatSortModule, MatTableModule, + * MatToolbarModule, + */ +export const ANGULAR_MATERIAL_MODULES = [ + MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCardModule, + MatCheckboxModule, MatChipsModule, MatDatepickerModule, MatExpansionModule, + MatFormFieldModule, MatIconModule, MatInputModule, MatNativeDateModule, + MatRadioModule, MatSelectModule, MatSliderModule, MatSlideToggleModule, + MatStepperModule, MatTabsModule, MatTooltipModule, +]; + +@NgModule({ + imports: [ + CommonModule, FormsModule, ReactiveFormsModule, FlexLayoutModule, + ...ANGULAR_MATERIAL_MODULES, WidgetLibraryModule, JsonSchemaFormModule + ], + declarations: [...MATERIAL_FRAMEWORK_COMPONENTS], + exports: [JsonSchemaFormModule, ...MATERIAL_FRAMEWORK_COMPONENTS], + providers: [JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService, + { provide: Framework, useClass: MaterialDesignFramework, multi: true } + ], + entryComponents: [...MATERIAL_FRAMEWORK_COMPONENTS] +}) +export class MaterialDesignFrameworkModule { } diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design.framework.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design.framework.ts new file mode 100644 index 000000000..fd410c75a --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-design.framework.ts @@ -0,0 +1,73 @@ +import { FlexLayoutRootComponent } from './flex-layout-root.component'; +import { FlexLayoutSectionComponent } from './flex-layout-section.component'; +import { Framework } from '../framework'; +import { Injectable } from '@angular/core'; +import { MaterialAddReferenceComponent } from './material-add-reference.component'; +import { MaterialButtonComponent } from './material-button.component'; +import { MaterialButtonGroupComponent } from './material-button-group.component'; +import { MaterialCheckboxComponent } from './material-checkbox.component'; +import { MaterialCheckboxesComponent } from './material-checkboxes.component'; +import { MaterialChipListComponent } from './material-chip-list.component'; +import { MaterialDatepickerComponent } from './material-datepicker.component'; +import { MaterialDesignFrameworkComponent } from './material-design-framework.component'; +import { MaterialFileComponent } from './material-file.component'; +import { MaterialInputComponent } from './material-input.component'; +import { MaterialNumberComponent } from './material-number.component'; +import { MaterialOneOfComponent } from './material-one-of.component'; +import { MaterialRadiosComponent } from './material-radios.component'; +import { MaterialSelectComponent } from './material-select.component'; +import { MaterialSliderComponent } from './material-slider.component'; +import { MaterialStepperComponent } from './material-stepper.component'; +import { MaterialTabsComponent } from './material-tabs.component'; +import { MaterialTextareaComponent } from './material-textarea.component'; + + +// Material Design Framework +// https://github.com/angular/material2 + +@Injectable() +export class MaterialDesignFramework extends Framework { + name = 'material-design'; + + framework = MaterialDesignFrameworkComponent; + + stylesheets = [ + '//fonts.googleapis.com/icon?family=Material+Icons', + '//fonts.googleapis.com/css?family=Roboto:300,400,500,700', + ]; + + widgets = { + 'root': FlexLayoutRootComponent, + 'section': FlexLayoutSectionComponent, + '$ref': MaterialAddReferenceComponent, + 'button': MaterialButtonComponent, + 'button-group': MaterialButtonGroupComponent, + 'checkbox': MaterialCheckboxComponent, + 'checkboxes': MaterialCheckboxesComponent, + 'chip-list': MaterialChipListComponent, + 'date': MaterialDatepickerComponent, + 'file': MaterialFileComponent, + 'number': MaterialNumberComponent, + 'one-of': MaterialOneOfComponent, + 'radios': MaterialRadiosComponent, + 'select': MaterialSelectComponent, + 'slider': MaterialSliderComponent, + 'stepper': MaterialStepperComponent, + 'tabs': MaterialTabsComponent, + 'text': MaterialInputComponent, + 'textarea': MaterialTextareaComponent, + 'alt-date': 'date', + 'any-of': 'one-of', + 'card': 'section', + 'color': 'text', + 'expansion-panel': 'section', + 'hidden': 'none', + 'image': 'none', + 'integer': 'number', + 'radiobuttons': 'button-group', + 'range': 'slider', + 'submit': 'button', + 'tagsinput': 'chip-list', + 'wizard': 'stepper', + }; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-file.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-file.component.ts new file mode 100644 index 000000000..93abdef0f --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-file.component.ts @@ -0,0 +1,35 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-file-widget', + template: ``, +}) +export class MaterialFileComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-input.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-input.component.ts new file mode 100644 index 000000000..63c55af43 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-input.component.ts @@ -0,0 +1,91 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-input-widget', + template: ` + + + + + + + + {{word}} + + + `, + styles: [` + mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; } + ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex + .mat-form-field-infix { width: initial; } + `], +}) +export class MaterialInputComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: string; + controlDisabled = false; + boundControl = false; + options: any; + autoCompleteList: string[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (!this.options.notitle && !this.options.description && this.options.placeholder) { + this.options.description = this.options.placeholder; + } + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-number.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-number.component.ts new file mode 100644 index 000000000..ef4079d77 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-number.component.ts @@ -0,0 +1,91 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-number-widget', + template: ` + + + + + + + + + `, + styles: [` + mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; } + ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex + .mat-form-field-infix { width: initial; } + `], +}) +export class MaterialNumberComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + allowNegative = true; + allowDecimal = true; + allowExponents = false; + lastValidNumber = ''; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (this.layoutNode.dataType === 'integer') { this.allowDecimal = false; } + if (!this.options.notitle && !this.options.description && this.options.placeholder) { + this.options.description = this.options.placeholder; + } + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-one-of.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-one-of.component.ts new file mode 100644 index 000000000..4639955a0 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-one-of.component.ts @@ -0,0 +1,35 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-one-of-widget', + template: ``, +}) +export class MaterialOneOfComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-radios.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-radios.component.ts new file mode 100644 index 000000000..b4a9121fb --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-radios.component.ts @@ -0,0 +1,90 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap } from '../../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-radios-widget', + template: ` +
+
+ +
+ + + + + + + + + + + +
`, + styles: [` + mat-radio-group { display: inline-flex; } + mat-radio-button { margin: 2px; } + mat-error { font-size: 75%; } + `] +}) +export class MaterialRadiosComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + flexDirection = 'column'; + radiosList: any[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + if (this.layoutNode.type === 'radios-inline') { + this.flexDirection = 'row'; + } + this.radiosList = buildTitleMap( + this.options.titleMap || this.options.enumNames, + this.options.enum, true + ); + this.jsf.initializeControl(this, !this.options.readonly); + } + + updateValue(value) { + this.options.showErrors = true; + this.jsf.updateValue(this, value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-select.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-select.component.ts new file mode 100644 index 000000000..a95a8281b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-select.component.ts @@ -0,0 +1,114 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap, isArray } from '../../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-select-widget', + template: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, + styles: [` + mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; } + ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex + .mat-form-field-infix { width: initial; } + `], +}) +export class MaterialSelectComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + selectList: any[] = []; + isArray = isArray; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.selectList = buildTitleMap( + this.options.titleMap || this.options.enumNames, + this.options.enum, !!this.options.required, !!this.options.flatList + ); + this.jsf.initializeControl(this, !this.options.readonly); + if (!this.options.notitle && !this.options.description && this.options.placeholder) { + this.options.description = this.options.placeholder; + } + } + + updateValue(event) { + this.options.showErrors = true; + this.jsf.updateValue(this, event.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-slider.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-slider.component.ts new file mode 100644 index 000000000..cbb86b2e9 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-slider.component.ts @@ -0,0 +1,61 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-slider-widget', + template: ` + + + `, + styles: [` mat-error { font-size: 75%; } `], +}) +export class MaterialSliderComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + allowNegative = true; + allowDecimal = true; + allowExponents = false; + lastValidNumber = ''; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this, !this.options.readonly); + } + + updateValue(event) { + this.options.showErrors = true; + this.jsf.updateValue(this, event.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-stepper.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-stepper.component.ts new file mode 100644 index 000000000..8aace52d1 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-stepper.component.ts @@ -0,0 +1,35 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-stepper-widget', + template: ``, +}) +export class MaterialStepperComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-tabs.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-tabs.component.ts new file mode 100644 index 000000000..5a9e251a7 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-tabs.component.ts @@ -0,0 +1,69 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-tabs-widget', + template: ` + +
+ +
`, + styles: [` a { cursor: pointer; } `], +}) +export class MaterialTabsComponent implements OnInit { + options: any; + itemCount: number; + selectedItem = 0; + showAddTab = true; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.itemCount = this.layoutNode.items.length - 1; + this.updateControl(); + } + + select(index) { + if (this.layoutNode.items[index].type === '$ref') { + this.jsf.addItem({ + layoutNode: this.layoutNode.items[index], + layoutIndex: this.layoutIndex.concat(index), + dataIndex: this.dataIndex.concat(index) + }); + this.updateControl(); + } + this.selectedItem = index; + } + + updateControl() { + this.itemCount = this.layoutNode.items.length - 1; + const lastItem = this.layoutNode.items[this.layoutNode.items.length - 1]; + this.showAddTab = lastItem.type === '$ref' && + this.itemCount < (lastItem.options.maxItems || 1000); + } + + setTabTitle(item: any, index: number): string { + return this.jsf.setArrayItemTitle(this, item, index); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-textarea.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-textarea.component.ts new file mode 100644 index 000000000..9849920dc --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/material-design-framework/material-textarea.component.ts @@ -0,0 +1,84 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'material-textarea-widget', + template: ` + + + + + + + + `, + styles: [` + mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; } + ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex + .mat-form-field-infix { width: initial; } + `], +}) +export class MaterialTextareaComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (!this.options.notitle && !this.options.description && this.options.placeholder) { + this.options.description = this.options.placeholder; + } + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.component.ts new file mode 100644 index 000000000..559a6dfc7 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.component.ts @@ -0,0 +1,16 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'no-framework', + template: ` + `, +}) +export class NoFrameworkComponent { + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.module.ts new file mode 100644 index 000000000..e42c4ab7c --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no-framework.module.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { Framework } from '../framework'; +import { FrameworkLibraryService } from '../framework-library.service'; +import { JsonSchemaFormService } from '../../json-schema-form.service'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { NoFramework } from './no.framework'; +import { NoFrameworkComponent } from './no-framework.component'; +import { WidgetLibraryModule } from '../../widget-library/widget-library.module'; +import { WidgetLibraryService } from '../../widget-library/widget-library.service'; + +// No framework - plain HTML controls (styles from form layout only) + +@NgModule({ + imports: [CommonModule, WidgetLibraryModule], + declarations: [NoFrameworkComponent], + exports: [NoFrameworkComponent], + providers: [JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService, + { provide: Framework, useClass: NoFramework, multi: true } + ], + entryComponents: [NoFrameworkComponent] +}) +export class NoFrameworkModule { } diff --git a/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no.framework.ts b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no.framework.ts new file mode 100644 index 000000000..589b48472 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/framework-library/no-framework/no.framework.ts @@ -0,0 +1,11 @@ +import { Framework } from '../framework'; +import { Injectable } from '@angular/core'; +import { NoFrameworkComponent } from './no-framework.component'; +// No framework - plain HTML controls (styles from form layout only) + +@Injectable() +export class NoFramework extends Framework { + name = 'no-framework'; + + framework = NoFrameworkComponent; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.component.ts new file mode 100644 index 000000000..f89fe3693 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.component.ts @@ -0,0 +1,746 @@ +import _ from 'lodash'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + forwardRef, + Input, + OnChanges, + OnInit, + Output + } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { convertSchemaToDraft6 } from './shared/convert-schema-to-draft6.function'; +import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; +import { forEach, hasOwn } from './shared/utility.functions'; +import { FrameworkLibraryService } from './framework-library/framework-library.service'; +import { + hasValue, + inArray, + isArray, + isEmpty, + isObject + } from './shared/validator.functions'; +import { JsonPointer } from './shared/jsonpointer.functions'; +import { JsonSchemaFormService } from './json-schema-form.service'; +import { resolveSchemaReferences } from './shared/json-schema.functions'; +import { WidgetLibraryService } from './widget-library/widget-library.service'; + +export const JSON_SCHEMA_FORM_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => JsonSchemaFormComponent), + multi: true, +}; + +/** + * @module 'JsonSchemaFormComponent' - Angular JSON Schema Form + * + * Root module of the Angular JSON Schema Form client-side library, + * an Angular library which generates an HTML form from a JSON schema + * structured data model and/or a JSON Schema Form layout description. + * + * This library also validates input data by the user, using both validators on + * individual controls to provide real-time feedback while the user is filling + * out the form, and then validating the entire input against the schema when + * the form is submitted to make sure the returned JSON data object is valid. + * + * This library is similar to, and mostly API compatible with: + * + * - JSON Schema Form's Angular Schema Form library for AngularJs + * http://schemaform.io + * http://schemaform.io/examples/bootstrap-example.html (examples) + * + * - Mozilla's react-jsonschema-form library for React + * https://github.com/mozilla-services/react-jsonschema-form + * https://mozilla-services.github.io/react-jsonschema-form (examples) + * + * - Joshfire's JSON Form library for jQuery + * https://github.com/joshfire/jsonform + * http://ulion.github.io/jsonform/playground (examples) + * + * This library depends on: + * - Angular (obviously) https://angular.io + * - lodash, JavaScript utility library https://github.com/lodash/lodash + * - ajv, Another JSON Schema validator https://github.com/epoberezkin/ajv + * + * In addition, the Example Playground also depends on: + * - brace, Browserified Ace editor http://thlorenz.github.io/brace + */ +@Component({ + // tslint:disable-next-line:component-selector + selector: 'json-schema-form', + template: ` +
+ +
+
+ +
+
+ +
+
+ Debug output:
{{debugOutput}}
+
`, + changeDetection: ChangeDetectionStrategy.OnPush, + // Adding 'JsonSchemaFormService' here, instead of in the module, + // creates a separate instance of the service for each component + providers: [ JsonSchemaFormService, JSON_SCHEMA_FORM_VALUE_ACCESSOR ], +}) +export class JsonSchemaFormComponent implements ControlValueAccessor, OnChanges, OnInit { + debugOutput: any; // Debug information, if requested + formValueSubscription: any = null; + formInitialized = false; + objectWrap = false; // Is non-object input schema wrapped in an object? + + formValuesInput: string; // Name of the input providing the form data + previousInputs: { // Previous input values, to detect which input triggers onChanges + schema: any, layout: any[], data: any, options: any, framework: any|string, + widgets: any, form: any, model: any, JSONSchema: any, UISchema: any, + formData: any, loadExternalAssets: boolean, debug: boolean, + } = { + schema: null, layout: null, data: null, options: null, framework: null, + widgets: null, form: null, model: null, JSONSchema: null, UISchema: null, + formData: null, loadExternalAssets: null, debug: null, + }; + + // Recommended inputs + @Input() schema: any; // The JSON Schema + @Input() layout: any[]; // The form layout + @Input() data: any; // The form data + @Input() options: any; // The global form options + @Input() framework: any|string; // The framework to load + @Input() widgets: any; // Any custom widgets to load + + // Alternate combined single input + @Input() form: any; // For testing, and JSON Schema Form API compatibility + + // Angular Schema Form API compatibility input + @Input() model: any; // Alternate input for form data + + // React JSON Schema Form API compatibility inputs + @Input() JSONSchema: any; // Alternate input for JSON Schema + @Input() UISchema: any; // UI schema - alternate form layout format + @Input() formData: any; // Alternate input for form data + + @Input() ngModel: any; // Alternate input for Angular forms + + @Input() language: string; // Language + + // Development inputs, for testing and debugging + @Input() loadExternalAssets: boolean; // Load external framework assets? + @Input() debug: boolean; // Show debug information? + + @Input() + get value(): any { + return this.objectWrap ? this.jsf.data['1'] : this.jsf.data; + } + set value(value: any) { + this.setFormValues(value, false); + } + + // Outputs + // tslint:disable-next-line:no-output-on-prefix + @Output() onChanges = new EventEmitter(); // Live unvalidated internal form data + // tslint:disable-next-line:no-output-on-prefix + @Output() onSubmit = new EventEmitter(); // Complete validated form data + @Output() isValid = new EventEmitter(); // Is current data valid? + @Output() validationErrors = new EventEmitter(); // Validation errors (if any) + @Output() formSchema = new EventEmitter(); // Final schema used to create form + @Output() formLayout = new EventEmitter(); // Final layout used to create form + + // Outputs for possible 2-way data binding + // Only the one input providing the initial form data will be bound. + // If there is no inital data, input '{}' to activate 2-way data binding. + // There is no 2-way binding if inital data is combined inside the 'form' input. + @Output() dataChange = new EventEmitter(); + @Output() modelChange = new EventEmitter(); + @Output() formDataChange = new EventEmitter(); + @Output() ngModelChange = new EventEmitter(); + + onChange: Function; + onTouched: Function; + + constructor( + private changeDetector: ChangeDetectorRef, + private frameworkLibrary: FrameworkLibraryService, + private widgetLibrary: WidgetLibraryService, + public jsf: JsonSchemaFormService, + private sanitizer: DomSanitizer + ) { } + + get stylesheets(): SafeResourceUrl[] { + const stylesheets = this.frameworkLibrary.getFrameworkStylesheets(); + const load = this.sanitizer.bypassSecurityTrustResourceUrl; + return stylesheets.map(stylesheet => load(stylesheet)); + } + + get scripts(): SafeResourceUrl[] { + const scripts = this.frameworkLibrary.getFrameworkScripts(); + const load = this.sanitizer.bypassSecurityTrustResourceUrl; + return scripts.map(script => load(script)); + } + + ngOnInit() { + this.updateForm(); + } + + ngOnChanges() { + this.updateForm(); + } + + writeValue(value: any) { + this.setFormValues(value, false); + if (!this.formValuesInput) { this.formValuesInput = 'ngModel'; } + } + + registerOnChange(fn: Function) { + this.onChange = fn; + } + + registerOnTouched(fn: Function) { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean) { + if (this.jsf.formOptions.formDisabled !== !!isDisabled) { + this.jsf.formOptions.formDisabled = !!isDisabled; + this.initializeForm(); + } + } + + updateForm() { + if (!this.formInitialized || !this.formValuesInput || + (this.language && this.language !== this.jsf.language) + ) { + this.initializeForm(); + } else { + if (this.language && this.language !== this.jsf.language) { + this.jsf.setLanguage(this.language); + } + + // Get names of changed inputs + let changedInput = Object.keys(this.previousInputs) + .filter(input => this.previousInputs[input] !== this[input]); + let resetFirst = true; + if (changedInput.length === 1 && changedInput[0] === 'form' && + this.formValuesInput.startsWith('form.') + ) { + // If only 'form' input changed, get names of changed keys + changedInput = Object.keys(this.previousInputs.form || {}) + .filter(key => !_.isEqual(this.previousInputs.form[key], this.form[key])) + .map(key => `form.${key}`); + resetFirst = false; + } + + // If only input values have changed, update the form values + if (changedInput.length === 1 && changedInput[0] === this.formValuesInput) { + if (this.formValuesInput.indexOf('.') === -1) { + this.setFormValues(this[this.formValuesInput], resetFirst); + } else { + const [input, key] = this.formValuesInput.split('.'); + this.setFormValues(this[input][key], resetFirst); + } + + // If anything else has changed, re-render the entire form + } else if (changedInput.length) { + this.initializeForm(); + if (this.onChange) { this.onChange(this.jsf.formValues); } + if (this.onTouched) { this.onTouched(this.jsf.formValues); } + } + + // Update previous inputs + Object.keys(this.previousInputs) + .filter(input => this.previousInputs[input] !== this[input]) + .forEach(input => this.previousInputs[input] = this[input]); + } + } + + setFormValues(formValues: any, resetFirst = true) { + if (formValues) { + const newFormValues = this.objectWrap ? formValues['1'] : formValues; + if (!this.jsf.formGroup) { + this.jsf.formValues = formValues; + this.activateForm(); + } else if (resetFirst) { + this.jsf.formGroup.reset(); + } + if (this.jsf.formGroup) { + this.jsf.formGroup.patchValue(newFormValues); + } + if (this.onChange) { this.onChange(newFormValues); } + if (this.onTouched) { this.onTouched(newFormValues); } + } else { + this.jsf.formGroup.reset(); + } + } + + submitForm() { + const validData = this.jsf.validData; + this.onSubmit.emit(this.objectWrap ? validData['1'] : validData); + } + + /** + * 'initializeForm' function + * + * - Update 'schema', 'layout', and 'formValues', from inputs. + * + * - Create 'schemaRefLibrary' and 'schemaRecursiveRefMap' + * to resolve schema $ref links, including recursive $ref links. + * + * - Create 'dataRecursiveRefMap' to resolve recursive links in data + * and corectly set output formats for recursively nested values. + * + * - Create 'layoutRefLibrary' and 'templateRefLibrary' to store + * new layout nodes and formGroup elements to use when dynamically + * adding form components to arrays and recursive $ref points. + * + * - Create 'dataMap' to map the data to the schema and template. + * + * - Create the master 'formGroupTemplate' then from it 'formGroup' + * the Angular formGroup used to control the reactive form. + */ + initializeForm() { + if ( + this.schema || this.layout || this.data || this.form || this.model || + this.JSONSchema || this.UISchema || this.formData || this.ngModel || + this.jsf.data + ) { + + this.jsf.resetAllValues(); // Reset all form values to defaults + this.initializeOptions(); // Update options + this.initializeSchema(); // Update schema, schemaRefLibrary, + // schemaRecursiveRefMap, & dataRecursiveRefMap + this.initializeLayout(); // Update layout, layoutRefLibrary, + this.initializeData(); // Update formValues + this.activateForm(); // Update dataMap, templateRefLibrary, + // formGroupTemplate, formGroup + + // Uncomment individual lines to output debugging information to console: + // (These always work.) + // console.log('loading form...'); + // console.log('schema', this.jsf.schema); + // console.log('layout', this.jsf.layout); + // console.log('options', this.options); + // console.log('formValues', this.jsf.formValues); + // console.log('formGroupTemplate', this.jsf.formGroupTemplate); + // console.log('formGroup', this.jsf.formGroup); + // console.log('formGroup.value', this.jsf.formGroup.value); + // console.log('schemaRefLibrary', this.jsf.schemaRefLibrary); + // console.log('layoutRefLibrary', this.jsf.layoutRefLibrary); + // console.log('templateRefLibrary', this.jsf.templateRefLibrary); + // console.log('dataMap', this.jsf.dataMap); + // console.log('arrayMap', this.jsf.arrayMap); + // console.log('schemaRecursiveRefMap', this.jsf.schemaRecursiveRefMap); + // console.log('dataRecursiveRefMap', this.jsf.dataRecursiveRefMap); + + // Uncomment individual lines to output debugging information to browser: + // (These only work if the 'debug' option has also been set to 'true'.) + if (this.debug || this.jsf.formOptions.debug) { + const vars: any[] = []; + // vars.push(this.jsf.schema); + // vars.push(this.jsf.layout); + // vars.push(this.options); + // vars.push(this.jsf.formValues); + // vars.push(this.jsf.formGroup.value); + // vars.push(this.jsf.formGroupTemplate); + // vars.push(this.jsf.formGroup); + // vars.push(this.jsf.schemaRefLibrary); + // vars.push(this.jsf.layoutRefLibrary); + // vars.push(this.jsf.templateRefLibrary); + // vars.push(this.jsf.dataMap); + // vars.push(this.jsf.arrayMap); + // vars.push(this.jsf.schemaRecursiveRefMap); + // vars.push(this.jsf.dataRecursiveRefMap); + this.debugOutput = vars.map(v => JSON.stringify(v, null, 2)).join('\n'); + } + this.formInitialized = true; + } + } + + /** + * 'initializeOptions' function + * + * Initialize 'options' (global form options) and set framework + * Combine available inputs: + * 1. options - recommended + * 2. form.options - Single input style + */ + private initializeOptions() { + if (this.language && this.language !== this.jsf.language) { + this.jsf.setLanguage(this.language); + } + this.jsf.setOptions({ debug: !!this.debug }); + let loadExternalAssets: boolean = this.loadExternalAssets || false; + let framework: any = this.framework || 'default'; + if (isObject(this.options)) { + this.jsf.setOptions(this.options); + loadExternalAssets = this.options.loadExternalAssets || loadExternalAssets; + framework = this.options.framework || framework; + } + if (isObject(this.form) && isObject(this.form.options)) { + this.jsf.setOptions(this.form.options); + loadExternalAssets = this.form.options.loadExternalAssets || loadExternalAssets; + framework = this.form.options.framework || framework; + } + if (isObject(this.widgets)) { + this.jsf.setOptions({ widgets: this.widgets }); + } + this.frameworkLibrary.setLoadExternalAssets(loadExternalAssets); + this.frameworkLibrary.setFramework(framework); + this.jsf.framework = this.frameworkLibrary.getFramework(); + if (isObject(this.jsf.formOptions.widgets)) { + for (const widget of Object.keys(this.jsf.formOptions.widgets)) { + this.widgetLibrary.registerWidget(widget, this.jsf.formOptions.widgets[widget]); + } + } + if (isObject(this.form) && isObject(this.form.tpldata)) { + this.jsf.setTpldata(this.form.tpldata); + } + } + + /** + * 'initializeSchema' function + * + * Initialize 'schema' + * Use first available input: + * 1. schema - recommended / Angular Schema Form style + * 2. form.schema - Single input / JSON Form style + * 3. JSONSchema - React JSON Schema Form style + * 4. form.JSONSchema - For testing single input React JSON Schema Forms + * 5. form - For testing single schema-only inputs + * + * ... if no schema input found, the 'activateForm' function, below, + * will make two additional attempts to build a schema + * 6. If layout input - build schema from layout + * 7. If data input - build schema from data + */ + private initializeSchema() { + + // TODO: update to allow non-object schemas + + if (isObject(this.schema)) { + this.jsf.AngularSchemaFormCompatibility = true; + this.jsf.schema = _.cloneDeep(this.schema); + } else if (hasOwn(this.form, 'schema') && isObject(this.form.schema)) { + this.jsf.schema = _.cloneDeep(this.form.schema); + } else if (isObject(this.JSONSchema)) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + this.jsf.schema = _.cloneDeep(this.JSONSchema); + } else if (hasOwn(this.form, 'JSONSchema') && isObject(this.form.JSONSchema)) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + this.jsf.schema = _.cloneDeep(this.form.JSONSchema); + } else if (hasOwn(this.form, 'properties') && isObject(this.form.properties)) { + this.jsf.schema = _.cloneDeep(this.form); + } else if (isObject(this.form)) { + // TODO: Handle other types of form input + } + + if (!isEmpty(this.jsf.schema)) { + + // If other types also allowed, render schema as an object + if (inArray('object', this.jsf.schema.type)) { + this.jsf.schema.type = 'object'; + } + + // Wrap non-object schemas in object. + if (hasOwn(this.jsf.schema, 'type') && this.jsf.schema.type !== 'object') { + this.jsf.schema = { + 'type': 'object', + 'properties': { 1: this.jsf.schema } + }; + this.objectWrap = true; + } else if (!hasOwn(this.jsf.schema, 'type')) { + + // Add type = 'object' if missing + if (isObject(this.jsf.schema.properties) || + isObject(this.jsf.schema.patternProperties) || + isObject(this.jsf.schema.additionalProperties) + ) { + this.jsf.schema.type = 'object'; + + // Fix JSON schema shorthand (JSON Form style) + } else { + this.jsf.JsonFormCompatibility = true; + this.jsf.schema = { + 'type': 'object', + 'properties': this.jsf.schema + }; + } + } + + // If needed, update JSON Schema to draft 6 format, including + // draft 3 (JSON Form style) and draft 4 (Angular Schema Form style) + this.jsf.schema = convertSchemaToDraft6(this.jsf.schema); + + // Initialize ajv and compile schema + this.jsf.compileAjvSchema(); + + // Create schemaRefLibrary, schemaRecursiveRefMap, dataRecursiveRefMap, & arrayMap + this.jsf.schema = resolveSchemaReferences( + this.jsf.schema, this.jsf.schemaRefLibrary, this.jsf.schemaRecursiveRefMap, + this.jsf.dataRecursiveRefMap, this.jsf.arrayMap + ); + if (hasOwn(this.jsf.schemaRefLibrary, '')) { + this.jsf.hasRootReference = true; + } + + // TODO: (?) Resolve external $ref links + // // Create schemaRefLibrary & schemaRecursiveRefMap + // this.parser.bundle(this.schema) + // .then(schema => this.schema = resolveSchemaReferences( + // schema, this.jsf.schemaRefLibrary, + // this.jsf.schemaRecursiveRefMap, this.jsf.dataRecursiveRefMap + // )); + } + } + + /** + * 'initializeData' function + * + * Initialize 'formValues' + * defulat or previously submitted values used to populate form + * Use first available input: + * 1. data - recommended + * 2. model - Angular Schema Form style + * 3. form.value - JSON Form style + * 4. form.data - Single input style + * 5. formData - React JSON Schema Form style + * 6. form.formData - For easier testing of React JSON Schema Forms + * 7. (none) no data - initialize data from schema and layout defaults only + */ + private initializeData() { + if (hasValue(this.data)) { + this.jsf.formValues = _.cloneDeep(this.data); + this.formValuesInput = 'data'; + } else if (hasValue(this.model)) { + this.jsf.AngularSchemaFormCompatibility = true; + this.jsf.formValues = _.cloneDeep(this.model); + this.formValuesInput = 'model'; + } else if (hasValue(this.ngModel)) { + this.jsf.AngularSchemaFormCompatibility = true; + this.jsf.formValues = _.cloneDeep(this.ngModel); + this.formValuesInput = 'ngModel'; + } else if (isObject(this.form) && hasValue(this.form.value)) { + this.jsf.JsonFormCompatibility = true; + this.jsf.formValues = _.cloneDeep(this.form.value); + this.formValuesInput = 'form.value'; + } else if (isObject(this.form) && hasValue(this.form.data)) { + this.jsf.formValues = _.cloneDeep(this.form.data); + this.formValuesInput = 'form.data'; + } else if (hasValue(this.formData)) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + this.formValuesInput = 'formData'; + } else if (hasOwn(this.form, 'formData') && hasValue(this.form.formData)) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + this.jsf.formValues = _.cloneDeep(this.form.formData); + this.formValuesInput = 'form.formData'; + } else { + this.formValuesInput = null; + } + } + + /** + * 'initializeLayout' function + * + * Initialize 'layout' + * Use first available array input: + * 1. layout - recommended + * 2. form - Angular Schema Form style + * 3. form.form - JSON Form style + * 4. form.layout - Single input style + * 5. (none) no layout - set default layout instead + * (full layout will be built later from the schema) + * + * Also, if alternate layout formats are available, + * import from 'UISchema' or 'customFormItems' + * used for React JSON Schema Form and JSON Form API compatibility + * Use first available input: + * 1. UISchema - React JSON Schema Form style + * 2. form.UISchema - For testing single input React JSON Schema Forms + * 2. form.customFormItems - JSON Form style + * 3. (none) no input - don't import + */ + private initializeLayout() { + + // Rename JSON Form-style 'options' lists to + // Angular Schema Form-style 'titleMap' lists. + const fixJsonFormOptions = (layout: any): any => { + if (isObject(layout) || isArray(layout)) { + forEach(layout, (value, key) => { + if (hasOwn(value, 'options') && isObject(value.options)) { + value.titleMap = value.options; + delete value.options; + } + }, 'top-down'); + } + return layout; + }; + + // Check for layout inputs and, if found, initialize form layout + if (isArray(this.layout)) { + this.jsf.layout = _.cloneDeep(this.layout); + } else if (isArray(this.form)) { + this.jsf.AngularSchemaFormCompatibility = true; + this.jsf.layout = _.cloneDeep(this.form); + } else if (this.form && isArray(this.form.form)) { + this.jsf.JsonFormCompatibility = true; + this.jsf.layout = fixJsonFormOptions(_.cloneDeep(this.form.form)); + } else if (this.form && isArray(this.form.layout)) { + this.jsf.layout = _.cloneDeep(this.form.layout); + } else { + this.jsf.layout = ['*']; + } + + // Check for alternate layout inputs + let alternateLayout: any = null; + if (isObject(this.UISchema)) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + alternateLayout = _.cloneDeep(this.UISchema); + } else if (hasOwn(this.form, 'UISchema')) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + alternateLayout = _.cloneDeep(this.form.UISchema); + } else if (hasOwn(this.form, 'uiSchema')) { + this.jsf.ReactJsonSchemaFormCompatibility = true; + alternateLayout = _.cloneDeep(this.form.uiSchema); + } else if (hasOwn(this.form, 'customFormItems')) { + this.jsf.JsonFormCompatibility = true; + alternateLayout = fixJsonFormOptions(_.cloneDeep(this.form.customFormItems)); + } + + // if alternate layout found, copy alternate layout options into schema + if (alternateLayout) { + JsonPointer.forEachDeep(alternateLayout, (value, pointer) => { + const schemaPointer = pointer + .replace(/\//g, '/properties/') + .replace(/\/properties\/items\/properties\//g, '/items/properties/') + .replace(/\/properties\/titleMap\/properties\//g, '/titleMap/properties/'); + if (hasValue(value) && hasValue(pointer)) { + let key = JsonPointer.toKey(pointer); + const groupPointer = (JsonPointer.parse(schemaPointer) || []).slice(0, -2); + let itemPointer: string | string[]; + + // If 'ui:order' object found, copy into object schema root + if (key.toLowerCase() === 'ui:order') { + itemPointer = [...groupPointer, 'ui:order']; + + // Copy other alternate layout options to schema 'x-schema-form', + // (like Angular Schema Form options) and remove any 'ui:' prefixes + } else { + if (key.slice(0, 3).toLowerCase() === 'ui:') { key = key.slice(3); } + itemPointer = [...groupPointer, 'x-schema-form', key]; + } + if (JsonPointer.has(this.jsf.schema, groupPointer) && + !JsonPointer.has(this.jsf.schema, itemPointer) + ) { + JsonPointer.set(this.jsf.schema, itemPointer, value); + } + } + }); + } + } + + /** + * 'activateForm' function + * + * ...continued from 'initializeSchema' function, above + * If 'schema' has not been initialized (i.e. no schema input found) + * 6. If layout input - build schema from layout input + * 7. If data input - build schema from data input + * + * Create final layout, + * build the FormGroup template and the Angular FormGroup, + * subscribe to changes, + * and activate the form. + */ + private activateForm() { + + // If 'schema' not initialized + if (isEmpty(this.jsf.schema)) { + + // TODO: If full layout input (with no '*'), build schema from layout + // if (!this.jsf.layout.includes('*')) { + // this.jsf.buildSchemaFromLayout(); + // } else + + // If data input, build schema from data + if (!isEmpty(this.jsf.formValues)) { + this.jsf.buildSchemaFromData(); + } + } + + if (!isEmpty(this.jsf.schema)) { + + // If not already initialized, initialize ajv and compile schema + this.jsf.compileAjvSchema(); + + // Update all layout elements, add values, widgets, and validators, + // replace any '*' with a layout built from all schema elements, + // and update the FormGroup template with any new validators + this.jsf.buildLayout(this.widgetLibrary); + + // Build the Angular FormGroup template from the schema + this.jsf.buildFormGroupTemplate(this.jsf.formValues); + + // Build the real Angular FormGroup from the FormGroup template + this.jsf.buildFormGroup(); + } + + if (this.jsf.formGroup) { + + // Reset initial form values + if (!isEmpty(this.jsf.formValues) && + this.jsf.formOptions.setSchemaDefaults !== true && + this.jsf.formOptions.setLayoutDefaults !== true + ) { + this.setFormValues(this.jsf.formValues); + } + + // TODO: Figure out how to display calculated values without changing object data + // See http://ulion.github.io/jsonform/playground/?example=templating-values + // Calculate references to other fields + // if (!isEmpty(this.jsf.formGroup.value)) { + // forEach(this.jsf.formGroup.value, (value, key, object, rootObject) => { + // if (typeof value === 'string') { + // object[key] = this.jsf.parseText(value, value, rootObject, key); + // } + // }, 'top-down'); + // } + + // Subscribe to form changes to output live data, validation, and errors + this.jsf.dataChanges.subscribe(data => { + this.onChanges.emit(this.objectWrap ? data['1'] : data); + if (this.formValuesInput && this.formValuesInput.indexOf('.') === -1) { + this[`${this.formValuesInput}Change`].emit(this.objectWrap ? data['1'] : data); + } + }); + + // Trigger change detection on statusChanges to show updated errors + this.jsf.formGroup.statusChanges.subscribe(() => this.changeDetector.markForCheck()); + this.jsf.isValidChanges.subscribe(isValid => this.isValid.emit(isValid)); + this.jsf.validationErrorChanges.subscribe(err => this.validationErrors.emit(err)); + + // Output final schema, final layout, and initial data + this.formSchema.emit(this.jsf.schema); + this.formLayout.emit(this.jsf.layout); + this.onChanges.emit(this.objectWrap ? this.jsf.data['1'] : this.jsf.data); + + // If validateOnRender, output initial validation and any errors + const validateOnRender = + JsonPointer.get(this.jsf, '/formOptions/validateOnRender'); + if (validateOnRender) { // validateOnRender === 'auto' || true + const touchAll = (control) => { + if (validateOnRender === true || hasValue(control.value)) { + control.markAsTouched(); + } + Object.keys(control.controls || {}) + .forEach(key => touchAll(control.controls[key])); + }; + touchAll(this.jsf.formGroup); + this.isValid.emit(this.jsf.isValid); + this.validationErrors.emit(this.jsf.ajvErrors); + } + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.module.ts new file mode 100644 index 000000000..19302c3c3 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.module.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { JsonSchemaFormComponent } from './json-schema-form.component'; +import { NgModule } from '@angular/core'; +import { NoFrameworkModule } from './framework-library/no-framework/no-framework.module'; +import { WidgetLibraryModule } from './widget-library/widget-library.module'; + + + + +@NgModule({ + imports: [ + CommonModule, FormsModule, ReactiveFormsModule, + WidgetLibraryModule, NoFrameworkModule + ], + declarations: [JsonSchemaFormComponent], + exports: [JsonSchemaFormComponent, WidgetLibraryModule] +}) +export class JsonSchemaFormModule {} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.service.ts b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.service.ts new file mode 100644 index 000000000..df1da3703 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/json-schema-form.service.ts @@ -0,0 +1,681 @@ +import _ from 'lodash'; +import Ajv from 'ajv'; +import { AbstractControl, FormArray, FormGroup } from '@angular/forms'; +import { + buildFormGroup, + buildFormGroupTemplate, + formatFormData, + getControl + } from './shared/form-group.functions'; +import { buildLayout, getLayoutNode } from './shared/layout.functions'; +import { buildSchemaFromData, buildSchemaFromLayout, removeRecursiveReferences } from './shared/json-schema.functions'; +import { enValidationMessages } from './locale/en-validation-messages'; +import { + fixTitle, + forEach, + hasOwn, + toTitleCase + } from './shared/utility.functions'; +import { frValidationMessages } from './locale/fr-validation-messages'; +import { + hasValue, + isArray, + isDefined, + isEmpty, + isObject + } from './shared/validator.functions'; +import { Injectable } from '@angular/core'; +import { JsonPointer } from './shared/jsonpointer.functions'; +import { Subject } from 'rxjs'; + + + +export interface TitleMapItem { + name?: string; value?: any; checked?: boolean; group?: string; items?: TitleMapItem[]; +} +export interface ErrorMessages { + [control_name: string]: { message: string | Function | Object, code: string }[]; +} + + +@Injectable() +export class JsonSchemaFormService { + JsonFormCompatibility = false; + ReactJsonSchemaFormCompatibility = false; + AngularSchemaFormCompatibility = false; + tpldata: any = {}; + + ajvOptions: any = { allErrors: true, jsonPointers: true, unknownFormats: 'ignore' }; + ajv: any = new Ajv(this.ajvOptions); // AJV: Another JSON Schema Validator + validateFormData: any = null; // Compiled AJV function to validate active form's schema + + formValues: any = {}; // Internal form data (may not have correct types) + data: any = {}; // Output form data (formValues, formatted with correct data types) + schema: any = {}; // Internal JSON Schema + layout: any[] = []; // Internal form layout + formGroupTemplate: any = {}; // Template used to create formGroup + formGroup: any = null; // Angular formGroup, which powers the reactive form + framework: any = null; // Active framework component + formOptions: any; // Active options, used to configure the form + + validData: any = null; // Valid form data (or null) (=== isValid ? data : null) + isValid: boolean = null; // Is current form data valid? + ajvErrors: any = null; // Ajv errors for current data + validationErrors: any = null; // Any validation errors for current data + dataErrors: any = new Map(); // + formValueSubscription: any = null; // Subscription to formGroup.valueChanges observable (for un- and re-subscribing) + dataChanges: Subject = new Subject(); // Form data observable + isValidChanges: Subject = new Subject(); // isValid observable + validationErrorChanges: Subject = new Subject(); // validationErrors observable + + arrayMap: Map = new Map(); // Maps arrays in data object and number of tuple values + dataMap: Map = new Map(); // Maps paths in form data to schema and formGroup paths + dataRecursiveRefMap: Map = new Map(); // Maps recursive reference points in form data + schemaRecursiveRefMap: Map = new Map(); // Maps recursive reference points in schema + schemaRefLibrary: any = {}; // Library of schemas for resolving schema $refs + layoutRefLibrary: any = { '': null }; // Library of layout nodes for adding to form + templateRefLibrary: any = {}; // Library of formGroup templates for adding to form + hasRootReference = false; // Does the form include a recursive reference to itself? + + language = 'en-US'; // Does the form include a recursive reference to itself? + + // Default global form options + defaultFormOptions: any = { + addSubmit: 'auto', // Add a submit button if layout does not have one? + // for addSubmit: true = always, false = never, + // 'auto' = only if layout is undefined (form is built from schema alone) + debug: false, // Show debugging output? + disableInvalidSubmit: true, // Disable submit if form invalid? + formDisabled: false, // Set entire form as disabled? (not editable, and disables outputs) + formReadonly: false, // Set entire form as read only? (not editable, but outputs still enabled) + fieldsRequired: false, // (set automatically) Are there any required fields in the form? + framework: 'no-framework', // The framework to load + loadExternalAssets: false, // Load external css and JavaScript for framework? + pristine: { errors: true, success: true }, + supressPropertyTitles: false, + setSchemaDefaults: 'auto', // Set fefault values from schema? + // true = always set (unless overridden by layout default or formValues) + // false = never set + // 'auto' = set in addable components, and everywhere if formValues not set + setLayoutDefaults: 'auto', // Set fefault values from layout? + // true = always set (unless overridden by formValues) + // false = never set + // 'auto' = set in addable components, and everywhere if formValues not set + validateOnRender: 'auto', // Validate fields immediately, before they are touched? + // true = validate all fields immediately + // false = only validate fields after they are touched by user + // 'auto' = validate fields with values immediately, empty fields after they are touched + widgets: {}, // Any custom widgets to load + defautWidgetOptions: { // Default options for form control widgets + listItems: 1, // Number of list items to initially add to arrays with no default value + addable: true, // Allow adding items to an array or $ref point? + orderable: true, // Allow reordering items within an array? + removable: true, // Allow removing items from an array or $ref point? + enableErrorState: true, // Apply 'has-error' class when field fails validation? + // disableErrorState: false, // Don't apply 'has-error' class when field fails validation? + enableSuccessState: true, // Apply 'has-success' class when field validates? + // disableSuccessState: false, // Don't apply 'has-success' class when field validates? + feedback: false, // Show inline feedback icons? + feedbackOnRender: false, // Show errorMessage on Render? + notitle: false, // Hide title? + disabled: false, // Set control as disabled? (not editable, and excluded from output) + readonly: false, // Set control as read only? (not editable, but included in output) + returnEmptyFields: true, // return values for fields that contain no data? + validationMessages: {} // set by setLanguage() + }, + }; + + constructor() { + this.setLanguage(this.language); + } + + setLanguage(language: string = 'en-US') { + this.language = language; + const validationMessages = language.slice(0, 2) === 'fr' ? + frValidationMessages : enValidationMessages; + this.defaultFormOptions.defautWidgetOptions.validationMessages = + _.cloneDeep(validationMessages); + } + + getData() { return this.data; } + + getSchema() { return this.schema; } + + getLayout() { return this.layout; } + + resetAllValues() { + this.JsonFormCompatibility = false; + this.ReactJsonSchemaFormCompatibility = false; + this.AngularSchemaFormCompatibility = false; + this.tpldata = {}; + this.validateFormData = null; + this.formValues = {}; + this.schema = {}; + this.layout = []; + this.formGroupTemplate = {}; + this.formGroup = null; + this.framework = null; + this.data = {}; + this.validData = null; + this.isValid = null; + this.validationErrors = null; + this.arrayMap = new Map(); + this.dataMap = new Map(); + this.dataRecursiveRefMap = new Map(); + this.schemaRecursiveRefMap = new Map(); + this.layoutRefLibrary = {}; + this.schemaRefLibrary = {}; + this.templateRefLibrary = {}; + this.formOptions = _.cloneDeep(this.defaultFormOptions); + } + + /** + * 'buildRemoteError' function + * + * Example errors: + * { + * last_name: [ { + * message: 'Last name must by start with capital letter.', + * code: 'capital_letter' + * } ], + * email: [ { + * message: 'Email must be from example.com domain.', + * code: 'special_domain' + * }, { + * message: 'Email must contain an @ symbol.', + * code: 'at_symbol' + * } ] + * } + * //{ErrorMessages} errors + */ + buildRemoteError(errors: ErrorMessages) { + forEach(errors, (value, key) => { + if (key in this.formGroup.controls) { + for (const error of value) { + const err = {}; + err[error['code']] = error['message']; + this.formGroup.get(key).setErrors(err, { emitEvent: true }); + } + } + }); + } + + validateData(newValue: any, updateSubscriptions = true): void { + + // Format raw form data to correct data types + this.data = formatFormData( + newValue, this.dataMap, this.dataRecursiveRefMap, + this.arrayMap, this.formOptions.returnEmptyFields + ); + this.isValid = this.validateFormData(this.data); + this.validData = this.isValid ? this.data : null; + const compileErrors = errors => { + const compiledErrors = {}; + (errors || []).forEach(error => { + if (!compiledErrors[error.dataPath]) { compiledErrors[error.dataPath] = []; } + compiledErrors[error.dataPath].push(error.message); + }); + return compiledErrors; + }; + this.ajvErrors = this.validateFormData.errors; + this.validationErrors = compileErrors(this.validateFormData.errors); + if (updateSubscriptions) { + this.dataChanges.next(this.data); + this.isValidChanges.next(this.isValid); + this.validationErrorChanges.next(this.ajvErrors); + } + } + + buildFormGroupTemplate(formValues: any = null, setValues = true) { + this.formGroupTemplate = buildFormGroupTemplate(this, formValues, setValues); + } + + buildFormGroup() { + this.formGroup = buildFormGroup(this.formGroupTemplate); + if (this.formGroup) { + this.compileAjvSchema(); + this.validateData(this.formGroup.value); + + // Set up observables to emit data and validation info when form data changes + if (this.formValueSubscription) { this.formValueSubscription.unsubscribe(); } + this.formValueSubscription = this.formGroup.valueChanges + .subscribe(formValue => this.validateData(formValue)); + } + } + + buildLayout(widgetLibrary: any) { + this.layout = buildLayout(this, widgetLibrary); + } + + setOptions(newOptions: any) { + if (isObject(newOptions)) { + const addOptions = _.cloneDeep(newOptions); + // Backward compatibility for 'defaultOptions' (renamed 'defautWidgetOptions') + if (isObject(addOptions.defaultOptions)) { + Object.assign(this.formOptions.defautWidgetOptions, addOptions.defaultOptions); + delete addOptions.defaultOptions; + } + if (isObject(addOptions.defautWidgetOptions)) { + Object.assign(this.formOptions.defautWidgetOptions, addOptions.defautWidgetOptions); + delete addOptions.defautWidgetOptions; + } + Object.assign(this.formOptions, addOptions); + + // convert disableErrorState / disableSuccessState to enable... + const globalDefaults = this.formOptions.defautWidgetOptions; + ['ErrorState', 'SuccessState'] + .filter(suffix => hasOwn(globalDefaults, 'disable' + suffix)) + .forEach(suffix => { + globalDefaults['enable' + suffix] = !globalDefaults['disable' + suffix]; + delete globalDefaults['disable' + suffix]; + }); + } + } + + compileAjvSchema() { + if (!this.validateFormData) { + + // if 'ui:order' exists in properties, move it to root before compiling with ajv + if (Array.isArray(this.schema.properties['ui:order'])) { + this.schema['ui:order'] = this.schema.properties['ui:order']; + delete this.schema.properties['ui:order']; + } + this.ajv.removeSchema(this.schema); + this.validateFormData = this.ajv.compile(this.schema); + } + } + + buildSchemaFromData(data?: any, requireAllFields = false): any { + if (data) { return buildSchemaFromData(data, requireAllFields); } + this.schema = buildSchemaFromData(this.formValues, requireAllFields); + } + + buildSchemaFromLayout(layout?: any): any { + if (layout) { return buildSchemaFromLayout(layout); } + this.schema = buildSchemaFromLayout(this.layout); + } + + + setTpldata(newTpldata: any = {}): void { + this.tpldata = newTpldata; + } + + parseText( + text = '', value: any = {}, values: any = {}, key: number | string = null + ): string { + if (!text || !/{{.+?}}/.test(text)) { return text; } + return text.replace(/{{(.+?)}}/g, (...a) => + this.parseExpression(a[1], value, values, key, this.tpldata) + ); + } + + parseExpression( + expression = '', value: any = {}, values: any = {}, + key: number | string = null, tpldata: any = null + ) { + if (typeof expression !== 'string') { return ''; } + const index = typeof key === 'number' ? (key + 1) + '' : (key || ''); + expression = expression.trim(); + if ((expression[0] === '\'' || expression[0] === '"') && + expression[0] === expression[expression.length - 1] && + expression.slice(1, expression.length - 1).indexOf(expression[0]) === -1 + ) { + return expression.slice(1, expression.length - 1); + } + if (expression === 'idx' || expression === '$index') { return index; } + if (expression === 'value' && !hasOwn(values, 'value')) { return value; } + if (['"', '\'', ' ', '||', '&&', '+'].every(delim => expression.indexOf(delim) === -1)) { + const pointer = JsonPointer.parseObjectPath(expression); + return pointer[0] === 'value' && JsonPointer.has(value, pointer.slice(1)) ? + JsonPointer.get(value, pointer.slice(1)) : + pointer[0] === 'values' && JsonPointer.has(values, pointer.slice(1)) ? + JsonPointer.get(values, pointer.slice(1)) : + pointer[0] === 'tpldata' && JsonPointer.has(tpldata, pointer.slice(1)) ? + JsonPointer.get(tpldata, pointer.slice(1)) : + JsonPointer.has(values, pointer) ? JsonPointer.get(values, pointer) : ''; + } + if (expression.indexOf('[idx]') > -1) { + expression = expression.replace(/\[idx\]/g, index); + } + if (expression.indexOf('[$index]') > -1) { + expression = expression.replace(/\[$index\]/g, index); + } + // TODO: Improve expression evaluation by parsing quoted strings first + // let expressionArray = expression.match(/([^"']+|"[^"]+"|'[^']+')/g); + if (expression.indexOf('||') > -1) { + return expression.split('||').reduce((all, term) => + all || this.parseExpression(term, value, values, key, tpldata), '' + ); + } + if (expression.indexOf('&&') > -1) { + return expression.split('&&').reduce((all, term) => + all && this.parseExpression(term, value, values, key, tpldata), ' ' + ).trim(); + } + if (expression.indexOf('+') > -1) { + return expression.split('+') + .map(term => this.parseExpression(term, value, values, key, tpldata)) + .join(''); + } + return ''; + } + + setArrayItemTitle( + parentCtx: any = {}, childNode: any = null, index: number = null + ): string { + const parentNode = parentCtx.layoutNode; + const parentValues: any = this.getFormControlValue(parentCtx); + const isArrayItem = + (parentNode.type || '').slice(-5) === 'array' && isArray(parentValues); + const text = JsonPointer.getFirst( + isArrayItem && childNode.type !== '$ref' ? [ + [childNode, '/options/legend'], + [childNode, '/options/title'], + [parentNode, '/options/title'], + [parentNode, '/options/legend'], + ] : [ + [childNode, '/options/title'], + [childNode, '/options/legend'], + [parentNode, '/options/title'], + [parentNode, '/options/legend'] + ] + ); + if (!text) { return text; } + const childValue = isArray(parentValues) && index < parentValues.length ? + parentValues[index] : parentValues; + return this.parseText(text, childValue, parentValues, index); + } + + setItemTitle(ctx: any) { + return !ctx.options.title && /^(\d+|-)$/.test(ctx.layoutNode.name) ? + null : + this.parseText( + ctx.options.title || toTitleCase(ctx.layoutNode.name), + this.getFormControlValue(this), + (this.getFormControlGroup(this) || {}).value, + ctx.dataIndex[ctx.dataIndex.length - 1] + ); + } + + evaluateCondition(layoutNode: any, dataIndex: number[]): boolean { + const arrayIndex = dataIndex && dataIndex[dataIndex.length - 1]; + let result = true; + if (hasValue((layoutNode.options || {}).condition)) { + if (typeof layoutNode.options.condition === 'string') { + let pointer = layoutNode.options.condition; + if (hasValue(arrayIndex)) { + pointer = pointer.replace('[arrayIndex]', `[${arrayIndex}]`); + } + pointer = JsonPointer.parseObjectPath(pointer); + result = !!JsonPointer.get(this.data, pointer); + if (!result && pointer[0] === 'model') { + result = !!JsonPointer.get({ model: this.data }, pointer); + } + } else if (typeof layoutNode.options.condition === 'function') { + result = layoutNode.options.condition(this.data); + } else if (typeof layoutNode.options.condition.functionBody === 'string') { + try { + const dynFn = new Function( + 'model', 'arrayIndices', layoutNode.options.condition.functionBody + ); + result = dynFn(this.data, dataIndex); + } catch (e) { + result = true; + console.error('condition functionBody errored out on evaluation: ' + layoutNode.options.condition.functionBody); + } + } + } + return result; + } + + initializeControl(ctx: any, bind = true): boolean { + if (!isObject(ctx)) { return false; } + if (isEmpty(ctx.options)) { + ctx.options = !isEmpty((ctx.layoutNode || {}).options) ? + ctx.layoutNode.options : _.cloneDeep(this.formOptions); + } + ctx.formControl = this.getFormControl(ctx); + ctx.boundControl = bind && !!ctx.formControl; + if (ctx.formControl) { + ctx.controlName = this.getFormControlName(ctx); + ctx.controlValue = ctx.formControl.value; + ctx.controlDisabled = ctx.formControl.disabled; + ctx.options.errorMessage = ctx.formControl.status === 'VALID' ? null : + this.formatErrors(ctx.formControl.errors, ctx.options.validationMessages); + ctx.options.showErrors = this.formOptions.validateOnRender === true || + (this.formOptions.validateOnRender === 'auto' && hasValue(ctx.controlValue)); + ctx.formControl.statusChanges.subscribe(status => + ctx.options.errorMessage = status === 'VALID' ? null : + this.formatErrors(ctx.formControl.errors, ctx.options.validationMessages) + ); + ctx.formControl.valueChanges.subscribe(value => { + if (!_.isEqual(ctx.controlValue, value)) { ctx.controlValue = value; } + }); + } else { + ctx.controlName = ctx.layoutNode.name; + ctx.controlValue = ctx.layoutNode.value || null; + const dataPointer = this.getDataPointer(ctx); + if (bind && dataPointer) { + console.error(`warning: control "${dataPointer}" is not bound to the Angular FormGroup.`); + } + } + return ctx.boundControl; + } + + formatErrors(errors: any, validationMessages: any = {}): string { + if (isEmpty(errors)) { return null; } + if (!isObject(validationMessages)) { validationMessages = {}; } + const addSpaces = string => string[0].toUpperCase() + (string.slice(1) || '') + .replace(/([a-z])([A-Z])/g, '$1 $2').replace(/_/g, ' '); + const formatError = (error) => typeof error === 'object' ? + Object.keys(error).map(key => + error[key] === true ? addSpaces(key) : + error[key] === false ? 'Not ' + addSpaces(key) : + addSpaces(key) + ': ' + formatError(error[key]) + ).join(', ') : + addSpaces(error.toString()); + const messages = []; + return Object.keys(errors) + // Hide 'required' error, unless it is the only one + .filter(errorKey => errorKey !== 'required' || Object.keys(errors).length === 1) + .map(errorKey => + // If validationMessages is a string, return it + typeof validationMessages === 'string' ? validationMessages : + // If custom error message is a function, return function result + typeof validationMessages[errorKey] === 'function' ? + validationMessages[errorKey](errors[errorKey]) : + // If custom error message is a string, replace placeholders and return + typeof validationMessages[errorKey] === 'string' ? + // Does error message have any {{property}} placeholders? + !/{{.+?}}/.test(validationMessages[errorKey]) ? + validationMessages[errorKey] : + // Replace {{property}} placeholders with values + Object.keys(errors[errorKey]) + .reduce((errorMessage, errorProperty) => errorMessage.replace( + new RegExp('{{' + errorProperty + '}}', 'g'), + errors[errorKey][errorProperty] + ), validationMessages[errorKey]) : + // If no custom error message, return formatted error data instead + addSpaces(errorKey) + ' Error: ' + formatError(errors[errorKey]) + ).join('
'); + } + + updateValue(ctx: any, value: any): void { + + // Set value of current control + ctx.controlValue = value; + if (ctx.boundControl) { + ctx.formControl.setValue(value); + ctx.formControl.markAsDirty(); + } + ctx.layoutNode.value = value; + + // Set values of any related controls in copyValueTo array + if (isArray(ctx.options.copyValueTo)) { + for (const item of ctx.options.copyValueTo) { + const targetControl = getControl(this.formGroup, item); + if (isObject(targetControl) && typeof targetControl.setValue === 'function') { + targetControl.setValue(value); + targetControl.markAsDirty(); + } + } + } + } + + updateArrayCheckboxList(ctx: any, checkboxList: TitleMapItem[]): void { + const formArray = this.getFormControl(ctx); + + // Remove all existing items + while (formArray.value.length) { formArray.removeAt(0); } + + // Re-add an item for each checked box + const refPointer = removeRecursiveReferences( + ctx.layoutNode.dataPointer + '/-', this.dataRecursiveRefMap, this.arrayMap + ); + for (const checkboxItem of checkboxList) { + if (checkboxItem.checked) { + const newFormControl = buildFormGroup(this.templateRefLibrary[refPointer]); + newFormControl.setValue(checkboxItem.value); + formArray.push(newFormControl); + } + } + formArray.markAsDirty(); + } + + getFormControl(ctx: any): AbstractControl { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || + ctx.layoutNode.type === '$ref' + ) { return null; } + return getControl(this.formGroup, this.getDataPointer(ctx)); + } + + getFormControlValue(ctx: any): AbstractControl { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || + ctx.layoutNode.type === '$ref' + ) { return null; } + const control = getControl(this.formGroup, this.getDataPointer(ctx)); + return control ? control.value : null; + } + + getFormControlGroup(ctx: any): FormArray | FormGroup { + if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer)) { return null; } + return getControl(this.formGroup, this.getDataPointer(ctx), true); + } + + getFormControlName(ctx: any): string { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex) + ) { return null; } + return JsonPointer.toKey(this.getDataPointer(ctx)); + } + + getLayoutArray(ctx: any): any[] { + return JsonPointer.get(this.layout, this.getLayoutPointer(ctx), 0, -1); + } + + getParentNode(ctx: any): any { + return JsonPointer.get(this.layout, this.getLayoutPointer(ctx), 0, -2); + } + + getDataPointer(ctx: any): string { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex) + ) { return null; } + return JsonPointer.toIndexedPointer( + ctx.layoutNode.dataPointer, ctx.dataIndex, this.arrayMap + ); + } + + getLayoutPointer(ctx: any): string { + if (!hasValue(ctx.layoutIndex)) { return null; } + return '/' + ctx.layoutIndex.join('/items/'); + } + + isControlBound(ctx: any): boolean { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex) + ) { return false; } + const controlGroup = this.getFormControlGroup(ctx); + const name = this.getFormControlName(ctx); + return controlGroup ? hasOwn(controlGroup.controls, name) : false; + } + + addItem(ctx: any, name?: string): boolean { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.$ref) || + !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex) + ) { return false; } + + // Create a new Angular form control from a template in templateRefLibrary + const newFormGroup = buildFormGroup(this.templateRefLibrary[ctx.layoutNode.$ref]); + + // Add the new form control to the parent formArray or formGroup + if (ctx.layoutNode.arrayItem) { // Add new array item to formArray + (this.getFormControlGroup(ctx)).push(newFormGroup); + } else { // Add new $ref item to formGroup + (this.getFormControlGroup(ctx)) + .addControl(name || this.getFormControlName(ctx), newFormGroup); + } + + // Copy a new layoutNode from layoutRefLibrary + const newLayoutNode = getLayoutNode(ctx.layoutNode, this); + newLayoutNode.arrayItem = ctx.layoutNode.arrayItem; + if (ctx.layoutNode.arrayItemType) { + newLayoutNode.arrayItemType = ctx.layoutNode.arrayItemType; + } else { + delete newLayoutNode.arrayItemType; + } + if (name) { + newLayoutNode.name = name; + newLayoutNode.dataPointer += '/' + JsonPointer.escape(name); + newLayoutNode.options.title = fixTitle(name); + } + + // Add the new layoutNode to the form layout + JsonPointer.insert(this.layout, this.getLayoutPointer(ctx), newLayoutNode); + + return true; + } + + moveArrayItem(ctx: any, oldIndex: number, newIndex: number): boolean { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || + !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex) || + !isDefined(oldIndex) || !isDefined(newIndex) || oldIndex === newIndex + ) { return false; } + + // Move item in the formArray + const formArray = this.getFormControlGroup(ctx); + const arrayItem = formArray.at(oldIndex); + formArray.removeAt(oldIndex); + formArray.insert(newIndex, arrayItem); + formArray.updateValueAndValidity(); + + // Move layout item + const layoutArray = this.getLayoutArray(ctx); + layoutArray.splice(newIndex, 0, layoutArray.splice(oldIndex, 1)[0]); + return true; + } + + removeItem(ctx: any): boolean { + if ( + !ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || + !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex) + ) { return false; } + + // Remove the Angular form control from the parent formArray or formGroup + if (ctx.layoutNode.arrayItem) { // Remove array item from formArray + (this.getFormControlGroup(ctx)) + .removeAt(ctx.dataIndex[ctx.dataIndex.length - 1]); + } else { // Remove $ref item from formGroup + (this.getFormControlGroup(ctx)) + .removeControl(this.getFormControlName(ctx)); + } + + // Remove layoutNode from layout + JsonPointer.remove(this.layout, this.getLayoutPointer(ctx)); + return true; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/locale/en-validation-messages.ts b/frontend/projects/angular7-json-schema-form/src/lib/locale/en-validation-messages.ts new file mode 100644 index 000000000..323f006f9 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/locale/en-validation-messages.ts @@ -0,0 +1,58 @@ +export const enValidationMessages: any = { // Default English error messages + required: 'This field is required.', + minLength: 'Must be {{minimumLength}} characters or longer (current length: {{currentLength}})', + maxLength: 'Must be {{maximumLength}} characters or shorter (current length: {{currentLength}})', + pattern: 'Must match pattern: {{requiredPattern}}', + format: function (error) { + switch (error.requiredFormat) { + case 'date': + return 'Must be a date, like "2000-12-31"'; + case 'time': + return 'Must be a time, like "16:20" or "03:14:15.9265"'; + case 'date-time': + return 'Must be a date-time, like "2000-03-14T01:59" or "2000-03-14T01:59:26.535Z"'; + case 'email': + return 'Must be an email address, like "name@example.com"'; + case 'hostname': + return 'Must be a hostname, like "example.com"'; + case 'ipv4': + return 'Must be an IPv4 address, like "127.0.0.1"'; + case 'ipv6': + return 'Must be an IPv6 address, like "1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0"'; + // TODO: add examples for 'uri', 'uri-reference', and 'uri-template' + // case 'uri': case 'uri-reference': case 'uri-template': + case 'url': + return 'Must be a url, like "http://www.example.com/page.html"'; + case 'uuid': + return 'Must be a uuid, like "12345678-9ABC-DEF0-1234-56789ABCDEF0"'; + case 'color': + return 'Must be a color, like "#FFFFFF" or "rgb(255, 255, 255)"'; + case 'json-pointer': + return 'Must be a JSON Pointer, like "/pointer/to/something"'; + case 'relative-json-pointer': + return 'Must be a relative JSON Pointer, like "2/pointer/to/something"'; + case 'regex': + return 'Must be a regular expression, like "(1-)?\\d{3}-\\d{3}-\\d{4}"'; + default: + return 'Must be a correctly formatted ' + error.requiredFormat; + } + }, + minimum: 'Must be {{minimumValue}} or more', + exclusiveMinimum: 'Must be more than {{exclusiveMinimumValue}}', + maximum: 'Must be {{maximumValue}} or less', + exclusiveMaximum: 'Must be less than {{exclusiveMaximumValue}}', + multipleOf: function (error) { + if ((1 / error.multipleOfValue) % 10 === 0) { + const decimals = Math.log10(1 / error.multipleOfValue); + return `Must have ${decimals} or fewer decimal places.`; + } else { + return `Must be a multiple of ${error.multipleOfValue}.`; + } + }, + minProperties: 'Must have {{minimumProperties}} or more items (current items: {{currentProperties}})', + maxProperties: 'Must have {{maximumProperties}} or fewer items (current items: {{currentProperties}})', + minItems: 'Must have {{minimumItems}} or more items (current items: {{currentItems}})', + maxItems: 'Must have {{maximumItems}} or fewer items (current items: {{currentItems}})', + uniqueItems: 'All items must be unique', + // Note: No default error messages for 'type', 'const', 'enum', or 'dependencies' +}; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/locale/fr-validation-messages.ts b/frontend/projects/angular7-json-schema-form/src/lib/locale/fr-validation-messages.ts new file mode 100644 index 000000000..631f7ee77 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/locale/fr-validation-messages.ts @@ -0,0 +1,58 @@ +export const frValidationMessages: any = { // French error messages + required: 'Est obligatoire.', + minLength: 'Doit avoir minimum {{minimumLength}} caractères (actuellement: {{currentLength}})', + maxLength: 'Doit avoir maximum {{maximumLength}} caractères (actuellement: {{currentLength}})', + pattern: 'Doit respecter: {{requiredPattern}}', + format: function (error) { + switch (error.requiredFormat) { + case 'date': + return 'Doit être une date, tel que "2000-12-31"'; + case 'time': + return 'Doit être une heure, tel que "16:20" ou "03:14:15.9265"'; + case 'date-time': + return 'Doit être une date et une heure, tel que "2000-03-14T01:59" ou "2000-03-14T01:59:26.535Z"'; + case 'email': + return 'Doit être une adresse e-mail, tel que "name@example.com"'; + case 'hostname': + return 'Doit être un nom de domaine, tel que "example.com"'; + case 'ipv4': + return 'Doit être une adresse IPv4, tel que "127.0.0.1"'; + case 'ipv6': + return 'Doit être une adresse IPv6, tel que "1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0"'; + // TODO: add examples for 'uri', 'uri-reference', and 'uri-template' + // case 'uri': case 'uri-reference': case 'uri-template': + case 'url': + return 'Doit être une URL, tel que "http://www.example.com/page.html"'; + case 'uuid': + return 'Doit être un UUID, tel que "12345678-9ABC-DEF0-1234-56789ABCDEF0"'; + case 'color': + return 'Doit être une couleur, tel que "#FFFFFF" or "rgb(255, 255, 255)"'; + case 'json-pointer': + return 'Doit être un JSON Pointer, tel que "/pointer/to/something"'; + case 'relative-json-pointer': + return 'Doit être un relative JSON Pointer, tel que "2/pointer/to/something"'; + case 'regex': + return 'Doit être une expression régulière, tel que "(1-)?\\d{3}-\\d{3}-\\d{4}"'; + default: + return 'Doit être avoir le format correct: ' + error.requiredFormat; + } + }, + minimum: 'Doit être supérieur à {{minimumValue}}', + exclusiveMinimum: 'Doit avoir minimum {{exclusiveMinimumValue}} charactères', + maximum: 'Doit être inférieur à {{maximumValue}}', + exclusiveMaximum: 'Doit avoir maximum {{exclusiveMaximumValue}} charactères', + multipleOf: function (error) { + if ((1 / error.multipleOfValue) % 10 === 0) { + const decimals = Math.log10(1 / error.multipleOfValue); + return `Doit comporter ${decimals} ou moins de decimales.`; + } else { + return `Doit être un multiple de ${error.multipleOfValue}.`; + } + }, + minProperties: 'Doit comporter au minimum {{minimumProperties}} éléments', + maxProperties: 'Doit comporter au maximum {{maximumProperties}} éléments', + minItems: 'Doit comporter au minimum {{minimumItems}} éléments', + maxItems: 'Doit comporter au maximum {{minimumItems}} éléments', + uniqueItems: 'Tous les éléments doivent être uniques', + // Note: No default error messages for 'type', 'const', 'enum', or 'dependencies' +}; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/convert-schema-to-draft6.function.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/convert-schema-to-draft6.function.ts new file mode 100644 index 000000000..556d6c6ae --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/convert-schema-to-draft6.function.ts @@ -0,0 +1,321 @@ +import _ from 'lodash'; + +/** + * 'convertSchemaToDraft6' function + * + * Converts a JSON Schema from draft 1 through 4 format to draft 6 format + * + * Inspired by on geraintluff's JSON Schema 3 to 4 compatibility function: + * https://github.com/geraintluff/json-schema-compatibility + * Also uses suggestions from AJV's JSON Schema 4 to 6 migration guide: + * https://github.com/epoberezkin/ajv/releases/tag/5.0.0 + * And additional details from the official JSON Schema documentation: + * http://json-schema.org + * + * // { object } originalSchema - JSON schema (draft 1, 2, 3, 4, or 6) + * // { OptionObject = {} } options - options: parent schema changed?, schema draft number? + * // { object } - JSON schema (draft 6) + */ +export interface OptionObject { changed?: boolean; draft?: number; } +export function convertSchemaToDraft6(schema, options: OptionObject = {}) { + let draft: number = options.draft || null; + let changed: boolean = options.changed || false; + + if (typeof schema !== 'object') { return schema; } + if (typeof schema.map === 'function') { + return [...schema.map(subSchema => convertSchemaToDraft6(subSchema, { changed, draft }))]; + } + let newSchema = { ...schema }; + const simpleTypes = ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string']; + + if (typeof newSchema.$schema === 'string' && + /http\:\/\/json\-schema\.org\/draft\-0\d\/schema\#/.test(newSchema.$schema) + ) { + draft = newSchema.$schema[30]; + } + + // Convert v1-v2 'contentEncoding' to 'media.binaryEncoding' + // Note: This is only used in JSON hyper-schema (not regular JSON schema) + if (newSchema.contentEncoding) { + newSchema.media = { binaryEncoding: newSchema.contentEncoding }; + delete newSchema.contentEncoding; + changed = true; + } + + // Convert v1-v3 'extends' to 'allOf' + if (typeof newSchema.extends === 'object') { + newSchema.allOf = typeof newSchema.extends.map === 'function' ? + newSchema.extends.map(subSchema => convertSchemaToDraft6(subSchema, { changed, draft })) : + [convertSchemaToDraft6(newSchema.extends, { changed, draft })]; + delete newSchema.extends; + changed = true; + } + + // Convert v1-v3 'disallow' to 'not' + if (newSchema.disallow) { + if (typeof newSchema.disallow === 'string') { + newSchema.not = { type: newSchema.disallow }; + } else if (typeof newSchema.disallow.map === 'function') { + newSchema.not = { + anyOf: newSchema.disallow + .map(type => typeof type === 'object' ? type : { type }) + }; + } + delete newSchema.disallow; + changed = true; + } + + // Convert v3 string 'dependencies' properties to arrays + if (typeof newSchema.dependencies === 'object' && + Object.keys(newSchema.dependencies) + .some(key => typeof newSchema.dependencies[key] === 'string') + ) { + newSchema.dependencies = { ...newSchema.dependencies }; + Object.keys(newSchema.dependencies) + .filter(key => typeof newSchema.dependencies[key] === 'string') + .forEach(key => newSchema.dependencies[key] = [newSchema.dependencies[key]]); + changed = true; + } + + // Convert v1 'maxDecimal' to 'multipleOf' + if (typeof newSchema.maxDecimal === 'number') { + newSchema.multipleOf = 1 / Math.pow(10, newSchema.maxDecimal); + delete newSchema.divisibleBy; + changed = true; + if (!draft || draft === 2) { draft = 1; } + } + + // Convert v2-v3 'divisibleBy' to 'multipleOf' + if (typeof newSchema.divisibleBy === 'number') { + newSchema.multipleOf = newSchema.divisibleBy; + delete newSchema.divisibleBy; + changed = true; + } + + // Convert v1-v2 boolean 'minimumCanEqual' to 'exclusiveMinimum' + if (typeof newSchema.minimum === 'number' && newSchema.minimumCanEqual === false) { + newSchema.exclusiveMinimum = newSchema.minimum; + delete newSchema.minimum; + changed = true; + if (!draft) { draft = 2; } + } else if (typeof newSchema.minimumCanEqual === 'boolean') { + delete newSchema.minimumCanEqual; + changed = true; + if (!draft) { draft = 2; } + } + + // Convert v3-v4 boolean 'exclusiveMinimum' to numeric + if (typeof newSchema.minimum === 'number' && newSchema.exclusiveMinimum === true) { + newSchema.exclusiveMinimum = newSchema.minimum; + delete newSchema.minimum; + changed = true; + } else if (typeof newSchema.exclusiveMinimum === 'boolean') { + delete newSchema.exclusiveMinimum; + changed = true; + } + + // Convert v1-v2 boolean 'maximumCanEqual' to 'exclusiveMaximum' + if (typeof newSchema.maximum === 'number' && newSchema.maximumCanEqual === false) { + newSchema.exclusiveMaximum = newSchema.maximum; + delete newSchema.maximum; + changed = true; + if (!draft) { draft = 2; } + } else if (typeof newSchema.maximumCanEqual === 'boolean') { + delete newSchema.maximumCanEqual; + changed = true; + if (!draft) { draft = 2; } + } + + // Convert v3-v4 boolean 'exclusiveMaximum' to numeric + if (typeof newSchema.maximum === 'number' && newSchema.exclusiveMaximum === true) { + newSchema.exclusiveMaximum = newSchema.maximum; + delete newSchema.maximum; + changed = true; + } else if (typeof newSchema.exclusiveMaximum === 'boolean') { + delete newSchema.exclusiveMaximum; + changed = true; + } + + // Search object 'properties' for 'optional', 'required', and 'requires' items, + // and convert them into object 'required' arrays and 'dependencies' objects + if (typeof newSchema.properties === 'object') { + const properties = { ...newSchema.properties }; + const requiredKeys = Array.isArray(newSchema.required) ? + new Set(newSchema.required) : new Set(); + + // Convert v1-v2 boolean 'optional' properties to 'required' array + if (draft === 1 || draft === 2 || + Object.keys(properties).some(key => properties[key].optional === true) + ) { + Object.keys(properties) + .filter(key => properties[key].optional !== true) + .forEach(key => requiredKeys.add(key)); + changed = true; + if (!draft) { draft = 2; } + } + + // Convert v3 boolean 'required' properties to 'required' array + if (Object.keys(properties).some(key => properties[key].required === true)) { + Object.keys(properties) + .filter(key => properties[key].required === true) + .forEach(key => requiredKeys.add(key)); + changed = true; + } + + if (requiredKeys.size) { newSchema.required = Array.from(requiredKeys); } + + // Convert v1-v2 array or string 'requires' properties to 'dependencies' object + if (Object.keys(properties).some(key => properties[key].requires)) { + const dependencies = typeof newSchema.dependencies === 'object' ? + { ...newSchema.dependencies } : {}; + Object.keys(properties) + .filter(key => properties[key].requires) + .forEach(key => dependencies[key] = + typeof properties[key].requires === 'string' ? + [properties[key].requires] : properties[key].requires + ); + newSchema.dependencies = dependencies; + changed = true; + if (!draft) { draft = 2; } + } + + newSchema.properties = properties; + } + + // Revove v1-v2 boolean 'optional' key + if (typeof newSchema.optional === 'boolean') { + delete newSchema.optional; + changed = true; + if (!draft) { draft = 2; } + } + + // Revove v1-v2 'requires' key + if (newSchema.requires) { + delete newSchema.requires; + } + + // Revove v3 boolean 'required' key + if (typeof newSchema.required === 'boolean') { + delete newSchema.required; + } + + // Convert id to $id + if (typeof newSchema.id === 'string' && !newSchema.$id) { + if (newSchema.id.slice(-1) === '#') { + newSchema.id = newSchema.id.slice(0, -1); + } + newSchema.$id = newSchema.id + '-CONVERTED-TO-DRAFT-06#'; + delete newSchema.id; + changed = true; + } + + // Check if v1-v3 'any' or object types will be converted + if (newSchema.type && (typeof newSchema.type.every === 'function' ? + !newSchema.type.every(type => simpleTypes.includes(type)) : + !simpleTypes.includes(newSchema.type) + )) { + changed = true; + } + + // If schema changed, update or remove $schema identifier + if (typeof newSchema.$schema === 'string' && + /http\:\/\/json\-schema\.org\/draft\-0[1-4]\/schema\#/.test(newSchema.$schema) + ) { + newSchema.$schema = 'http://json-schema.org/draft-06/schema#'; + changed = true; + } else if (changed && typeof newSchema.$schema === 'string') { + const addToDescription = 'Converted to draft 6 from ' + newSchema.$schema; + if (typeof newSchema.description === 'string' && newSchema.description.length) { + newSchema.description += '\n' + addToDescription; + } else { + newSchema.description = addToDescription; + } + delete newSchema.$schema; + } + + // Convert v1-v3 'any' and object types + if (newSchema.type && (typeof newSchema.type.every === 'function' ? + !newSchema.type.every(type => simpleTypes.includes(type)) : + !simpleTypes.includes(newSchema.type) + )) { + if (newSchema.type.length === 1) { newSchema.type = newSchema.type[0]; } + if (typeof newSchema.type === 'string') { + // Convert string 'any' type to array of all standard types + if (newSchema.type === 'any') { + newSchema.type = simpleTypes; + // Delete non-standard string type + } else { + delete newSchema.type; + } + } else if (typeof newSchema.type === 'object') { + if (typeof newSchema.type.every === 'function') { + // If array of strings, only allow standard types + if (newSchema.type.every(type => typeof type === 'string')) { + newSchema.type = newSchema.type.some(type => type === 'any') ? + newSchema.type = simpleTypes : + newSchema.type.filter(type => simpleTypes.includes(type)); + // If type is an array with objects, convert the current schema to an 'anyOf' array + } else if (newSchema.type.length > 1) { + const arrayKeys = ['additionalItems', 'items', 'maxItems', 'minItems', 'uniqueItems', 'contains']; + const numberKeys = ['multipleOf', 'maximum', 'exclusiveMaximum', 'minimum', 'exclusiveMinimum']; + const objectKeys = ['maxProperties', 'minProperties', 'required', 'additionalProperties', + 'properties', 'patternProperties', 'dependencies', 'propertyNames']; + const stringKeys = ['maxLength', 'minLength', 'pattern', 'format']; + const filterKeys = { + 'array': [...numberKeys, ...objectKeys, ...stringKeys], + 'integer': [...arrayKeys, ...objectKeys, ...stringKeys], + 'number': [...arrayKeys, ...objectKeys, ...stringKeys], + 'object': [...arrayKeys, ...numberKeys, ...stringKeys], + 'string': [...arrayKeys, ...numberKeys, ...objectKeys], + 'all': [...arrayKeys, ...numberKeys, ...objectKeys, ...stringKeys], + }; + const anyOf = []; + for (const type of newSchema.type) { + const newType = typeof type === 'string' ? { type } : { ...type }; + Object.keys(newSchema) + .filter(key => !newType.hasOwnProperty(key) && + ![...(filterKeys[newType.type] || filterKeys.all), 'type', 'default'] + .includes(key) + ) + .forEach(key => newType[key] = newSchema[key]); + anyOf.push(newType); + } + newSchema = newSchema.hasOwnProperty('default') ? + { anyOf, default: newSchema.default } : { anyOf }; + // If type is an object, merge it with the current schema + } else { + const typeSchema = newSchema.type; + delete newSchema.type; + Object.assign(newSchema, typeSchema); + } + } + } else { + delete newSchema.type; + } + } + + // Convert sub schemas + Object.keys(newSchema) + .filter(key => typeof newSchema[key] === 'object') + .forEach(key => { + if ( + ['definitions', 'dependencies', 'properties', 'patternProperties'] + .includes(key) && typeof newSchema[key].map !== 'function' + ) { + const newKey = {}; + Object.keys(newSchema[key]).forEach(subKey => newKey[subKey] = + convertSchemaToDraft6(newSchema[key][subKey], { changed, draft }) + ); + newSchema[key] = newKey; + } else if ( + ['items', 'additionalItems', 'additionalProperties', + 'allOf', 'anyOf', 'oneOf', 'not'].includes(key) + ) { + newSchema[key] = convertSchemaToDraft6(newSchema[key], { changed, draft }); + } else { + newSchema[key] = _.cloneDeep(newSchema[key]); + } + }); + + return newSchema; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/date.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/date.functions.ts new file mode 100644 index 000000000..32a5dc157 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/date.functions.ts @@ -0,0 +1,100 @@ +/** + * 'dateToString' function + * + * // { Date | string } date + * // options + * // { string } + */ +export function dateToString(date, options: any = {}) { + const dateFormat = options.dateFormat || 'YYYY-MM-DD'; + // TODO: Use options.locale to change default format and names + // const locale = options.locale || 'en-US'; + if (typeof date === 'string') { date = stringToDate(date); } + if (Object.prototype.toString.call(date) !== '[object Date]') { return null; } + const longMonths = ['January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December']; + const shortMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + const longDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + const shortDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + return dateFormat + .replace(/YYYY/ig, date.getFullYear() + '') + .replace(/YY/ig, (date.getFullYear() + '').slice(-2)) + .replace(/MMMM/ig, longMonths[date.getMonth()]) + .replace(/MMM/ig, shortMonths[date.getMonth()]) + .replace(/MM/ig, ('0' + (date.getMonth() + 1)).slice(-2)) + .replace(/M/ig, (date.getMonth() + 1) + '') + .replace(/DDDD/ig, longDays[date.getDay()]) + .replace(/DDD/ig, shortDays[date.getDay()]) + .replace(/DD/ig, ('0' + date.getDate()).slice(-2)) + .replace(/D/ig, date.getDate() + '') + .replace(/S/ig, ordinal(date.getDate())); +} + +export function ordinal(number: number|string): string { + if (typeof number === 'number') { number = number + ''; } + const last = number.slice(-1); + const nextToLast = number.slice(-2, 1); + return (nextToLast !== '1' && { '1': 'st', '2': 'nd', '3': 'rd' }[last]) || 'th'; +} + +/** + * 'stringToDate' function + * + * // { string } dateString + * // { Date } + */ +export function stringToDate(dateString) { + const getDate: string = findDate(dateString); + if (!getDate) { return null; } + let dateParts: number[] = []; + // Split x-y-z to [x, y, z] + if (/^\d+[^\d]\d+[^\d]\d+$/.test(getDate)) { + dateParts = getDate.split(/[^\d]/).map(part => +part); + // Split xxxxyyzz to [xxxx, yy, zz] + } else if (/^\d{8}$/.test(getDate)) { + dateParts = [+getDate.slice(0, 4), +getDate.slice(4, 6), +getDate.slice(6)]; + } + const thisYear = +(new Date().getFullYear() + '').slice(-2); + // Check for [YYYY, MM, DD] + if (dateParts[0] > 1000 && dateParts[0] < 2100 && dateParts[1] <= 12 && dateParts[2] <= 31) { + return new Date(dateParts[0], dateParts[1] - 1, dateParts[2]); + // Check for [MM, DD, YYYY] + } else if (dateParts[0] <= 12 && dateParts[1] <= 31 && dateParts[2] > 1000 && dateParts[2] < 2100) { + return new Date(dateParts[2], dateParts[0] - 1, dateParts[1]); + // Check for [MM, DD, YY] + } else if (dateParts[0] <= 12 && dateParts[1] <= 31 && dateParts[2] < 100) { + const year = (dateParts[2] <= thisYear ? 2000 : 1900) + dateParts[2]; + return new Date(year, dateParts[0] - 1, dateParts[1]); + // Check for [YY, MM, DD] + } else if (dateParts[0] < 100 && dateParts[1] <= 12 && dateParts[2] <= 31) { + const year = (dateParts[0] <= thisYear ? 2000 : 1900) + dateParts[0]; + return new Date(year, dateParts[1] - 1, dateParts[2]); + } + return null; +} + +/** + * 'findDate' function + * + * // { string } text + * // { string } + */ +export function findDate(text) { + if (!text) { return null; } + let foundDate: any[]; + // Match ...YYYY-MM-DD... + foundDate = text.match(/(?:19|20)\d\d[-_\\\/\. ](?:0?\d|1[012])[-_\\\/\. ](?:[012]?\d|3[01])(?!\d)/); + if (foundDate) { return foundDate[0]; } + // Match ...MM-DD-YYYY... + foundDate = text.match(/(?:[012]?\d|3[01])[-_\\\/\. ](?:0?\d|1[012])[-_\\\/\. ](?:19|20)\d\d(?!\d)/); + if (foundDate) { return foundDate[0]; } + // Match MM-DD-YY... + foundDate = text.match(/^(?:[012]?\d|3[01])[-_\\\/\. ](?:0?\d|1[012])[-_\\\/\. ]\d\d(?!\d)/); + if (foundDate) { return foundDate[0]; } + // Match YY-MM-DD... + foundDate = text.match(/^\d\d[-_\\\/\. ](?:[012]?\d|3[01])[-_\\\/\. ](?:0?\d|1[012])(?!\d)/); + if (foundDate) { return foundDate[0]; } + // Match YYYYMMDD... + foundDate = text.match(/^(?:19|20)\d\d(?:0\d|1[012])(?:[012]\d|3[01])/); + if (foundDate) { return foundDate[0]; } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/form-group.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/form-group.functions.ts new file mode 100644 index 000000000..1906f4d79 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/form-group.functions.ts @@ -0,0 +1,533 @@ +import _ from 'lodash'; +import { + AbstractControl, + FormArray, + FormControl, + FormGroup, + ValidatorFn + } from '@angular/forms'; +import { forEach, hasOwn } from './utility.functions'; +import { getControlValidators, removeRecursiveReferences } from './json-schema.functions'; +import { + hasValue, + inArray, + isArray, + isDate, + isDefined, + isEmpty, + isObject, + isPrimitive, + SchemaPrimitiveType, + toJavaScriptType, + toSchemaType + } from './validator.functions'; +import { JsonPointer, Pointer } from './jsonpointer.functions'; +import { JsonValidators } from './json.validators'; + + + +/** + * FormGroup function library: + * + * buildFormGroupTemplate: Builds a FormGroupTemplate from schema + * + * buildFormGroup: Builds an Angular FormGroup from a FormGroupTemplate + * + * mergeValues: + * + * setRequiredFields: + * + * formatFormData: + * + * getControl: + * + * ---- TODO: ---- + * TODO: add buildFormGroupTemplateFromLayout function + * buildFormGroupTemplateFromLayout: Builds a FormGroupTemplate from a form layout + */ + +/** + * 'buildFormGroupTemplate' function + * + * Builds a template for an Angular FormGroup from a JSON Schema. + * + * TODO: add support for pattern properties + * https://spacetelescope.github.io/understanding-json-schema/reference/object.html + * + * // {any} jsf - + * // {any = null} nodeValue - + * // {boolean = true} mapArrays - + * // {string = ''} schemaPointer - + * // {string = ''} dataPointer - + * // {any = ''} templatePointer - + * // {any} - + */ +export function buildFormGroupTemplate( + jsf: any, nodeValue: any = null, setValues = true, + schemaPointer = '', dataPointer = '', templatePointer = '' +) { + const schema = JsonPointer.get(jsf.schema, schemaPointer); + if (setValues) { + if (!isDefined(nodeValue) && ( + jsf.formOptions.setSchemaDefaults === true || + (jsf.formOptions.setSchemaDefaults === 'auto' && isEmpty(jsf.formValues)) + )) { + nodeValue = JsonPointer.get(jsf.schema, schemaPointer + '/default'); + } + } else { + nodeValue = null; + } + // TODO: If nodeValue still not set, check layout for default value + const schemaType: string | string[] = JsonPointer.get(schema, '/type'); + const controlType = + (hasOwn(schema, 'properties') || hasOwn(schema, 'additionalProperties')) && + schemaType === 'object' ? 'FormGroup' : + (hasOwn(schema, 'items') || hasOwn(schema, 'additionalItems')) && + schemaType === 'array' ? 'FormArray' : + !schemaType && hasOwn(schema, '$ref') ? '$ref' : 'FormControl'; + const shortDataPointer = + removeRecursiveReferences(dataPointer, jsf.dataRecursiveRefMap, jsf.arrayMap); + if (!jsf.dataMap.has(shortDataPointer)) { + jsf.dataMap.set(shortDataPointer, new Map()); + } + const nodeOptions = jsf.dataMap.get(shortDataPointer); + if (!nodeOptions.has('schemaType')) { + nodeOptions.set('schemaPointer', schemaPointer); + nodeOptions.set('schemaType', schema.type); + if (schema.format) { + nodeOptions.set('schemaFormat', schema.format); + if (!schema.type) { nodeOptions.set('schemaType', 'string'); } + } + if (controlType) { + nodeOptions.set('templatePointer', templatePointer); + nodeOptions.set('templateType', controlType); + } + } + let controls: any; + const validators = getControlValidators(schema); + switch (controlType) { + + case 'FormGroup': + controls = {}; + if (hasOwn(schema, 'ui:order') || hasOwn(schema, 'properties')) { + const propertyKeys = schema['ui:order'] || Object.keys(schema.properties); + if (propertyKeys.includes('*') && !hasOwn(schema.properties, '*')) { + const unnamedKeys = Object.keys(schema.properties) + .filter(key => !propertyKeys.includes(key)); + for (let i = propertyKeys.length - 1; i >= 0; i--) { + if (propertyKeys[i] === '*') { + propertyKeys.splice(i, 1, ...unnamedKeys); + } + } + } + propertyKeys + .filter(key => hasOwn(schema.properties, key) || + hasOwn(schema, 'additionalProperties') + ) + .forEach(key => controls[key] = buildFormGroupTemplate( + jsf, JsonPointer.get(nodeValue, [key]), setValues, + schemaPointer + (hasOwn(schema.properties, key) ? + '/properties/' + key : '/additionalProperties' + ), + dataPointer + '/' + key, + templatePointer + '/controls/' + key + )); + jsf.formOptions.fieldsRequired = setRequiredFields(schema, controls); + } + return { controlType, controls, validators }; + + case 'FormArray': + controls = []; + const minItems = + Math.max(schema.minItems || 0, nodeOptions.get('minItems') || 0); + const maxItems = + Math.min(schema.maxItems || 1000, nodeOptions.get('maxItems') || 1000); + let additionalItemsPointer: string = null; + if (isArray(schema.items)) { // 'items' is an array = tuple items + const tupleItems = nodeOptions.get('tupleItems') || + (isArray(schema.items) ? Math.min(schema.items.length, maxItems) : 0); + for (let i = 0; i < tupleItems; i++) { + if (i < minItems) { + controls.push(buildFormGroupTemplate( + jsf, isArray(nodeValue) ? nodeValue[i] : nodeValue, setValues, + schemaPointer + '/items/' + i, + dataPointer + '/' + i, + templatePointer + '/controls/' + i + )); + } else { + const schemaRefPointer = removeRecursiveReferences( + schemaPointer + '/items/' + i, jsf.schemaRecursiveRefMap + ); + const itemRefPointer = removeRecursiveReferences( + shortDataPointer + '/' + i, jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const itemRecursive = itemRefPointer !== shortDataPointer + '/' + i; + if (!hasOwn(jsf.templateRefLibrary, itemRefPointer)) { + jsf.templateRefLibrary[itemRefPointer] = null; + jsf.templateRefLibrary[itemRefPointer] = buildFormGroupTemplate( + jsf, null, setValues, + schemaRefPointer, + itemRefPointer, + templatePointer + '/controls/' + i + ); + } + controls.push( + isArray(nodeValue) ? + buildFormGroupTemplate( + jsf, nodeValue[i], setValues, + schemaPointer + '/items/' + i, + dataPointer + '/' + i, + templatePointer + '/controls/' + i + ) : + itemRecursive ? + null : _.cloneDeep(jsf.templateRefLibrary[itemRefPointer]) + ); + } + } + + // If 'additionalItems' is an object = additional list items (after tuple items) + if (schema.items.length < maxItems && isObject(schema.additionalItems)) { + additionalItemsPointer = schemaPointer + '/additionalItems'; + } + + // If 'items' is an object = list items only (no tuple items) + } else { + additionalItemsPointer = schemaPointer + '/items'; + } + + if (additionalItemsPointer) { + const schemaRefPointer = removeRecursiveReferences( + additionalItemsPointer, jsf.schemaRecursiveRefMap + ); + const itemRefPointer = removeRecursiveReferences( + shortDataPointer + '/-', jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const itemRecursive = itemRefPointer !== shortDataPointer + '/-'; + if (!hasOwn(jsf.templateRefLibrary, itemRefPointer)) { + jsf.templateRefLibrary[itemRefPointer] = null; + jsf.templateRefLibrary[itemRefPointer] = buildFormGroupTemplate( + jsf, null, setValues, + schemaRefPointer, + itemRefPointer, + templatePointer + '/controls/-' + ); + } + // const itemOptions = jsf.dataMap.get(itemRefPointer) || new Map(); + const itemOptions = nodeOptions; + if (!itemRecursive || hasOwn(validators, 'required')) { + const arrayLength = Math.min(Math.max( + itemRecursive ? 0 : + (itemOptions.get('tupleItems') + itemOptions.get('listItems')) || 0, + isArray(nodeValue) ? nodeValue.length : 0 + ), maxItems); + for (let i = controls.length; i < arrayLength; i++) { + controls.push( + isArray(nodeValue) ? + buildFormGroupTemplate( + jsf, nodeValue[i], setValues, + schemaRefPointer, + dataPointer + '/-', + templatePointer + '/controls/-' + ) : + itemRecursive ? + null : _.cloneDeep(jsf.templateRefLibrary[itemRefPointer]) + ); + } + } + } + return { controlType, controls, validators }; + + case '$ref': + const schemaRef = JsonPointer.compile(schema.$ref); + const dataRef = JsonPointer.toDataPointer(schemaRef, schema); + const refPointer = removeRecursiveReferences( + dataRef, jsf.dataRecursiveRefMap, jsf.arrayMap + ); + if (refPointer && !hasOwn(jsf.templateRefLibrary, refPointer)) { + // Set to null first to prevent recursive reference from causing endless loop + jsf.templateRefLibrary[refPointer] = null; + const newTemplate = buildFormGroupTemplate(jsf, setValues, setValues, schemaRef); + if (newTemplate) { + jsf.templateRefLibrary[refPointer] = newTemplate; + } else { + delete jsf.templateRefLibrary[refPointer]; + } + } + return null; + + case 'FormControl': + const value = { + value: setValues && isPrimitive(nodeValue) ? nodeValue : null, + disabled: nodeOptions.get('disabled') || false + }; + return { controlType, value, validators }; + + default: + return null; + } +} + +/** + * 'buildFormGroup' function + * + * // {any} template - + * // {AbstractControl} +*/ +export function buildFormGroup(template: any): AbstractControl { + const validatorFns: ValidatorFn[] = []; + let validatorFn: ValidatorFn = null; + if (hasOwn(template, 'validators')) { + forEach(template.validators, (parameters, validator) => { + if (typeof JsonValidators[validator] === 'function') { + validatorFns.push(JsonValidators[validator].apply(null, parameters)); + } + }); + if (validatorFns.length && + inArray(template.controlType, ['FormGroup', 'FormArray']) + ) { + validatorFn = validatorFns.length > 1 ? + JsonValidators.compose(validatorFns) : validatorFns[0]; + } + } + if (hasOwn(template, 'controlType')) { + switch (template.controlType) { + case 'FormGroup': + const groupControls: { [key: string]: AbstractControl } = {}; + forEach(template.controls, (controls, key) => { + const newControl: AbstractControl = buildFormGroup(controls); + if (newControl) { groupControls[key] = newControl; } + }); + return new FormGroup(groupControls, validatorFn); + case 'FormArray': + return new FormArray(_.filter(_.map(template.controls, + controls => buildFormGroup(controls) + )), validatorFn); + case 'FormControl': + return new FormControl(template.value, validatorFns); + } + } + return null; +} + +/** + * 'mergeValues' function + * + * // {any[]} ...valuesToMerge - Multiple values to merge + * // {any} - Merged values + */ +export function mergeValues(...valuesToMerge) { + let mergedValues: any = null; + for (const currentValue of valuesToMerge) { + if (!isEmpty(currentValue)) { + if (typeof currentValue === 'object' && + (isEmpty(mergedValues) || typeof mergedValues !== 'object') + ) { + if (isArray(currentValue)) { + mergedValues = [...currentValue]; + } else if (isObject(currentValue)) { + mergedValues = { ...currentValue }; + } + } else if (typeof currentValue !== 'object') { + mergedValues = currentValue; + } else if (isObject(mergedValues) && isObject(currentValue)) { + Object.assign(mergedValues, currentValue); + } else if (isObject(mergedValues) && isArray(currentValue)) { + const newValues = []; + for (const value of currentValue) { + newValues.push(mergeValues(mergedValues, value)); + } + mergedValues = newValues; + } else if (isArray(mergedValues) && isObject(currentValue)) { + const newValues = []; + for (const value of mergedValues) { + newValues.push(mergeValues(value, currentValue)); + } + mergedValues = newValues; + } else if (isArray(mergedValues) && isArray(currentValue)) { + const newValues = []; + for (let i = 0; i < Math.max(mergedValues.length, currentValue.length); i++) { + if (i < mergedValues.length && i < currentValue.length) { + newValues.push(mergeValues(mergedValues[i], currentValue[i])); + } else if (i < mergedValues.length) { + newValues.push(mergedValues[i]); + } else if (i < currentValue.length) { + newValues.push(currentValue[i]); + } + } + mergedValues = newValues; + } + } + } + return mergedValues; +} + +/** + * 'setRequiredFields' function + * + * // {schema} schema - JSON Schema + * // {object} formControlTemplate - Form Control Template object + * // {boolean} - true if any fields have been set to required, false if not + */ +export function setRequiredFields(schema: any, formControlTemplate: any): boolean { + let fieldsRequired = false; + if (hasOwn(schema, 'required') && !isEmpty(schema.required)) { + fieldsRequired = true; + let requiredArray = isArray(schema.required) ? schema.required : [schema.required]; + requiredArray = forEach(requiredArray, + key => JsonPointer.set(formControlTemplate, '/' + key + '/validators/required', []) + ); + } + return fieldsRequired; + + // TODO: Add support for patternProperties + // https://spacetelescope.github.io/understanding-json-schema/reference/object.html#pattern-properties +} + +/** + * 'formatFormData' function + * + * // {any} formData - Angular FormGroup data object + * // {Map} dataMap - + * // {Map} recursiveRefMap - + * // {Map} arrayMap - + * // {boolean = false} fixErrors - if TRUE, tries to fix data + * // {any} - formatted data object + */ +export function formatFormData( + formData: any, dataMap: Map, + recursiveRefMap: Map, arrayMap: Map, + returnEmptyFields = false, fixErrors = false +): any { + if (formData === null || typeof formData !== 'object') { return formData; } + const formattedData = isArray(formData) ? [] : {}; + JsonPointer.forEachDeep(formData, (value, dataPointer) => { + + // If returnEmptyFields === true, + // add empty arrays and objects to all allowed keys + if (returnEmptyFields && isArray(value)) { + JsonPointer.set(formattedData, dataPointer, []); + } else if (returnEmptyFields && isObject(value) && !isDate(value)) { + JsonPointer.set(formattedData, dataPointer, {}); + } else { + const genericPointer = + JsonPointer.has(dataMap, [dataPointer, 'schemaType']) ? dataPointer : + removeRecursiveReferences(dataPointer, recursiveRefMap, arrayMap); + if (JsonPointer.has(dataMap, [genericPointer, 'schemaType'])) { + const schemaType: SchemaPrimitiveType | SchemaPrimitiveType[] = + dataMap.get(genericPointer).get('schemaType'); + if (schemaType === 'null') { + JsonPointer.set(formattedData, dataPointer, null); + } else if ((hasValue(value) || returnEmptyFields) && + inArray(schemaType, ['string', 'integer', 'number', 'boolean']) + ) { + const newValue = (fixErrors || (value === null && returnEmptyFields)) ? + toSchemaType(value, schemaType) : toJavaScriptType(value, schemaType); + if (isDefined(newValue) || returnEmptyFields) { + JsonPointer.set(formattedData, dataPointer, newValue); + } + + // If returnEmptyFields === false, + // only add empty arrays and objects to required keys + } else if (schemaType === 'object' && !returnEmptyFields) { + (dataMap.get(genericPointer).get('required') || []).forEach(key => { + const keySchemaType = + dataMap.get(`${genericPointer}/${key}`).get('schemaType'); + if (keySchemaType === 'array') { + JsonPointer.set(formattedData, `${dataPointer}/${key}`, []); + } else if (keySchemaType === 'object') { + JsonPointer.set(formattedData, `${dataPointer}/${key}`, {}); + } + }); + } + + // Finish incomplete 'date-time' entries + if (dataMap.get(genericPointer).get('schemaFormat') === 'date-time') { + // "2000-03-14T01:59:26.535" -> "2000-03-14T01:59:26.535" (dont add anything) + if (/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?$/i.test(value)) { + JsonPointer.set(formattedData, dataPointer, `${value}`); + // "2000-03-14T01:59" -> "2000-03-14T01:59:00" (add ":00") + } else if (/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d$/i.test(value)) { + JsonPointer.set(formattedData, dataPointer, `${value}:00`); + // "2000-03-14" -> "2000-03-14T00:00:00" (add "T00:00:00") + } else if (fixErrors && /^\d\d\d\d-[0-1]\d-[0-3]\d$/i.test(value)) { + JsonPointer.set(formattedData, dataPointer, `${value}:00:00:00`); + } + } + } else if (typeof value !== 'object' || isDate(value) || + (value === null && returnEmptyFields) + ) { + console.error('formatFormData error: ' + + `Schema type not found for form value at ${genericPointer}`); + console.error('dataMap', dataMap); + console.error('recursiveRefMap', recursiveRefMap); + console.error('genericPointer', genericPointer); + } + } + }); + return formattedData; +} + +/** + * 'getControl' function + * + * Uses a JSON Pointer for a data object to retrieve a control from + * an Angular formGroup or formGroup template. (Note: though a formGroup + * template is much simpler, its basic structure is idential to a formGroup). + * + * If the optional third parameter 'returnGroup' is set to TRUE, the group + * containing the control is returned, rather than the control itself. + * + * // {FormGroup} formGroup - Angular FormGroup to get value from + * // {Pointer} dataPointer - JSON Pointer (string or array) + * // {boolean = false} returnGroup - If true, return group containing control + * // {group} - Located value (or null, if no control found) + */ +export function getControl( + formGroup: any, dataPointer: Pointer, returnGroup = false +): any { + if (!isObject(formGroup) || !JsonPointer.isJsonPointer(dataPointer)) { + if (!JsonPointer.isJsonPointer(dataPointer)) { + // If dataPointer input is not a valid JSON pointer, check to + // see if it is instead a valid object path, using dot notaion + if (typeof dataPointer === 'string') { + const formControl = formGroup.get(dataPointer); + if (formControl) { return formControl; } + } + console.error(`getControl error: Invalid JSON Pointer: ${dataPointer}`); + } + if (!isObject(formGroup)) { + console.error(`getControl error: Invalid formGroup: ${formGroup}`); + } + return null; + } + let dataPointerArray = JsonPointer.parse(dataPointer); + if (returnGroup) { dataPointerArray = dataPointerArray.slice(0, -1); } + + // If formGroup input is a real formGroup (not a formGroup template) + // try using formGroup.get() to return the control + if (typeof formGroup.get === 'function' && + dataPointerArray.every(key => key.indexOf('.') === -1) + ) { + const formControl = formGroup.get(dataPointerArray.join('.')); + if (formControl) { return formControl; } + } + + // If formGroup input is a formGroup template, + // or formGroup.get() failed to return the control, + // search the formGroup object for dataPointer's control + let subGroup = formGroup; + for (const key of dataPointerArray) { + if (hasOwn(subGroup, 'controls')) { subGroup = subGroup.controls; } + if (isArray(subGroup) && (key === '-')) { + subGroup = subGroup[subGroup.length - 1]; + } else if (hasOwn(subGroup, key)) { + subGroup = subGroup[key]; + } else { + console.error(`getControl error: Unable to find "${key}" item in FormGroup.`); + console.error(dataPointer); + console.error(formGroup); + return; + } + } + return subGroup; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/format-regex.constants.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/format-regex.constants.ts new file mode 100644 index 000000000..8266e99e9 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/format-regex.constants.ts @@ -0,0 +1,73 @@ +// updated from AJV fast format regular expressions: +// https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js + +export const jsonSchemaFormatTests = { + + 'date': /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + + 'time': /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, + + // Modified to allow incomplete entries, such as + // "2000-03-14T01:59:26.535" (needs "Z") or "2000-03-14T01:59" (needs ":00Z") + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d(?::[0-5]\d)?(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, + + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + 'email': /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + + 'hostname': /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*$/i, + + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + 'ipv4': /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + // tslint:disable-next-line:max-line-length + 'ipv6': /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + 'uri': /^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i, + + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i, + + // uri-template: https://tools.ietf.org/html/rfc6570 + // tslint:disable-next-line:max-line-length + 'uri-template': /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + // tslint:disable-next-line:max-line-length + // @todo Delete current URL in favour of the commented out URL rule when this ajv issue is fixed https://github.com/eslint/eslint/issues/7983. + // tslint:disable-next-line:max-line-length + // URL: /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + // tslint:disable-next-line:max-line-length + 'url': /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i, + + // uuid: http://tools.ietf.org/html/rfc4122 + 'uuid': /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + + // optimized https://gist.github.com/olmokramer/82ccce673f86db7cda5e + // tslint:disable-next-line:max-line-length + 'color': /^\s*(#(?:[\da-f]{3}){1,2}|rgb\((?:\d{1,3},\s*){2}\d{1,3}\)|rgba\((?:\d{1,3},\s*){3}\d*\.?\d+\)|hsl\(\d{1,3}(?:,\s*\d{1,3}%){2}\)|hsla\(\d{1,3}(?:,\s*\d{1,3}%){2},\s*\d*\.?\d+\))\s*$/gi, + + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + 'json-pointer': /^(?:\/(?:[^~/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + + 'relative-json-pointer': /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + + 'regex': function (str) { + if (/[^\\]\\Z/.test(str)) { return false; } + try { + return true; + } catch (e) { + return false; + } + } + +}; + +export type JsonSchemaFormatNames = + 'date' | 'time' | 'date-time' | 'email' | 'hostname' | 'ipv4' | 'ipv6' | + 'uri' | 'uri-reference' | 'uri-template' | 'url' | 'uuid' | 'color' | + 'json-pointer' | 'relative-json-pointer' | 'regex'; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/index.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/index.ts new file mode 100644 index 000000000..afbd241f3 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/index.ts @@ -0,0 +1,42 @@ +// Warning: Changing the following order may cause errors if the new order +// causes a library to be imported before another library it depends on. + +export { + _executeValidators, _executeAsyncValidators, _mergeObjects, _mergeErrors, + isDefined, hasValue, isEmpty, isString, isNumber, isInteger, isBoolean, + isFunction, isObject, isArray, isDate, isMap, isSet, isPromise, isObservable, + getType, isType, isPrimitive, toJavaScriptType, toSchemaType, _toPromise, + toObservable, inArray, xor, SchemaPrimitiveType, SchemaType, JavaScriptPrimitiveType, + JavaScriptType, PrimitiveValue, PlainObject, IValidatorFn, AsyncIValidatorFn +} from './validator.functions'; + +export { + addClasses, copy, forEach, forEachCopy, hasOwn, mergeFilteredObject, + uniqueItems, commonItems, fixTitle, toTitleCase +} from './utility.functions'; + +export { Pointer, JsonPointer } from './jsonpointer.functions'; + +export { JsonValidators } from './json.validators'; + +export { + buildSchemaFromLayout, buildSchemaFromData, getFromSchema, + removeRecursiveReferences, getInputType, checkInlineType, isInputRequired, + updateInputOptions, getTitleMapFromOneOf, getControlValidators, + resolveSchemaReferences, getSubSchema, combineAllOf, fixRequiredArrayProperties +} from './json-schema.functions'; + +export { convertSchemaToDraft6 } from './convert-schema-to-draft6.function'; + +export { mergeSchemas } from './merge-schemas.function'; + +export { + buildFormGroupTemplate, buildFormGroup, formatFormData, + getControl, setRequiredFields +} from './form-group.functions'; + +export { + buildLayout, buildLayoutFromSchema, mapLayout, getLayoutNode, buildTitleMap +} from './layout.functions'; + +export { dateToString, stringToDate, findDate } from './date.functions'; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/json-schema.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/json-schema.functions.ts new file mode 100644 index 000000000..6a0bdb510 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/json-schema.functions.ts @@ -0,0 +1,788 @@ +import _ from 'lodash'; +import { forEach, hasOwn, mergeFilteredObject } from './utility.functions'; +import { + getType, + hasValue, + inArray, + isArray, + isNumber, + isObject, + isString + } from './validator.functions'; +import { JsonPointer } from './jsonpointer.functions'; +import { mergeSchemas } from './merge-schemas.function'; + + +/** + * JSON Schema function library: + * + * buildSchemaFromLayout: TODO: Write this function + * + * buildSchemaFromData: + * + * getFromSchema: + * + * removeRecursiveReferences: + * + * getInputType: + * + * checkInlineType: + * + * isInputRequired: + * + * updateInputOptions: + * + * getTitleMapFromOneOf: + * + * getControlValidators: + * + * resolveSchemaReferences: + * + * getSubSchema: + * + * combineAllOf: + * + * fixRequiredArrayProperties: + */ + +/** + * 'buildSchemaFromLayout' function + * + * TODO: Build a JSON Schema from a JSON Form layout + * + * // layout - The JSON Form layout + * // - The new JSON Schema + */ +export function buildSchemaFromLayout(layout) { + return; + // let newSchema: any = { }; + // const walkLayout = (layoutItems: any[], callback: Function): any[] => { + // let returnArray: any[] = []; + // for (let layoutItem of layoutItems) { + // const returnItem: any = callback(layoutItem); + // if (returnItem) { returnArray = returnArray.concat(callback(layoutItem)); } + // if (layoutItem.items) { + // returnArray = returnArray.concat(walkLayout(layoutItem.items, callback)); + // } + // } + // return returnArray; + // }; + // walkLayout(layout, layoutItem => { + // let itemKey: string; + // if (typeof layoutItem === 'string') { + // itemKey = layoutItem; + // } else if (layoutItem.key) { + // itemKey = layoutItem.key; + // } + // if (!itemKey) { return; } + // // + // }); +} + +/** + * 'buildSchemaFromData' function + * + * Build a JSON Schema from a data object + * + * // data - The data object + * // { boolean = false } requireAllFields - Require all fields? + * // { boolean = true } isRoot - is root + * // - The new JSON Schema + */ +export function buildSchemaFromData( + data, requireAllFields = false, isRoot = true +) { + const newSchema: any = {}; + const getFieldType = (value: any): string => { + const fieldType = getType(value, 'strict'); + return { integer: 'number', null: 'string' }[fieldType] || fieldType; + }; + const buildSubSchema = (value) => + buildSchemaFromData(value, requireAllFields, false); + if (isRoot) { newSchema.$schema = 'http://json-schema.org/draft-06/schema#'; } + newSchema.type = getFieldType(data); + if (newSchema.type === 'object') { + newSchema.properties = {}; + if (requireAllFields) { newSchema.required = []; } + for (const key of Object.keys(data)) { + newSchema.properties[key] = buildSubSchema(data[key]); + if (requireAllFields) { newSchema.required.push(key); } + } + } else if (newSchema.type === 'array') { + newSchema.items = data.map(buildSubSchema); + // If all items are the same type, use an object for items instead of an array + if ((new Set(data.map(getFieldType))).size === 1) { + newSchema.items = newSchema.items.reduce((a, b) => ({ ...a, ...b }), {}); + } + if (requireAllFields) { newSchema.minItems = 1; } + } + return newSchema; +} + +/** + * 'getFromSchema' function + * + * Uses a JSON Pointer for a value within a data object to retrieve + * the schema for that value within schema for the data object. + * + * The optional third parameter can also be set to return something else: + * 'schema' (default): the schema for the value indicated by the data pointer + * 'parentSchema': the schema for the value's parent object or array + * 'schemaPointer': a pointer to the value's schema within the object's schema + * 'parentSchemaPointer': a pointer to the schema for the value's parent object or array + * + * // schema - The schema to get the sub-schema from + * // { Pointer } dataPointer - JSON Pointer (string or array) + * // { string = 'schema' } returnType - what to return? + * // - The located sub-schema + */ +export function getFromSchema(schema, dataPointer, returnType = 'schema') { + const dataPointerArray: any[] = JsonPointer.parse(dataPointer); + if (dataPointerArray === null) { + console.error(`getFromSchema error: Invalid JSON Pointer: ${dataPointer}`); + return null; + } + let subSchema = schema; + const schemaPointer = []; + const length = dataPointerArray.length; + if (returnType.slice(0, 6) === 'parent') { dataPointerArray.length--; } + for (let i = 0; i < length; ++i) { + const parentSchema = subSchema; + const key = dataPointerArray[i]; + let subSchemaFound = false; + if (typeof subSchema !== 'object') { + console.error(`getFromSchema error: Unable to find "${key}" key in schema.`); + console.error(schema); + console.error(dataPointer); + return null; + } + if (subSchema.type === 'array' && (!isNaN(key) || key === '-')) { + if (hasOwn(subSchema, 'items')) { + if (isObject(subSchema.items)) { + subSchemaFound = true; + subSchema = subSchema.items; + schemaPointer.push('items'); + } else if (isArray(subSchema.items)) { + if (!isNaN(key) && subSchema.items.length >= +key) { + subSchemaFound = true; + subSchema = subSchema.items[+key]; + schemaPointer.push('items', key); + } + } + } + if (!subSchemaFound && isObject(subSchema.additionalItems)) { + subSchemaFound = true; + subSchema = subSchema.additionalItems; + schemaPointer.push('additionalItems'); + } else if (subSchema.additionalItems !== false) { + subSchemaFound = true; + subSchema = { }; + schemaPointer.push('additionalItems'); + } + } else if (subSchema.type === 'object') { + if (isObject(subSchema.properties) && hasOwn(subSchema.properties, key)) { + subSchemaFound = true; + subSchema = subSchema.properties[key]; + schemaPointer.push('properties', key); + } else if (isObject(subSchema.additionalProperties)) { + subSchemaFound = true; + subSchema = subSchema.additionalProperties; + schemaPointer.push('additionalProperties'); + } else if (subSchema.additionalProperties !== false) { + subSchemaFound = true; + subSchema = { }; + schemaPointer.push('additionalProperties'); + } + } + if (!subSchemaFound) { + console.error(`getFromSchema error: Unable to find "${key}" item in schema.`); + console.error(schema); + console.error(dataPointer); + return; + } + } + return returnType.slice(-7) === 'Pointer' ? schemaPointer : subSchema; +} + +/** + * 'removeRecursiveReferences' function + * + * Checks a JSON Pointer against a map of recursive references and returns + * a JSON Pointer to the shallowest equivalent location in the same object. + * + * Using this functions enables an object to be constructed with unlimited + * recursion, while maintaing a fixed set of metadata, such as field data types. + * The object can grow as large as it wants, and deeply recursed nodes can + * just refer to the metadata for their shallow equivalents, instead of having + * to add additional redundant metadata for each recursively added node. + * + * Example: + * + * pointer: '/stuff/and/more/and/more/and/more/and/more/stuff' + * recursiveRefMap: [['/stuff/and/more/and/more', '/stuff/and/more/']] + * returned: '/stuff/and/more/stuff' + * + * // { Pointer } pointer - + * // { Map } recursiveRefMap - + * // { Map = new Map() } arrayMap - optional + * // { string } - + */ +export function removeRecursiveReferences( + pointer, recursiveRefMap, arrayMap = new Map() +) { + if (!pointer) { return ''; } + let genericPointer = + JsonPointer.toGenericPointer(JsonPointer.compile(pointer), arrayMap); + if (genericPointer.indexOf('/') === -1) { return genericPointer; } + let possibleReferences = true; + while (possibleReferences) { + possibleReferences = false; + recursiveRefMap.forEach((toPointer, fromPointer) => { + if (JsonPointer.isSubPointer(toPointer, fromPointer)) { + while (JsonPointer.isSubPointer(fromPointer, genericPointer, true)) { + genericPointer = JsonPointer.toGenericPointer( + toPointer + genericPointer.slice(fromPointer.length), arrayMap + ); + possibleReferences = true; + } + } + }); + } + return genericPointer; +} + +/** + * 'getInputType' function + * + * // schema + * // { any = null } layoutNode + * // { string } + */ +export function getInputType(schema, layoutNode: any = null) { + // x-schema-form = Angular Schema Form compatibility + // widget & component = React Jsonschema Form compatibility + const controlType = JsonPointer.getFirst([ + [schema, '/x-schema-form/type'], + [schema, '/x-schema-form/widget/component'], + [schema, '/x-schema-form/widget'], + [schema, '/widget/component'], + [schema, '/widget'] + ]); + if (isString(controlType)) { return checkInlineType(controlType, schema, layoutNode); } + let schemaType = schema.type; + if (schemaType) { + if (isArray(schemaType)) { // If multiple types listed, use most inclusive type + schemaType = + inArray('object', schemaType) && hasOwn(schema, 'properties') ? 'object' : + inArray('array', schemaType) && hasOwn(schema, 'items') ? 'array' : + inArray('array', schemaType) && hasOwn(schema, 'additionalItems') ? 'array' : + inArray('string', schemaType) ? 'string' : + inArray('number', schemaType) ? 'number' : + inArray('integer', schemaType) ? 'integer' : + inArray('boolean', schemaType) ? 'boolean' : 'unknown'; + } + if (schemaType === 'boolean') { return 'checkbox'; } + if (schemaType === 'object') { + if (hasOwn(schema, 'properties') || hasOwn(schema, 'additionalProperties')) { + return 'section'; + } + // TODO: Figure out how to handle additionalProperties + if (hasOwn(schema, '$ref')) { return '$ref'; } + } + if (schemaType === 'array') { + const itemsObject = JsonPointer.getFirst([ + [schema, '/items'], + [schema, '/additionalItems'] + ]) || {}; + return hasOwn(itemsObject, 'enum') && schema.maxItems !== 1 ? + checkInlineType('checkboxes', schema, layoutNode) : 'array'; + } + if (schemaType === 'null') { return 'none'; } + if (JsonPointer.has(layoutNode, '/options/titleMap') || + hasOwn(schema, 'enum') || getTitleMapFromOneOf(schema, null, true) + ) { return 'select'; } + if (schemaType === 'number' || schemaType === 'integer') { + return (schemaType === 'integer' || hasOwn(schema, 'multipleOf')) && + hasOwn(schema, 'maximum') && hasOwn(schema, 'minimum') ? 'range' : schemaType; + } + if (schemaType === 'string') { + return { + 'color': 'color', + 'date': 'date', + 'date-time': 'datetime-local', + 'email': 'email', + 'uri': 'url', + }[schema.format] || 'text'; + } + } + if (hasOwn(schema, '$ref')) { return '$ref'; } + if (isArray(schema.oneOf) || isArray(schema.anyOf)) { return 'one-of'; } + console.error(`getInputType error: Unable to determine input type for ${schemaType}`); + console.error('schema', schema); + if (layoutNode) { console.error('layoutNode', layoutNode); } + return 'none'; +} + +/** + * 'checkInlineType' function + * + * Checks layout and schema nodes for 'inline: true', and converts + * 'radios' or 'checkboxes' to 'radios-inline' or 'checkboxes-inline' + * + * // { string } controlType - + * // schema - + * // { any = null } layoutNode - + * // { string } + */ +export function checkInlineType(controlType, schema, layoutNode: any = null) { + if (!isString(controlType) || ( + controlType.slice(0, 8) !== 'checkbox' && controlType.slice(0, 5) !== 'radio' + )) { + return controlType; + } + if ( + JsonPointer.getFirst([ + [layoutNode, '/inline'], + [layoutNode, '/options/inline'], + [schema, '/inline'], + [schema, '/x-schema-form/inline'], + [schema, '/x-schema-form/options/inline'], + [schema, '/x-schema-form/widget/inline'], + [schema, '/x-schema-form/widget/component/inline'], + [schema, '/x-schema-form/widget/component/options/inline'], + [schema, '/widget/inline'], + [schema, '/widget/component/inline'], + [schema, '/widget/component/options/inline'], + ]) === true + ) { + return controlType.slice(0, 5) === 'radio' ? + 'radios-inline' : 'checkboxes-inline'; + } else { + return controlType; + } +} + +/** + * 'isInputRequired' function + * + * Checks a JSON Schema to see if an item is required + * + * // schema - the schema to check + * // { string } schemaPointer - the pointer to the item to check + * // { boolean } - true if the item is required, false if not + */ +export function isInputRequired(schema, schemaPointer) { + if (!isObject(schema)) { + console.error('isInputRequired error: Input schema must be an object.'); + return false; + } + const listPointerArray = JsonPointer.parse(schemaPointer); + if (isArray(listPointerArray)) { + if (!listPointerArray.length) { return schema.required === true; } + const keyName = listPointerArray.pop(); + const nextToLastKey = listPointerArray[listPointerArray.length - 1]; + if (['properties', 'additionalProperties', 'patternProperties', 'items', 'additionalItems'] + .includes(nextToLastKey) + ) { + listPointerArray.pop(); + } + const parentSchema = JsonPointer.get(schema, listPointerArray) || {}; + if (isArray(parentSchema.required)) { + return parentSchema.required.includes(keyName); + } + if (parentSchema.type === 'array') { + return hasOwn(parentSchema, 'minItems') && + isNumber(keyName) && + +parentSchema.minItems > +keyName; + } + } + return false; +} + +/** + * 'updateInputOptions' function + * + * // layoutNode + * // schema + * // jsf + * // { void } + */ +export function updateInputOptions(layoutNode, schema, jsf) { + if (!isObject(layoutNode) || !isObject(layoutNode.options)) { return; } + + // Set all option values in layoutNode.options + const newOptions: any = { }; + const fixUiKeys = key => key.slice(0, 3).toLowerCase() === 'ui:' ? key.slice(3) : key; + mergeFilteredObject(newOptions, jsf.formOptions.defautWidgetOptions, [], fixUiKeys); + [ [ JsonPointer.get(schema, '/ui:widget/options'), [] ], + [ JsonPointer.get(schema, '/ui:widget'), [] ], + [ schema, [ + 'additionalProperties', 'additionalItems', 'properties', 'items', + 'required', 'type', 'x-schema-form', '$ref' + ] ], + [ JsonPointer.get(schema, '/x-schema-form/options'), [] ], + [ JsonPointer.get(schema, '/x-schema-form'), ['items', 'options'] ], + [ layoutNode, [ + '_id', '$ref', 'arrayItem', 'arrayItemType', 'dataPointer', 'dataType', + 'items', 'key', 'name', 'options', 'recursiveReference', 'type', 'widget' + ] ], + [ layoutNode.options, [] ], + ].forEach(([ object, excludeKeys ]) => + mergeFilteredObject(newOptions, object, excludeKeys, fixUiKeys) + ); + if (!hasOwn(newOptions, 'titleMap')) { + let newTitleMap: any = null; + newTitleMap = getTitleMapFromOneOf(schema, newOptions.flatList); + if (newTitleMap) { newOptions.titleMap = newTitleMap; } + if (!hasOwn(newOptions, 'titleMap') && !hasOwn(newOptions, 'enum') && hasOwn(schema, 'items')) { + if (JsonPointer.has(schema, '/items/titleMap')) { + newOptions.titleMap = schema.items.titleMap; + } else if (JsonPointer.has(schema, '/items/enum')) { + newOptions.enum = schema.items.enum; + if (!hasOwn(newOptions, 'enumNames') && JsonPointer.has(schema, '/items/enumNames')) { + newOptions.enumNames = schema.items.enumNames; + } + } else if (JsonPointer.has(schema, '/items/oneOf')) { + newTitleMap = getTitleMapFromOneOf(schema.items, newOptions.flatList); + if (newTitleMap) { newOptions.titleMap = newTitleMap; } + } + } + } + + // If schema type is integer, enforce by setting multipleOf = 1 + if (schema.type === 'integer' && !hasValue(newOptions.multipleOf)) { + newOptions.multipleOf = 1; + } + + // Copy any typeahead word lists to options.typeahead.source + if (JsonPointer.has(newOptions, '/autocomplete/source')) { + newOptions.typeahead = newOptions.autocomplete; + } else if (JsonPointer.has(newOptions, '/tagsinput/source')) { + newOptions.typeahead = newOptions.tagsinput; + } else if (JsonPointer.has(newOptions, '/tagsinput/typeahead/source')) { + newOptions.typeahead = newOptions.tagsinput.typeahead; + } + + layoutNode.options = newOptions; +} + +/** + * 'getTitleMapFromOneOf' function + * + * // { schema } schema + * // { boolean = null } flatList + * // { boolean = false } validateOnly + * // { validators } + */ +export function getTitleMapFromOneOf( + schema: any = {}, flatList: boolean = null, validateOnly = false +) { + let titleMap = null; + const oneOf = schema.oneOf || schema.anyOf || null; + if (isArray(oneOf) && oneOf.every(item => item.title)) { + if (oneOf.every(item => isArray(item.enum) && item.enum.length === 1)) { + if (validateOnly) { return true; } + titleMap = oneOf.map(item => ({ name: item.title, value: item.enum[0] })); + } else if (oneOf.every(item => item.const)) { + if (validateOnly) { return true; } + titleMap = oneOf.map(item => ({ name: item.title, value: item.const })); + } + + // if flatList !== false and some items have colons, make grouped map + if (flatList !== false && (titleMap || []) + .filter(title => ((title || {}).name || '').indexOf(': ')).length > 1 + ) { + + // Split name on first colon to create grouped map (name -> group: name) + const newTitleMap = titleMap.map(title => { + const [group, name] = title.name.split(/: (.+)/); + return group && name ? { ...title, group, name } : title; + }); + + // If flatList === true or at least one group has multiple items, use grouped map + if (flatList === true || newTitleMap.some((title, index) => index && + hasOwn(title, 'group') && title.group === newTitleMap[index - 1].group + )) { + titleMap = newTitleMap; + } + } + } + return validateOnly ? false : titleMap; +} + +/** + * 'getControlValidators' function + * + * // schema + * // { validators } + */ +export function getControlValidators(schema) { + if (!isObject(schema)) { return null; } + const validators: any = { }; + if (hasOwn(schema, 'type')) { + switch (schema.type) { + case 'string': + forEach(['pattern', 'format', 'minLength', 'maxLength'], (prop) => { + if (hasOwn(schema, prop)) { validators[prop] = [schema[prop]]; } + }); + break; + case 'number': case 'integer': + forEach(['Minimum', 'Maximum'], (ucLimit) => { + const eLimit = 'exclusive' + ucLimit; + const limit = ucLimit.toLowerCase(); + if (hasOwn(schema, limit)) { + const exclusive = hasOwn(schema, eLimit) && schema[eLimit] === true; + validators[limit] = [schema[limit], exclusive]; + } + }); + forEach(['multipleOf', 'type'], (prop) => { + if (hasOwn(schema, prop)) { validators[prop] = [schema[prop]]; } + }); + break; + case 'object': + forEach(['minProperties', 'maxProperties', 'dependencies'], (prop) => { + if (hasOwn(schema, prop)) { validators[prop] = [schema[prop]]; } + }); + break; + case 'array': + forEach(['minItems', 'maxItems', 'uniqueItems'], (prop) => { + if (hasOwn(schema, prop)) { validators[prop] = [schema[prop]]; } + }); + break; + } + } + if (hasOwn(schema, 'enum')) { validators.enum = [schema.enum]; } + return validators; +} + +/** + * 'resolveSchemaReferences' function + * + * Find all $ref links in schema and save links and referenced schemas in + * schemaRefLibrary, schemaRecursiveRefMap, and dataRecursiveRefMap + * + * // schema + * // schemaRefLibrary + * // { Map } schemaRecursiveRefMap + * // { Map } dataRecursiveRefMap + * // { Map } arrayMap + * // + */ +export function resolveSchemaReferences( + schema, schemaRefLibrary, schemaRecursiveRefMap, dataRecursiveRefMap, arrayMap +) { + if (!isObject(schema)) { + console.error('resolveSchemaReferences error: schema must be an object.'); + return; + } + const refLinks = new Set(); + const refMapSet = new Set(); + const refMap = new Map(); + const recursiveRefMap = new Map(); + const refLibrary: any = {}; + + // Search schema for all $ref links, and build full refLibrary + JsonPointer.forEachDeep(schema, (subSchema, subSchemaPointer) => { + if (hasOwn(subSchema, '$ref') && isString(subSchema['$ref'])) { + const refPointer = JsonPointer.compile(subSchema['$ref']); + refLinks.add(refPointer); + refMapSet.add(subSchemaPointer + '~~' + refPointer); + refMap.set(subSchemaPointer, refPointer); + } + }); + refLinks.forEach(ref => refLibrary[ref] = getSubSchema(schema, ref)); + + // Follow all ref links and save in refMapSet, + // to find any multi-link recursive refernces + let checkRefLinks = true; + while (checkRefLinks) { + checkRefLinks = false; + Array.from(refMap).forEach(([fromRef1, toRef1]) => Array.from(refMap) + .filter(([fromRef2, toRef2]) => + JsonPointer.isSubPointer(toRef1, fromRef2, true) && + !JsonPointer.isSubPointer(toRef2, toRef1, true) && + !refMapSet.has(fromRef1 + fromRef2.slice(toRef1.length) + '~~' + toRef2) + ) + .forEach(([fromRef2, toRef2]) => { + refMapSet.add(fromRef1 + fromRef2.slice(toRef1.length) + '~~' + toRef2); + checkRefLinks = true; + }) + ); + } + + // Build full recursiveRefMap + // First pass - save all internally recursive refs from refMapSet + Array.from(refMapSet) + .map(refLink => refLink.split('~~')) + .filter(([fromRef, toRef]) => JsonPointer.isSubPointer(toRef, fromRef)) + .forEach(([fromRef, toRef]) => recursiveRefMap.set(fromRef, toRef)); + // Second pass - create recursive versions of any other refs that link to recursive refs + Array.from(refMap) + .filter(([fromRef1, toRef1]) => Array.from(recursiveRefMap.keys()) + .every(fromRef2 => !JsonPointer.isSubPointer(fromRef1, fromRef2, true)) + ) + .forEach(([fromRef1, toRef1]) => Array.from(recursiveRefMap) + .filter(([fromRef2, toRef2]) => + !recursiveRefMap.has(fromRef1 + fromRef2.slice(toRef1.length)) && + JsonPointer.isSubPointer(toRef1, fromRef2, true) && + !JsonPointer.isSubPointer(toRef1, fromRef1, true) + ) + .forEach(([fromRef2, toRef2]) => recursiveRefMap.set( + fromRef1 + fromRef2.slice(toRef1.length), + fromRef1 + toRef2.slice(toRef1.length) + )) + ); + + // Create compiled schema by replacing all non-recursive $ref links with + // thieir linked schemas and, where possible, combining schemas in allOf arrays. + let compiledSchema = { ...schema }; + delete compiledSchema.definitions; + compiledSchema = + getSubSchema(compiledSchema, '', refLibrary, recursiveRefMap); + + // Make sure all remaining schema $refs are recursive, and build final + // schemaRefLibrary, schemaRecursiveRefMap, dataRecursiveRefMap, & arrayMap + JsonPointer.forEachDeep(compiledSchema, (subSchema, subSchemaPointer) => { + if (isString(subSchema['$ref'])) { + let refPointer = JsonPointer.compile(subSchema['$ref']); + if (!JsonPointer.isSubPointer(refPointer, subSchemaPointer, true)) { + refPointer = removeRecursiveReferences(subSchemaPointer, recursiveRefMap); + JsonPointer.set(compiledSchema, subSchemaPointer, { $ref: `#${refPointer}` }); + } + if (!hasOwn(schemaRefLibrary, 'refPointer')) { + schemaRefLibrary[refPointer] = !refPointer.length ? compiledSchema : + getSubSchema(compiledSchema, refPointer, schemaRefLibrary, recursiveRefMap); + } + if (!schemaRecursiveRefMap.has(subSchemaPointer)) { + schemaRecursiveRefMap.set(subSchemaPointer, refPointer); + } + const fromDataRef = JsonPointer.toDataPointer(subSchemaPointer, compiledSchema); + if (!dataRecursiveRefMap.has(fromDataRef)) { + const toDataRef = JsonPointer.toDataPointer(refPointer, compiledSchema); + dataRecursiveRefMap.set(fromDataRef, toDataRef); + } + } + if (subSchema.type === 'array' && + (hasOwn(subSchema, 'items') || hasOwn(subSchema, 'additionalItems')) + ) { + const dataPointer = JsonPointer.toDataPointer(subSchemaPointer, compiledSchema); + if (!arrayMap.has(dataPointer)) { + const tupleItems = isArray(subSchema.items) ? subSchema.items.length : 0; + arrayMap.set(dataPointer, tupleItems); + } + } + }, true); + return compiledSchema; +} + +/** + * 'getSubSchema' function + * + * // schema + * // { Pointer } pointer + * // { object } schemaRefLibrary + * // { Map } schemaRecursiveRefMap + * // { string[] = [] } usedPointers + * // + */ +export function getSubSchema( + schema, pointer, schemaRefLibrary = null, + schemaRecursiveRefMap: Map = null, usedPointers: string[] = [] +) { + if (!schemaRefLibrary || !schemaRecursiveRefMap) { + return JsonPointer.getCopy(schema, pointer); + } + if (typeof pointer !== 'string') { pointer = JsonPointer.compile(pointer); } + usedPointers = [ ...usedPointers, pointer ]; + let newSchema: any = null; + if (pointer === '') { + newSchema = _.cloneDeep(schema); + } else { + const shortPointer = removeRecursiveReferences(pointer, schemaRecursiveRefMap); + if (shortPointer !== pointer) { usedPointers = [ ...usedPointers, shortPointer ]; } + newSchema = JsonPointer.getFirstCopy([ + [schemaRefLibrary, [shortPointer]], + [schema, pointer], + [schema, shortPointer] + ]); + } + return JsonPointer.forEachDeepCopy(newSchema, (subSchema, subPointer) => { + if (isObject(subSchema)) { + + // Replace non-recursive $ref links with referenced schemas + if (isString(subSchema.$ref)) { + const refPointer = JsonPointer.compile(subSchema.$ref); + if (refPointer.length && usedPointers.every(ptr => + !JsonPointer.isSubPointer(refPointer, ptr, true) + )) { + const refSchema = getSubSchema( + schema, refPointer, schemaRefLibrary, schemaRecursiveRefMap, usedPointers + ); + if (Object.keys(subSchema).length === 1) { + return refSchema; + } else { + const extraKeys = { ...subSchema }; + delete extraKeys.$ref; + return mergeSchemas(refSchema, extraKeys); + } + } + } + + // TODO: Convert schemas with 'type' arrays to 'oneOf' + + // Combine allOf subSchemas + if (isArray(subSchema.allOf)) { return combineAllOf(subSchema); } + + // Fix incorrectly placed array object required lists + if (subSchema.type === 'array' && isArray(subSchema.required)) { + return fixRequiredArrayProperties(subSchema); + } + } + return subSchema; + }, true, pointer); +} + +/** + * 'combineAllOf' function + * + * Attempt to convert an allOf schema object into + * a non-allOf schema object with equivalent rules. + * + * // schema - allOf schema object + * // - converted schema object + */ +export function combineAllOf(schema) { + if (!isObject(schema) || !isArray(schema.allOf)) { return schema; } + let mergedSchema = mergeSchemas(...schema.allOf); + if (Object.keys(schema).length > 1) { + const extraKeys = { ...schema }; + delete extraKeys.allOf; + mergedSchema = mergeSchemas(mergedSchema, extraKeys); + } + return mergedSchema; +} + +/** + * 'fixRequiredArrayProperties' function + * + * Fixes an incorrectly placed required list inside an array schema, by moving + * it into items.properties or additionalItems.properties, where it belongs. + * + * // schema - allOf schema object + * // - converted schema object + */ +export function fixRequiredArrayProperties(schema) { + if (schema.type === 'array' && isArray(schema.required)) { + const itemsObject = hasOwn(schema.items, 'properties') ? 'items' : + hasOwn(schema.additionalItems, 'properties') ? 'additionalItems' : null; + if (itemsObject && !hasOwn(schema[itemsObject], 'required') && ( + hasOwn(schema[itemsObject], 'additionalProperties') || + schema.required.every(key => hasOwn(schema[itemsObject].properties, key)) + )) { + schema = _.cloneDeep(schema); + schema[itemsObject].required = schema.required; + delete schema.required; + } + } + return schema; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/json.validators.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/json.validators.ts new file mode 100644 index 000000000..522056c08 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/json.validators.ts @@ -0,0 +1,878 @@ +import _ from 'lodash'; +import { + _executeAsyncValidators, + _executeValidators, + _mergeErrors, + _mergeObjects, + AsyncIValidatorFn, + getType, + hasValue, + isArray, + isBoolean, + isDefined, + isEmpty, + isNumber, + isString, + isType, + IValidatorFn, + SchemaPrimitiveType, + toJavaScriptType, + toObservable, + xor + } from './validator.functions'; +import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; +import { forEachCopy } from './utility.functions'; +import { forkJoin } from 'rxjs'; +import { JsonSchemaFormatNames, jsonSchemaFormatTests } from './format-regex.constants'; +import { map } from 'rxjs/operators'; + + + +/** + * 'JsonValidators' class + * + * Provides an extended set of validators to be used by form controls, + * compatible with standard JSON Schema validation options. + * http://json-schema.org/latest/json-schema-validation.html + * + * Note: This library is designed as a drop-in replacement for the Angular + * Validators library, and except for one small breaking change to the 'pattern' + * validator (described below) it can even be imported as a substitute, like so: + * + * import { JsonValidators as Validators } from 'json-validators'; + * + * and it should work with existing code as a complete replacement. + * + * The one exception is the 'pattern' validator, which has been changed to + * matche partial values by default (the standard 'pattern' validator wrapped + * all patterns in '^' and '$', forcing them to always match an entire value). + * However, the old behavior can be restored by simply adding '^' and '$' + * around your patterns, or by passing an optional second parameter of TRUE. + * This change is to make the 'pattern' validator match the behavior of a + * JSON Schema pattern, which allows partial matches, rather than the behavior + * of an HTML input control pattern, which does not. + * + * This library replaces Angular's validators and combination functions + * with the following validators and transformation functions: + * + * Validators: + * For all formControls: required (*), type, enum, const + * For text formControls: minLength (*), maxLength (*), pattern (*), format + * For numeric formControls: maximum, exclusiveMaximum, + * minimum, exclusiveMinimum, multipleOf + * For formGroup objects: minProperties, maxProperties, dependencies + * For formArray arrays: minItems, maxItems, uniqueItems, contains + * Not used by JSON Schema: min (*), max (*), requiredTrue (*), email (*) + * (Validators originally included with Angular are maked with (*).) + * + * NOTE / TODO: The dependencies validator is not complete. + * NOTE / TODO: The contains validator is not complete. + * + * Validators not used by JSON Schema (but included for compatibility) + * and their JSON Schema equivalents: + * + * Angular validator | JSON Schema equivalent + * ------------------|----------------------- + * min(number) | minimum(number) + * max(number) | maximum(number) + * requiredTrue() | const(true) + * email() | format('email') + * + * Validator transformation functions: + * composeAnyOf, composeOneOf, composeAllOf, composeNot + * (Angular's original combination funciton, 'compose', is also included for + * backward compatibility, though it is functionally equivalent to composeAllOf, + * asside from its more generic error message.) + * + * All validators have also been extended to accept an optional second argument + * which, if passed a TRUE value, causes the validator to perform the opposite + * of its original finction. (This is used internally to enable 'not' and + * 'composeOneOf' to function and return useful error messages.) + * + * The 'required' validator has also been overloaded so that if called with + * a boolean parameter (or no parameters) it returns the original validator + * function (rather than executing it). However, if it is called with an + * AbstractControl parameter (as was previously required), it behaves + * exactly as before. + * + * This enables all validators (including 'required') to be constructed in + * exactly the same way, so they can be automatically applied using the + * equivalent key names and values taken directly from a JSON Schema. + * + * This source code is partially derived from Angular, + * which is Copyright (c) 2014-2017 Google, Inc. + * Use of this source code is therefore governed by the same MIT-style license + * that can be found in the LICENSE file at https://angular.io/license + * + * Original Angular Validators: + * https://github.com/angular/angular/blob/master/packages/forms/src/validators.ts + */ +export class JsonValidators { + + /** + * Validator functions: + * + * For all formControls: required, type, enum, const + * For text formControls: minLength, maxLength, pattern, format + * For numeric formControls: maximum, exclusiveMaximum, + * minimum, exclusiveMinimum, multipleOf + * For formGroup objects: minProperties, maxProperties, dependencies + * For formArray arrays: minItems, maxItems, uniqueItems, contains + * + * TODO: finish dependencies validator + */ + + /** + * 'required' validator + * + * This validator is overloaded, compared to the default required validator. + * If called with no parameters, or TRUE, this validator returns the + * 'required' validator function (rather than executing it). This matches + * the behavior of all other validators in this library. + * + * If this validator is called with an AbstractControl parameter + * (as was previously required) it behaves the same as Angular's default + * required validator, and returns an error if the control is empty. + * + * Old behavior: (if input type = AbstractControl) + * // {AbstractControl} control - required control + * // {{[key: string]: boolean}} - returns error message if no input + * + * New behavior: (if no input, or input type = boolean) + * // {boolean = true} required? - true to validate, false to disable + * // {IValidatorFn} - returns the 'required' validator function itself + */ + static required(input: AbstractControl): ValidationErrors|null; + static required(input?: boolean): IValidatorFn; + + static required(input?: AbstractControl|boolean): ValidationErrors|null|IValidatorFn { + if (input === undefined) { input = true; } + switch (input) { + case true: // Return required function (do not execute it yet) + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (invert) { return null; } // if not required, always return valid + return hasValue(control.value) ? null : { 'required': true }; + }; + case false: // Do nothing (if field is not required, it is always valid) + return JsonValidators.nullValidator; + default: // Execute required function + return hasValue((input).value) ? null : { 'required': true }; + } + } + + /** + * 'type' validator + * + * Requires a control to only accept values of a specified type, + * or one of an array of types. + * + * Note: SchemaPrimitiveType = 'string'|'number'|'integer'|'boolean'|'null' + * + * // {SchemaPrimitiveType|SchemaPrimitiveType[]} type - type(s) to accept + * // {IValidatorFn} + */ + static type(requiredType: SchemaPrimitiveType|SchemaPrimitiveType[]): IValidatorFn { + if (!hasValue(requiredType)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue: any = control.value; + const isValid = isArray(requiredType) ? + (requiredType).some(type => isType(currentValue, type)) : + isType(currentValue, requiredType); + return xor(isValid, invert) ? + null : { 'type': { requiredType, currentValue } }; + }; + } + + /** + * 'enum' validator + * + * Requires a control to have a value from an enumerated list of values. + * + * Converts types as needed to allow string inputs to still correctly + * match number, boolean, and null enum values. + * + * // {any[]} allowedValues - array of acceptable values + * // {IValidatorFn} + */ + static enum(allowedValues: any[]): IValidatorFn { + if (!isArray(allowedValues)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue: any = control.value; + const isEqual = (enumValue, inputValue) => + enumValue === inputValue || + (isNumber(enumValue) && +inputValue === +enumValue) || + (isBoolean(enumValue, 'strict') && + toJavaScriptType(inputValue, 'boolean') === enumValue) || + (enumValue === null && !hasValue(inputValue)) || + _.isEqual(enumValue, inputValue); + const isValid = isArray(currentValue) ? + currentValue.every(inputValue => allowedValues.some(enumValue => + isEqual(enumValue, inputValue) + )) : + allowedValues.some(enumValue => isEqual(enumValue, currentValue)); + return xor(isValid, invert) ? + null : { 'enum': { allowedValues, currentValue } }; + }; + } + + /** + * 'const' validator + * + * Requires a control to have a specific value. + * + * Converts types as needed to allow string inputs to still correctly + * match number, boolean, and null values. + * + * TODO: modify to work with objects + * + * // {any[]} requiredValue - required value + * // {IValidatorFn} + */ + static const(requiredValue: any): IValidatorFn { + if (!hasValue(requiredValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue: any = control.value; + const isEqual = (constValue, inputValue) => + constValue === inputValue || + isNumber(constValue) && +inputValue === +constValue || + isBoolean(constValue, 'strict') && + toJavaScriptType(inputValue, 'boolean') === constValue || + constValue === null && !hasValue(inputValue); + const isValid = isEqual(requiredValue, currentValue); + return xor(isValid, invert) ? + null : { 'const': { requiredValue, currentValue } }; + }; + } + + /** + * 'minLength' validator + * + * Requires a control's text value to be greater than a specified length. + * + * // {number} minimumLength - minimum allowed string length + * // {boolean = false} invert - instead return error object only if valid + * // {IValidatorFn} + */ + static minLength(minimumLength: number): IValidatorFn { + if (!hasValue(minimumLength)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentLength = isString(control.value) ? control.value.length : 0; + const isValid = currentLength >= minimumLength; + return xor(isValid, invert) ? + null : { 'minLength': { minimumLength, currentLength } }; + }; + } + + /** + * 'maxLength' validator + * + * Requires a control's text value to be less than a specified length. + * + * // {number} maximumLength - maximum allowed string length + * // {boolean = false} invert - instead return error object only if valid + * // {IValidatorFn} + */ + static maxLength(maximumLength: number): IValidatorFn { + if (!hasValue(maximumLength)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const currentLength = isString(control.value) ? control.value.length : 0; + const isValid = currentLength <= maximumLength; + return xor(isValid, invert) ? + null : { 'maxLength': { maximumLength, currentLength } }; + }; + } + + /** + * 'pattern' validator + * + * Note: NOT the same as Angular's default pattern validator. + * + * Requires a control's value to match a specified regular expression pattern. + * + * This validator changes the behavior of default pattern validator + * by replacing RegExp(`^${pattern}$`) with RegExp(`${pattern}`), + * which allows for partial matches. + * + * To return to the default funcitonality, and match the entire string, + * pass TRUE as the optional second parameter. + * + * // {string} pattern - regular expression pattern + * // {boolean = false} wholeString - match whole value string? + * // {IValidatorFn} + */ + static pattern(pattern: string|RegExp, wholeString = false): IValidatorFn { + if (!hasValue(pattern)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + let regex: RegExp; + let requiredPattern: string; + if (typeof pattern === 'string') { + requiredPattern = (wholeString) ? `^${pattern}$` : pattern; + regex = new RegExp(requiredPattern); + } else { + requiredPattern = pattern.toString(); + regex = pattern; + } + const currentValue: string = control.value; + const isValid = isString(currentValue) ? regex.test(currentValue) : false; + return xor(isValid, invert) ? + null : { 'pattern': { requiredPattern, currentValue } }; + }; + } + + /** + * 'format' validator + * + * Requires a control to have a value of a certain format. + * + * This validator currently checks the following formsts: + * date, time, date-time, email, hostname, ipv4, ipv6, + * uri, uri-reference, uri-template, url, uuid, color, + * json-pointer, relative-json-pointer, regex + * + * Fast format regular expressions copied from AJV: + * https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js + * + * // {JsonSchemaFormatNames} requiredFormat - format to check + * // {IValidatorFn} + */ + static format(requiredFormat: JsonSchemaFormatNames): IValidatorFn { + if (!hasValue(requiredFormat)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + let isValid: boolean; + const currentValue: string|Date = control.value; + if (isString(currentValue)) { + const formatTest: Function|RegExp = jsonSchemaFormatTests[requiredFormat]; + if (typeof formatTest === 'object') { + isValid = (formatTest).test(currentValue); + } else if (typeof formatTest === 'function') { + isValid = (formatTest)(currentValue); + } else { + console.error(`format validator error: "${requiredFormat}" is not a recognized format.`); + isValid = true; + } + } else { + // Allow JavaScript Date objects + isValid = ['date', 'time', 'date-time'].includes(requiredFormat) && + Object.prototype.toString.call(currentValue) === '[object Date]'; + } + return xor(isValid, invert) ? + null : { 'format': { requiredFormat, currentValue } }; + }; + } + + /** + * 'minimum' validator + * + * Requires a control's numeric value to be greater than or equal to + * a minimum amount. + * + * Any non-numeric value is also valid (according to the HTML forms spec, + * a non-numeric value doesn't have a minimum). + * https://www.w3.org/TR/html5/forms.html#attr-input-max + * + * // {number} minimum - minimum allowed value + * // {IValidatorFn} + */ + static minimum(minimumValue: number): IValidatorFn { + if (!hasValue(minimumValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue = control.value; + const isValid = !isNumber(currentValue) || currentValue >= minimumValue; + return xor(isValid, invert) ? + null : { 'minimum': { minimumValue, currentValue } }; + }; + } + + /** + * 'exclusiveMinimum' validator + * + * Requires a control's numeric value to be less than a maximum amount. + * + * Any non-numeric value is also valid (according to the HTML forms spec, + * a non-numeric value doesn't have a maximum). + * https://www.w3.org/TR/html5/forms.html#attr-input-max + * + * // {number} exclusiveMinimumValue - maximum allowed value + * // {IValidatorFn} + */ + static exclusiveMinimum(exclusiveMinimumValue: number): IValidatorFn { + if (!hasValue(exclusiveMinimumValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue = control.value; + const isValid = !isNumber(currentValue) || +currentValue < exclusiveMinimumValue; + return xor(isValid, invert) ? + null : { 'exclusiveMinimum': { exclusiveMinimumValue, currentValue } }; + }; + } + + /** + * 'maximum' validator + * + * Requires a control's numeric value to be less than or equal to + * a maximum amount. + * + * Any non-numeric value is also valid (according to the HTML forms spec, + * a non-numeric value doesn't have a maximum). + * https://www.w3.org/TR/html5/forms.html#attr-input-max + * + * // {number} maximumValue - maximum allowed value + * // {IValidatorFn} + */ + static maximum(maximumValue: number): IValidatorFn { + if (!hasValue(maximumValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue = control.value; + const isValid = !isNumber(currentValue) || +currentValue <= maximumValue; + return xor(isValid, invert) ? + null : { 'maximum': { maximumValue, currentValue } }; + }; + } + + /** + * 'exclusiveMaximum' validator + * + * Requires a control's numeric value to be less than a maximum amount. + * + * Any non-numeric value is also valid (according to the HTML forms spec, + * a non-numeric value doesn't have a maximum). + * https://www.w3.org/TR/html5/forms.html#attr-input-max + * + * // {number} exclusiveMaximumValue - maximum allowed value + * // {IValidatorFn} + */ + static exclusiveMaximum(exclusiveMaximumValue: number): IValidatorFn { + if (!hasValue(exclusiveMaximumValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue = control.value; + const isValid = !isNumber(currentValue) || +currentValue < exclusiveMaximumValue; + return xor(isValid, invert) ? + null : { 'exclusiveMaximum': { exclusiveMaximumValue, currentValue } }; + }; + } + + /** + * 'multipleOf' validator + * + * Requires a control to have a numeric value that is a multiple + * of a specified number. + * + * // {number} multipleOfValue - number value must be a multiple of + * // {IValidatorFn} + */ + static multipleOf(multipleOfValue: number): IValidatorFn { + if (!hasValue(multipleOfValue)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentValue = control.value; + const isValid = isNumber(currentValue) && + currentValue % multipleOfValue === 0; + return xor(isValid, invert) ? + null : { 'multipleOf': { multipleOfValue, currentValue } }; + }; + } + + /** + * 'minProperties' validator + * + * Requires a form group to have a minimum number of properties (i.e. have + * values entered in a minimum number of controls within the group). + * + * // {number} minimumProperties - minimum number of properties allowed + * // {IValidatorFn} + */ + static minProperties(minimumProperties: number): IValidatorFn { + if (!hasValue(minimumProperties)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentProperties = Object.keys(control.value).length || 0; + const isValid = currentProperties >= minimumProperties; + return xor(isValid, invert) ? + null : { 'minProperties': { minimumProperties, currentProperties } }; + }; + } + + /** + * 'maxProperties' validator + * + * Requires a form group to have a maximum number of properties (i.e. have + * values entered in a maximum number of controls within the group). + * + * Note: Has no effect if the form group does not contain more than the + * maximum number of controls. + * + * // {number} maximumProperties - maximum number of properties allowed + * // {IValidatorFn} + */ + static maxProperties(maximumProperties: number): IValidatorFn { + if (!hasValue(maximumProperties)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const currentProperties = Object.keys(control.value).length || 0; + const isValid = currentProperties <= maximumProperties; + return xor(isValid, invert) ? + null : { 'maxProperties': { maximumProperties, currentProperties } }; + }; + } + + /** + * 'dependencies' validator + * + * Requires the controls in a form group to meet additional validation + * criteria, depending on the values of other controls in the group. + * + * Examples: + * https://spacetelescope.github.io/understanding-json-schema/reference/object.html#dependencies + * + * // {any} dependencies - required dependencies + * // {IValidatorFn} + */ + static dependencies(dependencies: any): IValidatorFn { + if (getType(dependencies) !== 'object' || isEmpty(dependencies)) { + return JsonValidators.nullValidator; + } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const allErrors = _mergeObjects( + forEachCopy(dependencies, (value, requiringField) => { + if (!hasValue(control.value[requiringField])) { return null; } + let requiringFieldErrors: ValidationErrors = { }; + let requiredFields: string[]; + let properties: ValidationErrors = { }; + if (getType(dependencies[requiringField]) === 'array') { + requiredFields = dependencies[requiringField]; + } else if (getType(dependencies[requiringField]) === 'object') { + requiredFields = dependencies[requiringField]['required'] || []; + properties = dependencies[requiringField]['properties'] || { }; + } + + // Validate property dependencies + for (const requiredField of requiredFields) { + if (xor(!hasValue(control.value[requiredField]), invert)) { + requiringFieldErrors[requiredField] = { 'required': true }; + } + } + + // Validate schema dependencies + requiringFieldErrors = _mergeObjects(requiringFieldErrors, + forEachCopy(properties, (requirements, requiredField) => { + const requiredFieldErrors = _mergeObjects( + forEachCopy(requirements, (requirement, parameter) => { + let validator: IValidatorFn = null; + if (requirement === 'maximum' || requirement === 'minimum') { + const exclusive = !!requirements['exclusiveM' + requirement.slice(1)]; + validator = JsonValidators[requirement](parameter, exclusive); + } else if (typeof JsonValidators[requirement] === 'function') { + validator = JsonValidators[requirement](parameter); + } + return !isDefined(validator) ? + null : validator(control.value[requiredField]); + }) + ); + return isEmpty(requiredFieldErrors) ? + null : { [requiredField]: requiredFieldErrors }; + }) + ); + return isEmpty(requiringFieldErrors) ? + null : { [requiringField]: requiringFieldErrors }; + }) + ); + return isEmpty(allErrors) ? null : allErrors; + }; + } + + /** + * 'minItems' validator + * + * Requires a form array to have a minimum number of values. + * + * // {number} minimumItems - minimum number of items allowed + * // {IValidatorFn} + */ + static minItems(minimumItems: number): IValidatorFn { + if (!hasValue(minimumItems)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const currentItems = isArray(control.value) ? control.value.length : 0; + const isValid = currentItems >= minimumItems; + return xor(isValid, invert) ? + null : { 'minItems': { minimumItems, currentItems } }; + }; + } + + /** + * 'maxItems' validator + * + * Requires a form array to have a maximum number of values. + * + * // {number} maximumItems - maximum number of items allowed + * // {IValidatorFn} + */ + static maxItems(maximumItems: number): IValidatorFn { + if (!hasValue(maximumItems)) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const currentItems = isArray(control.value) ? control.value.length : 0; + const isValid = currentItems <= maximumItems; + return xor(isValid, invert) ? + null : { 'maxItems': { maximumItems, currentItems } }; + }; + } + + /** + * 'uniqueItems' validator + * + * Requires values in a form array to be unique. + * + * // {boolean = true} unique? - true to validate, false to disable + * // {IValidatorFn} + */ + static uniqueItems(unique = true): IValidatorFn { + if (!unique) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const sorted: any[] = control.value.slice().sort(); + const duplicateItems = []; + for (let i = 1; i < sorted.length; i++) { + if (sorted[i - 1] === sorted[i] && duplicateItems.includes(sorted[i])) { + duplicateItems.push(sorted[i]); + } + } + const isValid = !duplicateItems.length; + return xor(isValid, invert) ? + null : { 'uniqueItems': { duplicateItems } }; + }; + } + + /** + * 'contains' validator + * + * TODO: Complete this validator + * + * Requires values in a form array to be unique. + * + * // {boolean = true} unique? - true to validate, false to disable + * // {IValidatorFn} + */ + static contains(requiredItem = true): IValidatorFn { + if (!requiredItem) { return JsonValidators.nullValidator; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value) || !isArray(control.value)) { return null; } + const currentItems = control.value; + // const isValid = currentItems.some(item => + // + // ); + const isValid = true; + return xor(isValid, invert) ? + null : { 'contains': { requiredItem, currentItems } }; + }; + } + + /** + * No-op validator. Included for backward compatibility. + */ + static nullValidator(control: AbstractControl): ValidationErrors|null { + return null; + } + + /** + * Validator transformation functions: + * composeAnyOf, composeOneOf, composeAllOf, composeNot, + * compose, composeAsync + * + * TODO: Add composeAnyOfAsync, composeOneOfAsync, + * composeAllOfAsync, composeNotAsync + */ + + /** + * 'composeAnyOf' validator combination function + * + * Accepts an array of validators and returns a single validator that + * evaluates to valid if any one or more of the submitted validators are + * valid. If every validator is invalid, it returns combined errors from + * all validators. + * + * // {IValidatorFn[]} validators - array of validators to combine + * // {IValidatorFn} - single combined validator function + */ + static composeAnyOf(validators: IValidatorFn[]): IValidatorFn { + if (!validators) { return null; } + const presentValidators = validators.filter(isDefined); + if (presentValidators.length === 0) { return null; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const arrayOfErrors = + _executeValidators(control, presentValidators, invert).filter(isDefined); + const isValid = validators.length > arrayOfErrors.length; + return xor(isValid, invert) ? + null : _mergeObjects(...arrayOfErrors, { 'anyOf': !invert }); + }; + } + + /** + * 'composeOneOf' validator combination function + * + * Accepts an array of validators and returns a single validator that + * evaluates to valid only if exactly one of the submitted validators + * is valid. Otherwise returns combined information from all validators, + * both valid and invalid. + * + * // {IValidatorFn[]} validators - array of validators to combine + * // {IValidatorFn} - single combined validator function + */ + static composeOneOf(validators: IValidatorFn[]): IValidatorFn { + if (!validators) { return null; } + const presentValidators = validators.filter(isDefined); + if (presentValidators.length === 0) { return null; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const arrayOfErrors = + _executeValidators(control, presentValidators); + const validControls = + validators.length - arrayOfErrors.filter(isDefined).length; + const isValid = validControls === 1; + if (xor(isValid, invert)) { return null; } + const arrayOfValids = + _executeValidators(control, presentValidators, invert); + return _mergeObjects(...arrayOfErrors, ...arrayOfValids, { 'oneOf': !invert }); + }; + } + + /** + * 'composeAllOf' validator combination function + * + * Accepts an array of validators and returns a single validator that + * evaluates to valid only if all the submitted validators are individually + * valid. Otherwise it returns combined errors from all invalid validators. + * + * // {IValidatorFn[]} validators - array of validators to combine + * // {IValidatorFn} - single combined validator function + */ + static composeAllOf(validators: IValidatorFn[]): IValidatorFn { + if (!validators) { return null; } + const presentValidators = validators.filter(isDefined); + if (presentValidators.length === 0) { return null; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + const combinedErrors = _mergeErrors( + _executeValidators(control, presentValidators, invert) + ); + const isValid = combinedErrors === null; + return (xor(isValid, invert)) ? + null : _mergeObjects(combinedErrors, { 'allOf': !invert }); + }; + } + + /** + * 'composeNot' validator inversion function + * + * Accepts a single validator function and inverts its result. + * Returns valid if the submitted validator is invalid, and + * returns invalid if the submitted validator is valid. + * (Note: this function can itself be inverted + * - e.g. composeNot(composeNot(validator)) - + * but this can be confusing and is therefore not recommended.) + * + * // {IValidatorFn[]} validators - validator(s) to invert + * // {IValidatorFn} - new validator function that returns opposite result + */ + static composeNot(validator: IValidatorFn): IValidatorFn { + if (!validator) { return null; } + return (control: AbstractControl, invert = false): ValidationErrors|null => { + if (isEmpty(control.value)) { return null; } + const error = validator(control, !invert); + const isValid = error === null; + return (xor(isValid, invert)) ? + null : _mergeObjects(error, { 'not': !invert }); + }; + } + + /** + * 'compose' validator combination function + * + * // {IValidatorFn[]} validators - array of validators to combine + * // {IValidatorFn} - single combined validator function + */ + static compose(validators: IValidatorFn[]): IValidatorFn { + if (!validators) { return null; } + const presentValidators = validators.filter(isDefined); + if (presentValidators.length === 0) { return null; } + return (control: AbstractControl, invert = false): ValidationErrors|null => + _mergeErrors(_executeValidators(control, presentValidators, invert)); + } + + /** + * 'composeAsync' async validator combination function + * + * // {AsyncIValidatorFn[]} async validators - array of async validators + * // {AsyncIValidatorFn} - single combined async validator function + */ + static composeAsync(validators: AsyncIValidatorFn[]): AsyncIValidatorFn { + if (!validators) { return null; } + const presentValidators = validators.filter(isDefined); + if (presentValidators.length === 0) { return null; } + return (control: AbstractControl) => { + const observables = + _executeAsyncValidators(control, presentValidators).map(toObservable); + return map.call(forkJoin(observables), _mergeErrors); + }; + } + + // Additional angular validators (not used by Angualr JSON Schema Form) + // From https://github.com/angular/angular/blob/master/packages/forms/src/validators.ts + + /** + * Validator that requires controls to have a value greater than a number. + */ + static min(min: number): ValidatorFn { + if (!hasValue(min)) { return JsonValidators.nullValidator; } + return (control: AbstractControl): ValidationErrors|null => { + // don't validate empty values to allow optional controls + if (isEmpty(control.value) || isEmpty(min)) { return null; } + const value = parseFloat(control.value); + const actual = control.value; + // Controls with NaN values after parsing should be treated as not having a + // minimum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-min + return isNaN(value) || value >= min ? null : { 'min': { min, actual } }; + }; + } + + /** + * Validator that requires controls to have a value less than a number. + */ + static max(max: number): ValidatorFn { + if (!hasValue(max)) { return JsonValidators.nullValidator; } + return (control: AbstractControl): ValidationErrors|null => { + // don't validate empty values to allow optional controls + if (isEmpty(control.value) || isEmpty(max)) { return null; } + const value = parseFloat(control.value); + const actual = control.value; + // Controls with NaN values after parsing should be treated as not having a + // maximum, per the HTML forms spec: https://www.w3.org/TR/html5/forms.html#attr-input-max + return isNaN(value) || value <= max ? null : { 'max': { max, actual } }; + }; + } + + /** + * Validator that requires control value to be true. + */ + static requiredTrue(control: AbstractControl): ValidationErrors|null { + if (!control) { return JsonValidators.nullValidator; } + return control.value === true ? null : { 'required': true }; + } + + /** + * Validator that performs email validation. + */ + static email(control: AbstractControl): ValidationErrors|null { + if (!control) { return JsonValidators.nullValidator; } + const EMAIL_REGEXP = + // tslint:disable-next-line:max-line-length + /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/; + return EMAIL_REGEXP.test(control.value) ? null : { 'email': true }; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/jsonpointer.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/jsonpointer.functions.ts new file mode 100644 index 000000000..c9f04118e --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/jsonpointer.functions.ts @@ -0,0 +1,895 @@ +import { copy, hasOwn } from './utility.functions'; +import { Injectable } from '@angular/core'; +import { + isArray, + isDefined, + isEmpty, + isMap, + isNumber, + isObject, + isString + } from './validator.functions'; + + +/** + * 'JsonPointer' class + * + * Some utilities for using JSON Pointers with JSON objects + * https://tools.ietf.org/html/rfc6901 + * + * get, getCopy, getFirst, set, setCopy, insert, insertCopy, remove, has, dict, + * forEachDeep, forEachDeepCopy, escape, unescape, parse, compile, toKey, + * isJsonPointer, isSubPointer, toIndexedPointer, toGenericPointer, + * toControlPointer, toSchemaPointer, toDataPointer, parseObjectPath + * + * Some functions based on manuelstofer's json-pointer utilities + * https://github.com/manuelstofer/json-pointer + */ +export type Pointer = string | string[]; + +@Injectable() +export class JsonPointer { + + /** + * 'get' function + * + * Uses a JSON Pointer to retrieve a value from an object. + * + * // { object } object - Object to get value from + * // { Pointer } pointer - JSON Pointer (string or array) + * // { number = 0 } startSlice - Zero-based index of first Pointer key to use + * // { number } endSlice - Zero-based index of last Pointer key to use + * // { boolean = false } getBoolean - Return only true or false? + * // { boolean = false } errors - Show error if not found? + * // { object } - Located value (or true or false if getBoolean = true) + */ + static get( + object, pointer, startSlice = 0, endSlice: number = null, + getBoolean = false, errors = false + ) { + if (object === null) { return getBoolean ? false : undefined; } + let keyArray: any[] = this.parse(pointer, errors); + if (typeof object === 'object' && keyArray !== null) { + let subObject = object; + if (startSlice >= keyArray.length || endSlice <= -keyArray.length) { return object; } + if (startSlice <= -keyArray.length) { startSlice = 0; } + if (!isDefined(endSlice) || endSlice >= keyArray.length) { endSlice = keyArray.length; } + keyArray = keyArray.slice(startSlice, endSlice); + for (let key of keyArray) { + if (key === '-' && isArray(subObject) && subObject.length) { + key = subObject.length - 1; + } + if (isMap(subObject) && subObject.has(key)) { + subObject = subObject.get(key); + } else if (typeof subObject === 'object' && subObject !== null && + hasOwn(subObject, key) + ) { + subObject = subObject[key]; + } else { + if (errors) { + console.error(`get error: "${key}" key not found in object.`); + console.error(pointer); + console.error(object); + } + return getBoolean ? false : undefined; + } + } + return getBoolean ? true : subObject; + } + if (errors && keyArray === null) { + console.error(`get error: Invalid JSON Pointer: ${pointer}`); + } + if (errors && typeof object !== 'object') { + console.error('get error: Invalid object:'); + console.error(object); + } + return getBoolean ? false : undefined; + } + + /** + * 'getCopy' function + * + * Uses a JSON Pointer to deeply clone a value from an object. + * + * // { object } object - Object to get value from + * // { Pointer } pointer - JSON Pointer (string or array) + * // { number = 0 } startSlice - Zero-based index of first Pointer key to use + * // { number } endSlice - Zero-based index of last Pointer key to use + * // { boolean = false } getBoolean - Return only true or false? + * // { boolean = false } errors - Show error if not found? + * // { object } - Located value (or true or false if getBoolean = true) + */ + static getCopy( + object, pointer, startSlice = 0, endSlice: number = null, + getBoolean = false, errors = false + ) { + const objectToCopy = + this.get(object, pointer, startSlice, endSlice, getBoolean, errors); + return this.forEachDeepCopy(objectToCopy); + } + + /** + * 'getFirst' function + * + * Takes an array of JSON Pointers and objects, + * checks each object for a value specified by the pointer, + * and returns the first value found. + * + * // { [object, pointer][] } items - Array of objects and pointers to check + * // { any = null } defaultValue - Value to return if nothing found + * // { boolean = false } getCopy - Return a copy instead? + * // - First value found + */ + static getFirst(items, defaultValue: any = null, getCopy = false) { + if (isEmpty(items)) { return; } + if (isArray(items)) { + for (const item of items) { + if (isEmpty(item)) { continue; } + if (isArray(item) && item.length >= 2) { + if (isEmpty(item[0]) || isEmpty(item[1])) { continue; } + const value = getCopy ? + this.getCopy(item[0], item[1]) : + this.get(item[0], item[1]); + if (value) { return value; } + continue; + } + console.error('getFirst error: Input not in correct format.\n' + + 'Should be: [ [ object1, pointer1 ], [ object 2, pointer2 ], etc... ]'); + return; + } + return defaultValue; + } + if (isMap(items)) { + for (const [object, pointer] of items) { + if (object === null || !this.isJsonPointer(pointer)) { continue; } + const value = getCopy ? + this.getCopy(object, pointer) : + this.get(object, pointer); + if (value) { return value; } + } + return defaultValue; + } + console.error('getFirst error: Input not in correct format.\n' + + 'Should be: [ [ object1, pointer1 ], [ object 2, pointer2 ], etc... ]'); + return defaultValue; + } + + /** + * 'getFirstCopy' function + * + * Similar to getFirst, but always returns a copy. + * + * // { [object, pointer][] } items - Array of objects and pointers to check + * // { any = null } defaultValue - Value to return if nothing found + * // - Copy of first value found + */ + static getFirstCopy(items, defaultValue: any = null) { + const firstCopy = this.getFirst(items, defaultValue, true); + return firstCopy; + } + + /** + * 'set' function + * + * Uses a JSON Pointer to set a value on an object. + * Also creates any missing sub objects or arrays to contain that value. + * + * If the optional fourth parameter is TRUE and the inner-most container + * is an array, the function will insert the value as a new item at the + * specified location in the array, rather than overwriting the existing + * value (if any) at that location. + * + * So set([1, 2, 3], '/1', 4) => [1, 4, 3] + * and + * So set([1, 2, 3], '/1', 4, true) => [1, 4, 2, 3] + * + * // { object } object - The object to set value in + * // { Pointer } pointer - The JSON Pointer (string or array) + * // value - The new value to set + * // { boolean } insert - insert value? + * // { object } - The original object, modified with the set value + */ + static set(object, pointer, value, insert = false) { + const keyArray = this.parse(pointer); + if (keyArray !== null && keyArray.length) { + let subObject = object; + for (let i = 0; i < keyArray.length - 1; ++i) { + let key = keyArray[i]; + if (key === '-' && isArray(subObject)) { + key = subObject.length; + } + if (isMap(subObject) && subObject.has(key)) { + subObject = subObject.get(key); + } else { + if (!hasOwn(subObject, key)) { + subObject[key] = (keyArray[i + 1].match(/^(\d+|-)$/)) ? [] : {}; + } + subObject = subObject[key]; + } + } + const lastKey = keyArray[keyArray.length - 1]; + if (isArray(subObject) && lastKey === '-') { + subObject.push(value); + } else if (insert && isArray(subObject) && !isNaN(+lastKey)) { + subObject.splice(lastKey, 0, value); + } else if (isMap(subObject)) { + subObject.set(lastKey, value); + } else { + subObject[lastKey] = value; + } + return object; + } + console.error(`set error: Invalid JSON Pointer: ${pointer}`); + return object; + } + + /** + * 'setCopy' function + * + * Copies an object and uses a JSON Pointer to set a value on the copy. + * Also creates any missing sub objects or arrays to contain that value. + * + * If the optional fourth parameter is TRUE and the inner-most container + * is an array, the function will insert the value as a new item at the + * specified location in the array, rather than overwriting the existing value. + * + * // { object } object - The object to copy and set value in + * // { Pointer } pointer - The JSON Pointer (string or array) + * // value - The value to set + * // { boolean } insert - insert value? + * // { object } - The new object with the set value + */ + static setCopy(object, pointer, value, insert = false) { + const keyArray = this.parse(pointer); + if (keyArray !== null) { + const newObject = copy(object); + let subObject = newObject; + for (let i = 0; i < keyArray.length - 1; ++i) { + let key = keyArray[i]; + if (key === '-' && isArray(subObject)) { + key = subObject.length; + } + if (isMap(subObject) && subObject.has(key)) { + subObject.set(key, copy(subObject.get(key))); + subObject = subObject.get(key); + } else { + if (!hasOwn(subObject, key)) { + subObject[key] = (keyArray[i + 1].match(/^(\d+|-)$/)) ? [] : {}; + } + subObject[key] = copy(subObject[key]); + subObject = subObject[key]; + } + } + const lastKey = keyArray[keyArray.length - 1]; + if (isArray(subObject) && lastKey === '-') { + subObject.push(value); + } else if (insert && isArray(subObject) && !isNaN(+lastKey)) { + subObject.splice(lastKey, 0, value); + } else if (isMap(subObject)) { + subObject.set(lastKey, value); + } else { + subObject[lastKey] = value; + } + return newObject; + } + console.error(`setCopy error: Invalid JSON Pointer: ${pointer}`); + return object; + } + + /** + * 'insert' function + * + * Calls 'set' with insert = TRUE + * + * // { object } object - object to insert value in + * // { Pointer } pointer - JSON Pointer (string or array) + * // value - value to insert + * // { object } + */ + static insert(object, pointer, value) { + const updatedObject = this.set(object, pointer, value, true); + return updatedObject; + } + + /** + * 'insertCopy' function + * + * Calls 'setCopy' with insert = TRUE + * + * // { object } object - object to insert value in + * // { Pointer } pointer - JSON Pointer (string or array) + * // value - value to insert + * // { object } + */ + static insertCopy(object, pointer, value) { + const updatedObject = this.setCopy(object, pointer, value, true); + return updatedObject; + } + + /** + * 'remove' function + * + * Uses a JSON Pointer to remove a key and its attribute from an object + * + * // { object } object - object to delete attribute from + * // { Pointer } pointer - JSON Pointer (string or array) + * // { object } + */ + static remove(object, pointer) { + const keyArray = this.parse(pointer); + if (keyArray !== null && keyArray.length) { + let lastKey = keyArray.pop(); + const parentObject = this.get(object, keyArray); + if (isArray(parentObject)) { + if (lastKey === '-') { lastKey = parentObject.length - 1; } + parentObject.splice(lastKey, 1); + } else if (isObject(parentObject)) { + delete parentObject[lastKey]; + } + return object; + } + console.error(`remove error: Invalid JSON Pointer: ${pointer}`); + return object; + } + + /** + * 'has' function + * + * Tests if an object has a value at the location specified by a JSON Pointer + * + * // { object } object - object to chek for value + * // { Pointer } pointer - JSON Pointer (string or array) + * // { boolean } + */ + static has(object, pointer) { + const hasValue = this.get(object, pointer, 0, null, true); + return hasValue; + } + + /** + * 'dict' function + * + * Returns a (pointer -> value) dictionary for an object + * + * // { object } object - The object to create a dictionary from + * // { object } - The resulting dictionary object + */ + static dict(object) { + const results: any = {}; + this.forEachDeep(object, (value, pointer) => { + if (typeof value !== 'object') { results[pointer] = value; } + }); + return results; + } + + /** + * 'forEachDeep' function + * + * Iterates over own enumerable properties of an object or items in an array + * and invokes an iteratee function for each key/value or index/value pair. + * By default, iterates over items within objects and arrays after calling + * the iteratee function on the containing object or array itself. + * + * The iteratee is invoked with three arguments: (value, pointer, rootObject), + * where pointer is a JSON pointer indicating the location of the current + * value within the root object, and rootObject is the root object initially + * submitted to th function. + * + * If a third optional parameter 'bottomUp' is set to TRUE, the iterator + * function will be called on sub-objects and arrays after being + * called on their contents, rather than before, which is the default. + * + * This function can also optionally be called directly on a sub-object by + * including optional 4th and 5th parameterss to specify the initial + * root object and pointer. + * + * // { object } object - the initial object or array + * // { (v: any, p?: string, o?: any) => any } function - iteratee function + * // { boolean = false } bottomUp - optional, set to TRUE to reverse direction + * // { object = object } rootObject - optional, root object or array + * // { string = '' } pointer - optional, JSON Pointer to object within rootObject + * // { object } - The modified object + */ + static forEachDeep( + object, fn: (v: any, p?: string, o?: any) => any = (v) => v, + bottomUp = false, pointer = '', rootObject = object + ) { + if (typeof fn !== 'function') { + console.error(`forEachDeep error: Iterator is not a function:`, fn); + return; + } + if (!bottomUp) { fn(object, pointer, rootObject); } + if (isObject(object) || isArray(object)) { + for (const key of Object.keys(object)) { + const newPointer = pointer + '/' + this.escape(key); + this.forEachDeep(object[key], fn, bottomUp, newPointer, rootObject); + } + } + if (bottomUp) { fn(object, pointer, rootObject); } + } + + /** + * 'forEachDeepCopy' function + * + * Similar to forEachDeep, but returns a copy of the original object, with + * the same keys and indexes, but with values replaced with the result of + * the iteratee function. + * + * // { object } object - the initial object or array + * // { (v: any, k?: string, o?: any, p?: any) => any } function - iteratee function + * // { boolean = false } bottomUp - optional, set to TRUE to reverse direction + * // { object = object } rootObject - optional, root object or array + * // { string = '' } pointer - optional, JSON Pointer to object within rootObject + * // { object } - The copied object + */ + static forEachDeepCopy( + object, fn: (v: any, p?: string, o?: any) => any = (v) => v, + bottomUp = false, pointer = '', rootObject = object + ) { + if (typeof fn !== 'function') { + console.error(`forEachDeepCopy error: Iterator is not a function:`, fn); + return null; + } + if (isObject(object) || isArray(object)) { + let newObject = isArray(object) ? [ ...object ] : { ...object }; + if (!bottomUp) { newObject = fn(newObject, pointer, rootObject); } + for (const key of Object.keys(newObject)) { + const newPointer = pointer + '/' + this.escape(key); + newObject[key] = this.forEachDeepCopy( + newObject[key], fn, bottomUp, newPointer, rootObject + ); + } + if (bottomUp) { newObject = fn(newObject, pointer, rootObject); } + return newObject; + } else { + return fn(object, pointer, rootObject); + } + } + + /** + * 'escape' function + * + * Escapes a string reference key + * + * // { string } key - string key to escape + * // { string } - escaped key + */ + static escape(key) { + const escaped = key.toString().replace(/~/g, '~0').replace(/\//g, '~1'); + return escaped; + } + + /** + * 'unescape' function + * + * Unescapes a string reference key + * + * // { string } key - string key to unescape + * // { string } - unescaped key + */ + static unescape(key) { + const unescaped = key.toString().replace(/~1/g, '/').replace(/~0/g, '~'); + return unescaped; + } + + /** + * 'parse' function + * + * Converts a string JSON Pointer into a array of keys + * (if input is already an an array of keys, it is returned unchanged) + * + * // { Pointer } pointer - JSON Pointer (string or array) + * // { boolean = false } errors - Show error if invalid pointer? + * // { string[] } - JSON Pointer array of keys + */ + static parse(pointer, errors = false) { + if (!this.isJsonPointer(pointer)) { + if (errors) { console.error(`parse error: Invalid JSON Pointer: ${pointer}`); } + return null; + } + if (isArray(pointer)) { return pointer; } + if (typeof pointer === 'string') { + if ((pointer)[0] === '#') { pointer = pointer.slice(1); } + if (pointer === '' || pointer === '/') { return []; } + return (pointer).slice(1).split('/').map(this.unescape); + } + } + + /** + * 'compile' function + * + * Converts an array of keys into a JSON Pointer string + * (if input is already a string, it is normalized and returned) + * + * The optional second parameter is a default which will replace any empty keys. + * + * // { Pointer } pointer - JSON Pointer (string or array) + * // { string | number = '' } defaultValue - Default value + * // { boolean = false } errors - Show error if invalid pointer? + * // { string } - JSON Pointer string + */ + static compile(pointer, defaultValue = '', errors = false) { + if (pointer === '#') { return ''; } + if (!this.isJsonPointer(pointer)) { + if (errors) { console.error(`compile error: Invalid JSON Pointer: ${pointer}`); } + return null; + } + if (isArray(pointer)) { + if ((pointer).length === 0) { return ''; } + return '/' + (pointer).map( + key => key === '' ? defaultValue : this.escape(key) + ).join('/'); + } + if (typeof pointer === 'string') { + if (pointer[0] === '#') { pointer = pointer.slice(1); } + return pointer; + } + } + + /** + * 'toKey' function + * + * Extracts name of the final key from a JSON Pointer. + * + * // { Pointer } pointer - JSON Pointer (string or array) + * // { boolean = false } errors - Show error if invalid pointer? + * // { string } - the extracted key + */ + static toKey(pointer, errors = false) { + const keyArray = this.parse(pointer, errors); + if (keyArray === null) { return null; } + if (!keyArray.length) { return ''; } + return keyArray[keyArray.length - 1]; + } + + /** + * 'isJsonPointer' function + * + * Checks a string or array value to determine if it is a valid JSON Pointer. + * Returns true if a string is empty, or starts with '/' or '#/'. + * Returns true if an array contains only string values. + * + * // value - value to check + * // { boolean } - true if value is a valid JSON Pointer, otherwise false + */ + static isJsonPointer(value) { + if (isArray(value)) { + return value.every(key => typeof key === 'string'); + } else if (isString(value)) { + if (value === '' || value === '#') { return true; } + if (value[0] === '/' || value.slice(0, 2) === '#/') { + return !/(~[^01]|~$)/g.test(value); + } + } + return false; + } + + /** + * 'isSubPointer' function + * + * Checks whether one JSON Pointer is a subset of another. + * + * // { Pointer } shortPointer - potential subset JSON Pointer + * // { Pointer } longPointer - potential superset JSON Pointer + * // { boolean = false } trueIfMatching - return true if pointers match? + * // { boolean = false } errors - Show error if invalid pointer? + * // { boolean } - true if shortPointer is a subset of longPointer, false if not + */ + static isSubPointer( + shortPointer, longPointer, trueIfMatching = false, errors = false + ) { + if (!this.isJsonPointer(shortPointer) || !this.isJsonPointer(longPointer)) { + if (errors) { + let invalid = ''; + if (!this.isJsonPointer(shortPointer)) { invalid += ` 1: ${shortPointer}`; } + if (!this.isJsonPointer(longPointer)) { invalid += ` 2: ${longPointer}`; } + console.error(`isSubPointer error: Invalid JSON Pointer ${invalid}`); + } + return; + } + shortPointer = this.compile(shortPointer, '', errors); + longPointer = this.compile(longPointer, '', errors); + return shortPointer === longPointer ? trueIfMatching : + `${shortPointer}/` === longPointer.slice(0, shortPointer.length + 1); + } + + /** + * 'toIndexedPointer' function + * + * Merges an array of numeric indexes and a generic pointer to create an + * indexed pointer for a specific item. + * + * For example, merging the generic pointer '/foo/-/bar/-/baz' and + * the array [4, 2] would result in the indexed pointer '/foo/4/bar/2/baz' + * + * + * // { Pointer } genericPointer - The generic pointer + * // { number[] } indexArray - The array of numeric indexes + * // { Map } arrayMap - An optional array map + * // { string } - The merged pointer with indexes + */ + static toIndexedPointer( + genericPointer, indexArray, arrayMap: Map = null + ) { + if (this.isJsonPointer(genericPointer) && isArray(indexArray)) { + let indexedPointer = this.compile(genericPointer); + if (isMap(arrayMap)) { + let arrayIndex = 0; + return indexedPointer.replace(/\/\-(?=\/|$)/g, (key, stringIndex) => + arrayMap.has((indexedPointer).slice(0, stringIndex)) ? + '/' + indexArray[arrayIndex++] : key + ); + } else { + for (const pointerIndex of indexArray) { + indexedPointer = indexedPointer.replace('/-', '/' + pointerIndex); + } + return indexedPointer; + } + } + if (!this.isJsonPointer(genericPointer)) { + console.error(`toIndexedPointer error: Invalid JSON Pointer: ${genericPointer}`); + } + if (!isArray(indexArray)) { + console.error(`toIndexedPointer error: Invalid indexArray: ${indexArray}`); + } + } + + /** + * 'toGenericPointer' function + * + * Compares an indexed pointer to an array map and removes list array + * indexes (but leaves tuple arrray indexes and all object keys, including + * numeric keys) to create a generic pointer. + * + * For example, using the indexed pointer '/foo/1/bar/2/baz/3' and + * the arrayMap [['/foo', 0], ['/foo/-/bar', 3], ['/foo/-/bar/-/baz', 0]] + * would result in the generic pointer '/foo/-/bar/2/baz/-' + * Using the indexed pointer '/foo/1/bar/4/baz/3' and the same arrayMap + * would result in the generic pointer '/foo/-/bar/-/baz/-' + * (the bar array has 3 tuple items, so index 2 is retained, but 4 is removed) + * + * The structure of the arrayMap is: [['path to array', number of tuple items]...] + * + * + * // { Pointer } indexedPointer - The indexed pointer (array or string) + * // { Map } arrayMap - The optional array map (for preserving tuple indexes) + * // { string } - The generic pointer with indexes removed + */ + static toGenericPointer(indexedPointer, arrayMap = new Map()) { + if (this.isJsonPointer(indexedPointer) && isMap(arrayMap)) { + const pointerArray = this.parse(indexedPointer); + for (let i = 1; i < pointerArray.length; i++) { + const subPointer = this.compile(pointerArray.slice(0, i)); + if (arrayMap.has(subPointer) && + arrayMap.get(subPointer) <= +pointerArray[i] + ) { + pointerArray[i] = '-'; + } + } + return this.compile(pointerArray); + } + if (!this.isJsonPointer(indexedPointer)) { + console.error(`toGenericPointer error: invalid JSON Pointer: ${indexedPointer}`); + } + if (!isMap(arrayMap)) { + console.error(`toGenericPointer error: invalid arrayMap: ${arrayMap}`); + } + } + + /** + * 'toControlPointer' function + * + * Accepts a JSON Pointer for a data object and returns a JSON Pointer for the + * matching control in an Angular FormGroup. + * + * // { Pointer } dataPointer - JSON Pointer (string or array) to a data object + * // { FormGroup } formGroup - Angular FormGroup to get value from + * // { boolean = false } controlMustExist - Only return if control exists? + * // { Pointer } - JSON Pointer (string) to the formGroup object + */ + static toControlPointer(dataPointer, formGroup, controlMustExist = false) { + const dataPointerArray = this.parse(dataPointer); + const controlPointerArray: string[] = []; + let subGroup = formGroup; + if (dataPointerArray !== null) { + for (const key of dataPointerArray) { + if (hasOwn(subGroup, 'controls')) { + controlPointerArray.push('controls'); + subGroup = subGroup.controls; + } + if (isArray(subGroup) && (key === '-')) { + controlPointerArray.push((subGroup.length - 1).toString()); + subGroup = subGroup[subGroup.length - 1]; + } else if (hasOwn(subGroup, key)) { + controlPointerArray.push(key); + subGroup = subGroup[key]; + } else if (controlMustExist) { + console.error(`toControlPointer error: Unable to find "${key}" item in FormGroup.`); + console.error(dataPointer); + console.error(formGroup); + return; + } else { + controlPointerArray.push(key); + subGroup = { controls: {} }; + } + } + return this.compile(controlPointerArray); + } + console.error(`toControlPointer error: Invalid JSON Pointer: ${dataPointer}`); + } + + /** + * 'toSchemaPointer' function + * + * Accepts a JSON Pointer to a value inside a data object and a JSON schema + * for that object. + * + * Returns a Pointer to the sub-schema for the value inside the object's schema. + * + * // { Pointer } dataPointer - JSON Pointer (string or array) to an object + * // schema - JSON schema for the object + * // { Pointer } - JSON Pointer (string) to the object's schema + */ + static toSchemaPointer(dataPointer, schema) { + if (this.isJsonPointer(dataPointer) && typeof schema === 'object') { + const pointerArray = this.parse(dataPointer); + if (!pointerArray.length) { return ''; } + const firstKey = pointerArray.shift(); + if (schema.type === 'object' || schema.properties || schema.additionalProperties) { + if ((schema.properties || {})[firstKey]) { + return `/properties/${this.escape(firstKey)}` + + this.toSchemaPointer(pointerArray, schema.properties[firstKey]); + } else if (schema.additionalProperties) { + return '/additionalProperties' + + this.toSchemaPointer(pointerArray, schema.additionalProperties); + } + } + if ((schema.type === 'array' || schema.items) && + (isNumber(firstKey) || firstKey === '-' || firstKey === '') + ) { + const arrayItem = firstKey === '-' || firstKey === '' ? 0 : +firstKey; + if (isArray(schema.items)) { + if (arrayItem < schema.items.length) { + return '/items/' + arrayItem + + this.toSchemaPointer(pointerArray, schema.items[arrayItem]); + } else if (schema.additionalItems) { + return '/additionalItems' + + this.toSchemaPointer(pointerArray, schema.additionalItems); + } + } else if (isObject(schema.items)) { + return '/items' + this.toSchemaPointer(pointerArray, schema.items); + } else if (isObject(schema.additionalItems)) { + return '/additionalItems' + + this.toSchemaPointer(pointerArray, schema.additionalItems); + } + } + console.error(`toSchemaPointer error: Data pointer ${dataPointer} ` + + `not compatible with schema ${schema}`); + return null; + } + if (!this.isJsonPointer(dataPointer)) { + console.error(`toSchemaPointer error: Invalid JSON Pointer: ${dataPointer}`); + } + if (typeof schema !== 'object') { + console.error(`toSchemaPointer error: Invalid JSON Schema: ${schema}`); + } + return null; + } + + /** + * 'toDataPointer' function + * + * Accepts a JSON Pointer to a sub-schema inside a JSON schema and the schema. + * + * If possible, returns a generic Pointer to the corresponding value inside + * the data object described by the JSON schema. + * + * Returns null if the sub-schema is in an ambiguous location (such as + * definitions or additionalProperties) where the corresponding value + * location cannot be determined. + * + * // { Pointer } schemaPointer - JSON Pointer (string or array) to a JSON schema + * // schema - the JSON schema + * // { boolean = false } errors - Show errors? + * // { Pointer } - JSON Pointer (string) to the value in the data object + */ + static toDataPointer(schemaPointer, schema, errors = false) { + if (this.isJsonPointer(schemaPointer) && typeof schema === 'object' && + this.has(schema, schemaPointer) + ) { + const pointerArray = this.parse(schemaPointer); + if (!pointerArray.length) { return ''; } + const firstKey = pointerArray.shift(); + if (firstKey === 'properties' || + (firstKey === 'items' && isArray(schema.items)) + ) { + const secondKey = pointerArray.shift(); + const pointerSuffix = this.toDataPointer(pointerArray, schema[firstKey][secondKey]); + return pointerSuffix === null ? null : '/' + secondKey + pointerSuffix; + } else if (firstKey === 'additionalItems' || + (firstKey === 'items' && isObject(schema.items)) + ) { + const pointerSuffix = this.toDataPointer(pointerArray, schema[firstKey]); + return pointerSuffix === null ? null : '/-' + pointerSuffix; + } else if (['allOf', 'anyOf', 'oneOf'].includes(firstKey)) { + const secondKey = pointerArray.shift(); + return this.toDataPointer(pointerArray, schema[firstKey][secondKey]); + } else if (firstKey === 'not') { + return this.toDataPointer(pointerArray, schema[firstKey]); + } else if (['contains', 'definitions', 'dependencies', 'additionalItems', + 'additionalProperties', 'patternProperties', 'propertyNames'].includes(firstKey) + ) { + if (errors) { console.error(`toDataPointer error: Ambiguous location`); } + } + return ''; + } + if (errors) { + if (!this.isJsonPointer(schemaPointer)) { + console.error(`toDataPointer error: Invalid JSON Pointer: ${schemaPointer}`); + } + if (typeof schema !== 'object') { + console.error(`toDataPointer error: Invalid JSON Schema: ${schema}`); + } + if (typeof schema !== 'object') { + console.error(`toDataPointer error: Pointer ${schemaPointer} invalid for Schema: ${schema}`); + } + } + return null; + } + + /** + * 'parseObjectPath' function + * + * Parses a JavaScript object path into an array of keys, which + * can then be passed to compile() to convert into a string JSON Pointer. + * + * Based on mike-marcacci's excellent objectpath parse function: + * https://github.com/mike-marcacci/objectpath + * + * // { Pointer } path - The object path to parse + * // { string[] } - The resulting array of keys + */ + static parseObjectPath(path) { + if (isArray(path)) { return path; } + if (this.isJsonPointer(path)) { return this.parse(path); } + if (typeof path === 'string') { + let index = 0; + const parts: string[] = []; + while (index < path.length) { + const nextDot = path.indexOf('.', index); + const nextOB = path.indexOf('[', index); // next open bracket + if (nextDot === -1 && nextOB === -1) { // last item + parts.push(path.slice(index)); + index = path.length; + } else if (nextDot !== -1 && (nextDot < nextOB || nextOB === -1)) { // dot notation + parts.push(path.slice(index, nextDot)); + index = nextDot + 1; + } else { // bracket notation + if (nextOB > index) { + parts.push(path.slice(index, nextOB)); + index = nextOB; + } + const quote = path.charAt(nextOB + 1); + if (quote === '"' || quote === '\'') { // enclosing quotes + let nextCB = path.indexOf(quote + ']', nextOB); // next close bracket + while (nextCB !== -1 && path.charAt(nextCB - 1) === '\\') { + nextCB = path.indexOf(quote + ']', nextCB + 2); + } + if (nextCB === -1) { nextCB = path.length; } + parts.push(path.slice(index + 2, nextCB) + .replace(new RegExp('\\' + quote, 'g'), quote)); + index = nextCB + 2; + } else { // no enclosing quotes + let nextCB = path.indexOf(']', nextOB); // next close bracket + if (nextCB === -1) { nextCB = path.length; } + parts.push(path.slice(index + 1, nextCB)); + index = nextCB + 1; + } + if (path.charAt(index) === '.') { index++; } + } + } + return parts; + } + console.error('parseObjectPath error: Input object path must be a string.'); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/layout.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/layout.functions.ts new file mode 100644 index 000000000..f82f1654f --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/layout.functions.ts @@ -0,0 +1,1067 @@ +import _ from 'lodash'; +import { + checkInlineType, + getFromSchema, + getInputType, + isInputRequired, + removeRecursiveReferences, + updateInputOptions + } from './json-schema.functions'; +import { + copy, + fixTitle, + forEach, + hasOwn + } from './utility.functions'; +import { + inArray, + isArray, + isDefined, + isEmpty, + isNumber, + isObject, + isString + } from './validator.functions'; +import { JsonPointer } from './jsonpointer.functions'; +import { TitleMapItem } from '../json-schema-form.service'; + + + +/** + * Layout function library: + * + * buildLayout: Builds a complete layout from an input layout and schema + * + * buildLayoutFromSchema: Builds a complete layout entirely from an input schema + * + * mapLayout: + * + * getLayoutNode: + * + * buildTitleMap: + */ + +/** + * 'buildLayout' function + * + * // jsf + * // widgetLibrary + * // + */ +export function buildLayout(jsf, widgetLibrary) { + let hasSubmitButton = !JsonPointer.get(jsf, '/formOptions/addSubmit'); + const formLayout = mapLayout(jsf.layout, (layoutItem, index, layoutPointer) => { + const newNode: any = { + _id: _.uniqueId(), + options: {}, + }; + if (isObject(layoutItem)) { + Object.assign(newNode, layoutItem); + Object.keys(newNode) + .filter(option => !inArray(option, [ + '_id', '$ref', 'arrayItem', 'arrayItemType', 'dataPointer', 'dataType', + 'items', 'key', 'name', 'options', 'recursiveReference', 'type', 'widget' + ])) + .forEach(option => { + newNode.options[option] = newNode[option]; + delete newNode[option]; + }); + if (!hasOwn(newNode, 'type') && isString(newNode.widget)) { + newNode.type = newNode.widget; + delete newNode.widget; + } + if (!hasOwn(newNode.options, 'title')) { + if (hasOwn(newNode.options, 'legend')) { + newNode.options.title = newNode.options.legend; + delete newNode.options.legend; + } + } + if (!hasOwn(newNode.options, 'validationMessages')) { + if (hasOwn(newNode.options, 'errorMessages')) { + newNode.options.validationMessages = newNode.options.errorMessages; + delete newNode.options.errorMessages; + + // Convert Angular Schema Form (AngularJS) 'validationMessage' to + // Angular JSON Schema Form 'validationMessages' + // TV4 codes from https://github.com/geraintluff/tv4/blob/master/source/api.js + } else if (hasOwn(newNode.options, 'validationMessage')) { + if (typeof newNode.options.validationMessage === 'string') { + newNode.options.validationMessages = newNode.options.validationMessage; + } else { + newNode.options.validationMessages = {}; + Object.keys(newNode.options.validationMessage).forEach(key => { + const code = key + ''; + const newKey = + code === '0' ? 'type' : + code === '1' ? 'enum' : + code === '100' ? 'multipleOf' : + code === '101' ? 'minimum' : + code === '102' ? 'exclusiveMinimum' : + code === '103' ? 'maximum' : + code === '104' ? 'exclusiveMaximum' : + code === '200' ? 'minLength' : + code === '201' ? 'maxLength' : + code === '202' ? 'pattern' : + code === '300' ? 'minProperties' : + code === '301' ? 'maxProperties' : + code === '302' ? 'required' : + code === '304' ? 'dependencies' : + code === '400' ? 'minItems' : + code === '401' ? 'maxItems' : + code === '402' ? 'uniqueItems' : + code === '500' ? 'format' : code + ''; + newNode.options.validationMessages[newKey] = newNode.options.validationMessage[key]; + }); + } + delete newNode.options.validationMessage; + } + } + } else if (JsonPointer.isJsonPointer(layoutItem)) { + newNode.dataPointer = layoutItem; + } else if (isString(layoutItem)) { + newNode.key = layoutItem; + } else { + console.error('buildLayout error: Form layout element not recognized:'); + console.error(layoutItem); + return null; + } + let nodeSchema: any = null; + + // If newNode does not have a dataPointer, try to find an equivalent + if (!hasOwn(newNode, 'dataPointer')) { + + // If newNode has a key, change it to a dataPointer + if (hasOwn(newNode, 'key')) { + newNode.dataPointer = newNode.key === '*' ? newNode.key : + JsonPointer.compile(JsonPointer.parseObjectPath(newNode.key), '-'); + delete newNode.key; + + // If newNode is an array, search for dataPointer in child nodes + } else if (hasOwn(newNode, 'type') && newNode.type.slice(-5) === 'array') { + const findDataPointer = (items) => { + if (items === null || typeof items !== 'object') { return; } + if (hasOwn(items, 'dataPointer')) { return items.dataPointer; } + if (isArray(items.items)) { + for (const item of items.items) { + if (hasOwn(item, 'dataPointer') && item.dataPointer.indexOf('/-') !== -1) { + return item.dataPointer; + } + if (hasOwn(item, 'items')) { + const searchItem = findDataPointer(item); + if (searchItem) { return searchItem; } + } + } + } + }; + const childDataPointer = findDataPointer(newNode); + if (childDataPointer) { + newNode.dataPointer = + childDataPointer.slice(0, childDataPointer.lastIndexOf('/-')); + } + } + } + + if (hasOwn(newNode, 'dataPointer')) { + if (newNode.dataPointer === '*') { + return buildLayoutFromSchema(jsf, widgetLibrary, jsf.formValues); + } + const nodeValue = + JsonPointer.get(jsf.formValues, newNode.dataPointer.replace(/\/-/g, '/1')); + + // TODO: Create function getFormValues(jsf, dataPointer, forRefLibrary) + // check formOptions.setSchemaDefaults and formOptions.setLayoutDefaults + // then set apropriate values from initialVaues, schema, or layout + + newNode.dataPointer = + JsonPointer.toGenericPointer(newNode.dataPointer, jsf.arrayMap); + const LastKey = JsonPointer.toKey(newNode.dataPointer); + if (!newNode.name && isString(LastKey) && LastKey !== '-') { + newNode.name = LastKey; + } + const shortDataPointer = removeRecursiveReferences( + newNode.dataPointer, jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const recursive = !shortDataPointer.length || + shortDataPointer !== newNode.dataPointer; + let schemaPointer: string; + if (!jsf.dataMap.has(shortDataPointer)) { + jsf.dataMap.set(shortDataPointer, new Map()); + } + const nodeDataMap = jsf.dataMap.get(shortDataPointer); + if (nodeDataMap.has('schemaPointer')) { + schemaPointer = nodeDataMap.get('schemaPointer'); + } else { + schemaPointer = JsonPointer.toSchemaPointer(shortDataPointer, jsf.schema); + nodeDataMap.set('schemaPointer', schemaPointer); + } + nodeDataMap.set('disabled', !!newNode.options.disabled); + nodeSchema = JsonPointer.get(jsf.schema, schemaPointer); + if (nodeSchema) { + if (!hasOwn(newNode, 'type')) { + newNode.type = getInputType(nodeSchema, newNode); + } else if (!widgetLibrary.hasWidget(newNode.type)) { + const oldWidgetType = newNode.type; + newNode.type = getInputType(nodeSchema, newNode); + console.error(`error: widget type "${oldWidgetType}" ` + + `not found in library. Replacing with "${newNode.type}".`); + } else { + newNode.type = checkInlineType(newNode.type, nodeSchema, newNode); + } + if (nodeSchema.type === 'object' && isArray(nodeSchema.required)) { + nodeDataMap.set('required', nodeSchema.required); + } + newNode.dataType = + nodeSchema.type || (hasOwn(nodeSchema, '$ref') ? '$ref' : null); + updateInputOptions(newNode, nodeSchema, jsf); + + // Present checkboxes as single control, rather than array + if (newNode.type === 'checkboxes' && hasOwn(nodeSchema, 'items')) { + updateInputOptions(newNode, nodeSchema.items, jsf); + } else if (newNode.dataType === 'array') { + newNode.options.maxItems = Math.min( + nodeSchema.maxItems || 1000, newNode.options.maxItems || 1000 + ); + newNode.options.minItems = Math.max( + nodeSchema.minItems || 0, newNode.options.minItems || 0 + ); + newNode.options.listItems = Math.max( + newNode.options.listItems || 0, isArray(nodeValue) ? nodeValue.length : 0 + ); + newNode.options.tupleItems = + isArray(nodeSchema.items) ? nodeSchema.items.length : 0; + if (newNode.options.maxItems < newNode.options.tupleItems) { + newNode.options.tupleItems = newNode.options.maxItems; + newNode.options.listItems = 0; + } else if (newNode.options.maxItems < + newNode.options.tupleItems + newNode.options.listItems + ) { + newNode.options.listItems = + newNode.options.maxItems - newNode.options.tupleItems; + } else if (newNode.options.minItems > + newNode.options.tupleItems + newNode.options.listItems + ) { + newNode.options.listItems = + newNode.options.minItems - newNode.options.tupleItems; + } + if (!nodeDataMap.has('maxItems')) { + nodeDataMap.set('maxItems', newNode.options.maxItems); + nodeDataMap.set('minItems', newNode.options.minItems); + nodeDataMap.set('tupleItems', newNode.options.tupleItems); + nodeDataMap.set('listItems', newNode.options.listItems); + } + if (!jsf.arrayMap.has(shortDataPointer)) { + jsf.arrayMap.set(shortDataPointer, newNode.options.tupleItems); + } + } + if (isInputRequired(jsf.schema, schemaPointer)) { + newNode.options.required = true; + jsf.fieldsRequired = true; + } + } else { + // TODO: create item in FormGroup model from layout key (?) + updateInputOptions(newNode, {}, jsf); + } + + if (!newNode.options.title && !/^\d+$/.test(newNode.name)) { + newNode.options.title = fixTitle(newNode.name); + } + + if (hasOwn(newNode.options, 'copyValueTo')) { + if (typeof newNode.options.copyValueTo === 'string') { + newNode.options.copyValueTo = [newNode.options.copyValueTo]; + } + if (isArray(newNode.options.copyValueTo)) { + newNode.options.copyValueTo = newNode.options.copyValueTo.map(item => + JsonPointer.compile(JsonPointer.parseObjectPath(item), '-') + ); + } + } + + newNode.widget = widgetLibrary.getWidget(newNode.type); + nodeDataMap.set('inputType', newNode.type); + nodeDataMap.set('widget', newNode.widget); + + if (newNode.dataType === 'array' && + (hasOwn(newNode, 'items') || hasOwn(newNode, 'additionalItems')) + ) { + const itemRefPointer = removeRecursiveReferences( + newNode.dataPointer + '/-', jsf.dataRecursiveRefMap, jsf.arrayMap + ); + if (!jsf.dataMap.has(itemRefPointer)) { + jsf.dataMap.set(itemRefPointer, new Map()); + } + jsf.dataMap.get(itemRefPointer).set('inputType', 'section'); + + // Fix insufficiently nested array item groups + if (newNode.items.length > 1) { + const arrayItemGroup = []; + for (let i = newNode.items.length - 1; i >= 0; i--) { + const subItem = newNode.items[i]; + if (hasOwn(subItem, 'dataPointer') && + subItem.dataPointer.slice(0, itemRefPointer.length) === itemRefPointer + ) { + const arrayItem = newNode.items.splice(i, 1)[0]; + arrayItem.dataPointer = newNode.dataPointer + '/-' + + arrayItem.dataPointer.slice(itemRefPointer.length); + arrayItemGroup.unshift(arrayItem); + } else { + subItem.arrayItem = true; + // TODO: Check schema to get arrayItemType and removable + subItem.arrayItemType = 'list'; + subItem.removable = newNode.options.removable !== false; + } + } + if (arrayItemGroup.length) { + newNode.items.push({ + _id: _.uniqueId(), + arrayItem: true, + arrayItemType: newNode.options.tupleItems > newNode.items.length ? + 'tuple' : 'list', + items: arrayItemGroup, + options: { removable: newNode.options.removable !== false, }, + dataPointer: newNode.dataPointer + '/-', + type: 'section', + widget: widgetLibrary.getWidget('section'), + }); + } + } else { + // TODO: Fix to hndle multiple items + newNode.items[0].arrayItem = true; + if (!newNode.items[0].dataPointer) { + newNode.items[0].dataPointer = + JsonPointer.toGenericPointer(itemRefPointer, jsf.arrayMap); + } + if (!JsonPointer.has(newNode, '/items/0/options/removable')) { + newNode.items[0].options.removable = true; + } + if (newNode.options.orderable === false) { + newNode.items[0].options.orderable = false; + } + newNode.items[0].arrayItemType = + newNode.options.tupleItems ? 'tuple' : 'list'; + } + + if (isArray(newNode.items)) { + const arrayListItems = + newNode.items.filter(item => item.type !== '$ref').length - + newNode.options.tupleItems; + if (arrayListItems > newNode.options.listItems) { + newNode.options.listItems = arrayListItems; + nodeDataMap.set('listItems', arrayListItems); + } + } + + if (!hasOwn(jsf.layoutRefLibrary, itemRefPointer)) { + jsf.layoutRefLibrary[itemRefPointer] = + _.cloneDeep(newNode.items[newNode.items.length - 1]); + if (recursive) { + jsf.layoutRefLibrary[itemRefPointer].recursiveReference = true; + } + forEach(jsf.layoutRefLibrary[itemRefPointer], (item, key) => { + if (hasOwn(item, '_id')) { item._id = null; } + if (recursive) { + if (hasOwn(item, 'dataPointer')) { + item.dataPointer = item.dataPointer.slice(itemRefPointer.length); + } + } + }, 'top-down'); + } + + // Add any additional default items + if (!newNode.recursiveReference || newNode.options.required) { + const arrayLength = Math.min(Math.max( + newNode.options.tupleItems + newNode.options.listItems, + isArray(nodeValue) ? nodeValue.length : 0 + ), newNode.options.maxItems); + for (let i = newNode.items.length; i < arrayLength; i++) { + newNode.items.push(getLayoutNode({ + $ref: itemRefPointer, + dataPointer: newNode.dataPointer, + recursiveReference: newNode.recursiveReference, + }, jsf, widgetLibrary)); + } + } + + // If needed, add button to add items to array + if (newNode.options.addable !== false && + newNode.options.minItems < newNode.options.maxItems && + (newNode.items[newNode.items.length - 1] || {}).type !== '$ref' + ) { + let buttonText = 'Add'; + if (newNode.options.title) { + if (/^add\b/i.test(newNode.options.title)) { + buttonText = newNode.options.title; + } else { + buttonText += ' ' + newNode.options.title; + } + } else if (newNode.name && !/^\d+$/.test(newNode.name)) { + if (/^add\b/i.test(newNode.name)) { + buttonText += ' ' + fixTitle(newNode.name); + } else { + buttonText = fixTitle(newNode.name); + } + + // If newNode doesn't have a title, look for title of parent array item + } else { + const parentSchema = + getFromSchema(jsf.schema, newNode.dataPointer, 'parentSchema'); + if (hasOwn(parentSchema, 'title')) { + buttonText += ' to ' + parentSchema.title; + } else { + const pointerArray = JsonPointer.parse(newNode.dataPointer); + buttonText += ' to ' + fixTitle(pointerArray[pointerArray.length - 2]); + } + } + newNode.items.push({ + _id: _.uniqueId(), + arrayItem: true, + arrayItemType: 'list', + dataPointer: newNode.dataPointer + '/-', + options: { + listItems: newNode.options.listItems, + maxItems: newNode.options.maxItems, + minItems: newNode.options.minItems, + removable: false, + title: buttonText, + tupleItems: newNode.options.tupleItems, + }, + recursiveReference: recursive, + type: '$ref', + widget: widgetLibrary.getWidget('$ref'), + $ref: itemRefPointer, + }); + if (isString(JsonPointer.get(newNode, '/style/add'))) { + newNode.items[newNode.items.length - 1].options.fieldStyle = + newNode.style.add; + delete newNode.style.add; + if (isEmpty(newNode.style)) { delete newNode.style; } + } + } + } else { + newNode.arrayItem = false; + } + } else if (hasOwn(newNode, 'type') || hasOwn(newNode, 'items')) { + const parentType: string = + JsonPointer.get(jsf.layout, layoutPointer, 0, -2).type; + if (!hasOwn(newNode, 'type')) { + newNode.type = + inArray(parentType, ['tabs', 'tabarray']) ? 'tab' : 'array'; + } + newNode.arrayItem = parentType === 'array'; + newNode.widget = widgetLibrary.getWidget(newNode.type); + updateInputOptions(newNode, {}, jsf); + } + if (newNode.type === 'submit') { hasSubmitButton = true; } + return newNode; + }); + if (jsf.hasRootReference) { + const fullLayout = _.cloneDeep(formLayout); + if (fullLayout[fullLayout.length - 1].type === 'submit') { fullLayout.pop(); } + jsf.layoutRefLibrary[''] = { + _id: null, + dataPointer: '', + dataType: 'object', + items: fullLayout, + name: '', + options: _.cloneDeep(jsf.formOptions.defautWidgetOptions), + recursiveReference: true, + required: false, + type: 'section', + widget: widgetLibrary.getWidget('section'), + }; + } + if (!hasSubmitButton) { + formLayout.push({ + _id: _.uniqueId(), + options: { title: 'Submit' }, + type: 'submit', + widget: widgetLibrary.getWidget('submit'), + }); + } + return formLayout; +} + +/** + * 'buildLayoutFromSchema' function + * + * // jsf - + * // widgetLibrary - + * // nodeValue - + * // { string = '' } schemaPointer - + * // { string = '' } dataPointer - + * // { boolean = false } arrayItem - + * // { string = null } arrayItemType - + * // { boolean = null } removable - + * // { boolean = false } forRefLibrary - + * // { string = '' } dataPointerPrefix - + * // + */ +export function buildLayoutFromSchema( + jsf, widgetLibrary, nodeValue = null, schemaPointer = '', + dataPointer = '', arrayItem = false, arrayItemType: string = null, + removable: boolean = null, forRefLibrary = false, dataPointerPrefix = '' +) { + const schema = JsonPointer.get(jsf.schema, schemaPointer); + if (!hasOwn(schema, 'type') && !hasOwn(schema, '$ref') && + !hasOwn(schema, 'x-schema-form') + ) { return null; } + const newNodeType: string = getInputType(schema); + if (!isDefined(nodeValue) && ( + jsf.formOptions.setSchemaDefaults === true || + (jsf.formOptions.setSchemaDefaults === 'auto' && isEmpty(jsf.formValues)) + )) { + nodeValue = JsonPointer.get(jsf.schema, schemaPointer + '/default'); + } + let newNode: any = { + _id: forRefLibrary ? null : _.uniqueId(), + arrayItem: arrayItem, + dataPointer: JsonPointer.toGenericPointer(dataPointer, jsf.arrayMap), + dataType: schema.type || (hasOwn(schema, '$ref') ? '$ref' : null), + options: {}, + required: isInputRequired(jsf.schema, schemaPointer), + type: newNodeType, + widget: widgetLibrary.getWidget(newNodeType), + }; + const lastDataKey = JsonPointer.toKey(newNode.dataPointer); + if (lastDataKey !== '-') { newNode.name = lastDataKey; } + if (newNode.arrayItem) { + newNode.arrayItemType = arrayItemType; + newNode.options.removable = removable !== false; + } + const shortDataPointer = removeRecursiveReferences( + dataPointerPrefix + dataPointer, jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const recursive = !shortDataPointer.length || + shortDataPointer !== dataPointerPrefix + dataPointer; + if (!jsf.dataMap.has(shortDataPointer)) { + jsf.dataMap.set(shortDataPointer, new Map()); + } + updateInputOptions(newNode, schema, jsf); + const nodeDataMap = jsf.dataMap.get(shortDataPointer); + if (!nodeDataMap.has('inputType')) { + nodeDataMap.set('schemaPointer', schemaPointer); + nodeDataMap.set('inputType', newNode.type); + nodeDataMap.set('widget', newNode.widget); + nodeDataMap.set('disabled', !!newNode.options.disabled); + } + if (!newNode.options.title && newNode.name && !/^\d+$/.test(newNode.name)) { + newNode.options.title = fixTitle(newNode.name); + } + + if (newNode.dataType === 'object') { + if (isArray(schema.required) && !nodeDataMap.has('required')) { + nodeDataMap.set('required', schema.required); + } + if (isObject(schema.properties)) { + const newSection: any[] = []; + const propertyKeys = schema['ui:order'] || Object.keys(schema.properties); + if (propertyKeys.includes('*') && !hasOwn(schema.properties, '*')) { + const unnamedKeys = Object.keys(schema.properties) + .filter(key => !propertyKeys.includes(key)); + for (let i = propertyKeys.length - 1; i >= 0; i--) { + if (propertyKeys[i] === '*') { + propertyKeys.splice(i, 1, ...unnamedKeys); + } + } + } + propertyKeys + .filter(key => hasOwn(schema.properties, key) || + hasOwn(schema, 'additionalProperties') + ) + .forEach(key => { + const keySchemaPointer = hasOwn(schema.properties, key) ? + '/properties/' + key : '/additionalProperties'; + const innerItem = buildLayoutFromSchema( + jsf, widgetLibrary, isObject(nodeValue) ? nodeValue[key] : null, + schemaPointer + keySchemaPointer, + dataPointer + '/' + key, + false, null, null, forRefLibrary, dataPointerPrefix + ); + if (innerItem) { + if (isInputRequired(schema, '/' + key)) { + innerItem.options.required = true; + jsf.fieldsRequired = true; + } + newSection.push(innerItem); + } + }); + if (dataPointer === '' && !forRefLibrary) { + newNode = newSection; + } else { + newNode.items = newSection; + } + } + // TODO: Add patternProperties and additionalProperties inputs? + // ... possibly provide a way to enter both key names and values? + // if (isObject(schema.patternProperties)) { } + // if (isObject(schema.additionalProperties)) { } + + } else if (newNode.dataType === 'array') { + newNode.items = []; + newNode.options.maxItems = Math.min( + schema.maxItems || 1000, newNode.options.maxItems || 1000 + ); + newNode.options.minItems = Math.max( + schema.minItems || 0, newNode.options.minItems || 0 + ); + if (!newNode.options.minItems && isInputRequired(jsf.schema, schemaPointer)) { + newNode.options.minItems = 1; + } + if (!hasOwn(newNode.options, 'listItems')) { newNode.options.listItems = 1; } + newNode.options.tupleItems = isArray(schema.items) ? schema.items.length : 0; + if (newNode.options.maxItems <= newNode.options.tupleItems) { + newNode.options.tupleItems = newNode.options.maxItems; + newNode.options.listItems = 0; + } else if (newNode.options.maxItems < + newNode.options.tupleItems + newNode.options.listItems + ) { + newNode.options.listItems = newNode.options.maxItems - newNode.options.tupleItems; + } else if (newNode.options.minItems > + newNode.options.tupleItems + newNode.options.listItems + ) { + newNode.options.listItems = newNode.options.minItems - newNode.options.tupleItems; + } + if (!nodeDataMap.has('maxItems')) { + nodeDataMap.set('maxItems', newNode.options.maxItems); + nodeDataMap.set('minItems', newNode.options.minItems); + nodeDataMap.set('tupleItems', newNode.options.tupleItems); + nodeDataMap.set('listItems', newNode.options.listItems); + } + if (!jsf.arrayMap.has(shortDataPointer)) { + jsf.arrayMap.set(shortDataPointer, newNode.options.tupleItems); + } + removable = newNode.options.removable !== false; + let additionalItemsSchemaPointer: string = null; + + // If 'items' is an array = tuple items + if (isArray(schema.items)) { + newNode.items = []; + for (let i = 0; i < newNode.options.tupleItems; i++) { + let newItem: any; + const itemRefPointer = removeRecursiveReferences( + shortDataPointer + '/' + i, jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const itemRecursive = !itemRefPointer.length || + itemRefPointer !== shortDataPointer + '/' + i; + + // If removable, add tuple item layout to layoutRefLibrary + if (removable && i >= newNode.options.minItems) { + if (!hasOwn(jsf.layoutRefLibrary, itemRefPointer)) { + // Set to null first to prevent recursive reference from causing endless loop + jsf.layoutRefLibrary[itemRefPointer] = null; + jsf.layoutRefLibrary[itemRefPointer] = buildLayoutFromSchema( + jsf, widgetLibrary, isArray(nodeValue) ? nodeValue[i] : null, + schemaPointer + '/items/' + i, + itemRecursive ? '' : dataPointer + '/' + i, + true, 'tuple', true, true, itemRecursive ? dataPointer + '/' + i : '' + ); + if (itemRecursive) { + jsf.layoutRefLibrary[itemRefPointer].recursiveReference = true; + } + } + newItem = getLayoutNode({ + $ref: itemRefPointer, + dataPointer: dataPointer + '/' + i, + recursiveReference: itemRecursive, + }, jsf, widgetLibrary, isArray(nodeValue) ? nodeValue[i] : null); + } else { + newItem = buildLayoutFromSchema( + jsf, widgetLibrary, isArray(nodeValue) ? nodeValue[i] : null, + schemaPointer + '/items/' + i, + dataPointer + '/' + i, + true, 'tuple', false, forRefLibrary, dataPointerPrefix + ); + } + if (newItem) { newNode.items.push(newItem); } + } + + // If 'additionalItems' is an object = additional list items, after tuple items + if (isObject(schema.additionalItems)) { + additionalItemsSchemaPointer = schemaPointer + '/additionalItems'; + } + + // If 'items' is an object = list items only (no tuple items) + } else if (isObject(schema.items)) { + additionalItemsSchemaPointer = schemaPointer + '/items'; + } + + if (additionalItemsSchemaPointer) { + const itemRefPointer = removeRecursiveReferences( + shortDataPointer + '/-', jsf.dataRecursiveRefMap, jsf.arrayMap + ); + const itemRecursive = !itemRefPointer.length || + itemRefPointer !== shortDataPointer + '/-'; + const itemSchemaPointer = removeRecursiveReferences( + additionalItemsSchemaPointer, jsf.schemaRecursiveRefMap, jsf.arrayMap + ); + // Add list item layout to layoutRefLibrary + if (itemRefPointer.length && !hasOwn(jsf.layoutRefLibrary, itemRefPointer)) { + // Set to null first to prevent recursive reference from causing endless loop + jsf.layoutRefLibrary[itemRefPointer] = null; + jsf.layoutRefLibrary[itemRefPointer] = buildLayoutFromSchema( + jsf, widgetLibrary, null, + itemSchemaPointer, + itemRecursive ? '' : dataPointer + '/-', + true, 'list', removable, true, itemRecursive ? dataPointer + '/-' : '' + ); + if (itemRecursive) { + jsf.layoutRefLibrary[itemRefPointer].recursiveReference = true; + } + } + + // Add any additional default items + if (!itemRecursive || newNode.options.required) { + const arrayLength = Math.min(Math.max( + itemRecursive ? 0 : + newNode.options.tupleItems + newNode.options.listItems, + isArray(nodeValue) ? nodeValue.length : 0 + ), newNode.options.maxItems); + if (newNode.items.length < arrayLength) { + for (let i = newNode.items.length; i < arrayLength; i++) { + newNode.items.push(getLayoutNode({ + $ref: itemRefPointer, + dataPointer: dataPointer + '/-', + recursiveReference: itemRecursive, + }, jsf, widgetLibrary, isArray(nodeValue) ? nodeValue[i] : null)); + } + } + } + + // If needed, add button to add items to array + if (newNode.options.addable !== false && + newNode.options.minItems < newNode.options.maxItems && + (newNode.items[newNode.items.length - 1] || {}).type !== '$ref' + ) { + let buttonText = + ((jsf.layoutRefLibrary[itemRefPointer] || {}).options || {}).title; + const prefix = buttonText ? 'Add ' : 'Add to '; + if (!buttonText) { + buttonText = schema.title || fixTitle(JsonPointer.toKey(dataPointer)); + } + if (!/^add\b/i.test(buttonText)) { buttonText = prefix + buttonText; } + newNode.items.push({ + _id: _.uniqueId(), + arrayItem: true, + arrayItemType: 'list', + dataPointer: newNode.dataPointer + '/-', + options: { + listItems: newNode.options.listItems, + maxItems: newNode.options.maxItems, + minItems: newNode.options.minItems, + removable: false, + title: buttonText, + tupleItems: newNode.options.tupleItems, + }, + recursiveReference: itemRecursive, + type: '$ref', + widget: widgetLibrary.getWidget('$ref'), + $ref: itemRefPointer, + }); + } + } + + } else if (newNode.dataType === '$ref') { + const schemaRef = JsonPointer.compile(schema.$ref); + const dataRef = JsonPointer.toDataPointer(schemaRef, jsf.schema); + let buttonText = ''; + + // Get newNode title + if (newNode.options.add) { + buttonText = newNode.options.add; + } else if (newNode.name && !/^\d+$/.test(newNode.name)) { + buttonText = + (/^add\b/i.test(newNode.name) ? '' : 'Add ') + fixTitle(newNode.name); + + // If newNode doesn't have a title, look for title of parent array item + } else { + const parentSchema = + JsonPointer.get(jsf.schema, schemaPointer, 0, -1); + if (hasOwn(parentSchema, 'title')) { + buttonText = 'Add to ' + parentSchema.title; + } else { + const pointerArray = JsonPointer.parse(newNode.dataPointer); + buttonText = 'Add to ' + fixTitle(pointerArray[pointerArray.length - 2]); + } + } + Object.assign(newNode, { + recursiveReference: true, + widget: widgetLibrary.getWidget('$ref'), + $ref: dataRef, + }); + Object.assign(newNode.options, { + removable: false, + title: buttonText, + }); + if (isNumber(JsonPointer.get(jsf.schema, schemaPointer, 0, -1).maxItems)) { + newNode.options.maxItems = + JsonPointer.get(jsf.schema, schemaPointer, 0, -1).maxItems; + } + + // Add layout template to layoutRefLibrary + if (dataRef.length) { + if (!hasOwn(jsf.layoutRefLibrary, dataRef)) { + // Set to null first to prevent recursive reference from causing endless loop + jsf.layoutRefLibrary[dataRef] = null; + const newLayout = buildLayoutFromSchema( + jsf, widgetLibrary, null, schemaRef, '', + newNode.arrayItem, newNode.arrayItemType, true, true, dataPointer + ); + if (newLayout) { + newLayout.recursiveReference = true; + jsf.layoutRefLibrary[dataRef] = newLayout; + } else { + delete jsf.layoutRefLibrary[dataRef]; + } + } else if (!jsf.layoutRefLibrary[dataRef].recursiveReference) { + jsf.layoutRefLibrary[dataRef].recursiveReference = true; + } + } + } + return newNode; +} + +/** + * 'mapLayout' function + * + * Creates a new layout by running each element in an existing layout through + * an iteratee. Recursively maps within array elements 'items' and 'tabs'. + * The iteratee is invoked with four arguments: (value, index, layout, path) + * + * The returned layout may be longer (or shorter) then the source layout. + * + * If an item from the source layout returns multiple items (as '*' usually will), + * this function will keep all returned items in-line with the surrounding items. + * + * If an item from the source layout causes an error and returns null, it is + * skipped without error, and the function will still return all non-null items. + * + * // layout - the layout to map + * // { (v: any, i?: number, l?: any, p?: string) => any } + * function - the funciton to invoke on each element + * // { string|string[] = '' } layoutPointer - the layoutPointer to layout, inside rootLayout + * // { any[] = layout } rootLayout - the root layout, which conatins layout + * // + */ +export function mapLayout(layout, fn, layoutPointer = '', rootLayout = layout) { + let indexPad = 0; + let newLayout: any[] = []; + forEach(layout, (item, index) => { + const realIndex = +index + indexPad; + const newLayoutPointer = layoutPointer + '/' + realIndex; + let newNode: any = copy(item); + let itemsArray: any[] = []; + if (isObject(item)) { + if (hasOwn(item, 'tabs')) { + item.items = item.tabs; + delete item.tabs; + } + if (hasOwn(item, 'items')) { + itemsArray = isArray(item.items) ? item.items : [item.items]; + } + } + if (itemsArray.length) { + newNode.items = mapLayout(itemsArray, fn, newLayoutPointer + '/items', rootLayout); + } + newNode = fn(newNode, realIndex, newLayoutPointer, rootLayout); + if (!isDefined(newNode)) { + indexPad--; + } else { + if (isArray(newNode)) { indexPad += newNode.length - 1; } + newLayout = newLayout.concat(newNode); + } + }); + return newLayout; +} + +/** + * 'getLayoutNode' function + * Copy a new layoutNode from layoutRefLibrary + * + * // refNode - + * // layoutRefLibrary - + * // { any = null } widgetLibrary - + * // { any = null } nodeValue - + * // copied layoutNode + */ +export function getLayoutNode( + refNode, jsf, widgetLibrary: any = null, nodeValue: any = null +) { + + // If recursive reference and building initial layout, return Add button + if (refNode.recursiveReference && widgetLibrary) { + const newLayoutNode = _.cloneDeep(refNode); + if (!newLayoutNode.options) { newLayoutNode.options = {}; } + Object.assign(newLayoutNode, { + recursiveReference: true, + widget: widgetLibrary.getWidget('$ref'), + }); + Object.assign(newLayoutNode.options, { + removable: false, + title: 'Add ' + newLayoutNode.$ref, + }); + return newLayoutNode; + + // Otherwise, return referenced layout + } else { + let newLayoutNode = jsf.layoutRefLibrary[refNode.$ref]; + // If value defined, build new node from schema (to set array lengths) + if (isDefined(nodeValue)) { + newLayoutNode = buildLayoutFromSchema( + jsf, widgetLibrary, nodeValue, + JsonPointer.toSchemaPointer(refNode.$ref, jsf.schema), + refNode.$ref, newLayoutNode.arrayItem, + newLayoutNode.arrayItemType, newLayoutNode.options.removable, false + ); + } else { + // If value not defined, copy node from layoutRefLibrary + newLayoutNode = _.cloneDeep(newLayoutNode); + JsonPointer.forEachDeep(newLayoutNode, (subNode, pointer) => { + + // Reset all _id's in newLayoutNode to unique values + if (hasOwn(subNode, '_id')) { subNode._id = _.uniqueId(); } + + // If adding a recursive item, prefix current dataPointer + // to all dataPointers in new layoutNode + if (refNode.recursiveReference && hasOwn(subNode, 'dataPointer')) { + subNode.dataPointer = refNode.dataPointer + subNode.dataPointer; + } + }); + } + return newLayoutNode; + } +} + +/** + * 'buildTitleMap' function + * + * // titleMap - + * // enumList - + * // { boolean = true } fieldRequired - + * // { boolean = true } flatList - + * // { TitleMapItem[] } + */ +export function buildTitleMap( + titleMap, enumList, fieldRequired = true, flatList = true +) { + let newTitleMap: TitleMapItem[] = []; + let hasEmptyValue = false; + if (titleMap) { + if (isArray(titleMap)) { + if (enumList) { + for (const i of Object.keys(titleMap)) { + if (isObject(titleMap[i])) { // JSON Form style + const value = titleMap[i].value; + if (enumList.includes(value)) { + const name = titleMap[i].name; + newTitleMap.push({ name, value }); + if (value === undefined || value === null) { hasEmptyValue = true; } + } + } else if (isString(titleMap[i])) { // React Jsonschema Form style + if (i < enumList.length) { + const name = titleMap[i]; + const value = enumList[i]; + newTitleMap.push({ name, value }); + if (value === undefined || value === null) { hasEmptyValue = true; } + } + } + } + } else { // If array titleMap and no enum list, just return the titleMap - Angular Schema Form style + newTitleMap = titleMap; + if (!fieldRequired) { + hasEmptyValue = !!newTitleMap + .filter(i => i.value === undefined || i.value === null) + .length; + } + } + } else if (enumList) { // Alternate JSON Form style, with enum list + for (const i of Object.keys(enumList)) { + const value = enumList[i]; + if (hasOwn(titleMap, value)) { + const name = titleMap[value]; + newTitleMap.push({ name, value }); + if (value === undefined || value === null) { hasEmptyValue = true; } + } + } + } else { // Alternate JSON Form style, without enum list + for (const value of Object.keys(titleMap)) { + const name = titleMap[value]; + newTitleMap.push({ name, value }); + if (value === undefined || value === null) { hasEmptyValue = true; } + } + } + } else if (enumList) { // Build map from enum list alone + for (const i of Object.keys(enumList)) { + const name = enumList[i]; + const value = enumList[i]; + newTitleMap.push({ name, value }); + if (value === undefined || value === null) { hasEmptyValue = true; } + } + } else { // If no titleMap and no enum list, return default map of boolean values + newTitleMap = [{ name: 'True', value: true }, { name: 'False', value: false }]; + } + + // Does titleMap have groups? + if (newTitleMap.some(title => hasOwn(title, 'group'))) { + hasEmptyValue = false; + + // If flatList = true, flatten items & update name to group: name + if (flatList) { + newTitleMap = newTitleMap.reduce((groupTitleMap, title) => { + if (hasOwn(title, 'group')) { + if (isArray(title.items)) { + groupTitleMap = [ + ...groupTitleMap, + ...title.items.map(item => + ({ ...item, ...{ name: `${title.group}: ${item.name}` } }) + ) + ]; + if (title.items.some(item => item.value === undefined || item.value === null)) { + hasEmptyValue = true; + } + } + if (hasOwn(title, 'name') && hasOwn(title, 'value')) { + title.name = `${title.group}: ${title.name}`; + delete title.group; + groupTitleMap.push(title); + if (title.value === undefined || title.value === null) { + hasEmptyValue = true; + } + } + } else { + groupTitleMap.push(title); + if (title.value === undefined || title.value === null) { + hasEmptyValue = true; + } + } + return groupTitleMap; + }, []); + + // If flatList = false, combine items from matching groups + } else { + newTitleMap = newTitleMap.reduce((groupTitleMap, title) => { + if (hasOwn(title, 'group')) { + if (title.group !== (groupTitleMap[groupTitleMap.length - 1] || {}).group) { + groupTitleMap.push({ group: title.group, items: title.items || [] }); + } + if (hasOwn(title, 'name') && hasOwn(title, 'value')) { + groupTitleMap[groupTitleMap.length - 1].items + .push({ name: title.name, value: title.value }); + if (title.value === undefined || title.value === null) { + hasEmptyValue = true; + } + } + } else { + groupTitleMap.push(title); + if (title.value === undefined || title.value === null) { + hasEmptyValue = true; + } + } + return groupTitleMap; + }, []); + } + } + if (!fieldRequired && !hasEmptyValue) { + newTitleMap.unshift({ name: 'None', value: null }); + } + return newTitleMap; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/merge-schemas.function.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/merge-schemas.function.ts new file mode 100644 index 000000000..65256f804 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/merge-schemas.function.ts @@ -0,0 +1,329 @@ +import _ from 'lodash'; + +import { + isArray, isEmpty, isNumber, isObject, isString +} from './validator.functions'; +import { hasOwn, uniqueItems, commonItems } from './utility.functions'; +import { JsonPointer, Pointer } from './jsonpointer.functions'; + +/** + * 'mergeSchemas' function + * + * Merges multiple JSON schemas into a single schema with combined rules. + * + * If able to logically merge properties from all schemas, + * returns a single schema object containing all merged properties. + * + * Example: ({ a: b, max: 1 }, { c: d, max: 2 }) => { a: b, c: d, max: 1 } + * + * If unable to logically merge, returns an allOf schema object containing + * an array of the original schemas; + * + * Example: ({ a: b }, { a: d }) => { allOf: [ { a: b }, { a: d } ] } + * + * // schemas - one or more input schemas + * // - merged schema + */ +export function mergeSchemas(...schemas) { + schemas = schemas.filter(schema => !isEmpty(schema)); + if (schemas.some(schema => !isObject(schema))) { return null; } + const combinedSchema: any = {}; + for (const schema of schemas) { + for (const key of Object.keys(schema)) { + const combinedValue = combinedSchema[key]; + const schemaValue = schema[key]; + if (!hasOwn(combinedSchema, key) || _.isEqual(combinedValue, schemaValue)) { + combinedSchema[key] = schemaValue; + } else { + switch (key) { + case 'allOf': + // Combine all items from both arrays + if (isArray(combinedValue) && isArray(schemaValue)) { + combinedSchema.allOf = mergeSchemas(...combinedValue, ...schemaValue); + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'additionalItems': case 'additionalProperties': + case 'contains': case 'propertyNames': + // Merge schema objects + if (isObject(combinedValue) && isObject(schemaValue)) { + combinedSchema[key] = mergeSchemas(combinedValue, schemaValue); + // additionalProperties == false in any schema overrides all other values + } else if ( + key === 'additionalProperties' && + (combinedValue === false || schemaValue === false) + ) { + combinedSchema.combinedSchema = false; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'anyOf': case 'oneOf': case 'enum': + // Keep only items that appear in both arrays + if (isArray(combinedValue) && isArray(schemaValue)) { + combinedSchema[key] = combinedValue.filter(item1 => + schemaValue.findIndex(item2 => _.isEqual(item1, item2)) > -1 + ); + if (!combinedSchema[key].length) { return { allOf: [ ...schemas ] }; } + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'definitions': + // Combine keys from both objects + if (isObject(combinedValue) && isObject(schemaValue)) { + const combinedObject = { ...combinedValue }; + for (const subKey of Object.keys(schemaValue)) { + if (!hasOwn(combinedObject, subKey) || + _.isEqual(combinedObject[subKey], schemaValue[subKey]) + ) { + combinedObject[subKey] = schemaValue[subKey]; + // Don't combine matching keys with different values + } else { + return { allOf: [ ...schemas ] }; + } + } + combinedSchema.definitions = combinedObject; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'dependencies': + // Combine all keys from both objects + // and merge schemas on matching keys, + // converting from arrays to objects if necessary + if (isObject(combinedValue) && isObject(schemaValue)) { + const combinedObject = { ...combinedValue }; + for (const subKey of Object.keys(schemaValue)) { + if (!hasOwn(combinedObject, subKey) || + _.isEqual(combinedObject[subKey], schemaValue[subKey]) + ) { + combinedObject[subKey] = schemaValue[subKey]; + // If both keys are arrays, include all items from both arrays, + // excluding duplicates + } else if ( + isArray(schemaValue[subKey]) && isArray(combinedObject[subKey]) + ) { + combinedObject[subKey] = + uniqueItems(...combinedObject[subKey], ...schemaValue[subKey]); + // If either key is an object, merge the schemas + } else if ( + (isArray(schemaValue[subKey]) || isObject(schemaValue[subKey])) && + (isArray(combinedObject[subKey]) || isObject(combinedObject[subKey])) + ) { + // If either key is an array, convert it to an object first + const required = isArray(combinedSchema.required) ? + combinedSchema.required : []; + const combinedDependency = isArray(combinedObject[subKey]) ? + { required: uniqueItems(...required, combinedObject[subKey]) } : + combinedObject[subKey]; + const schemaDependency = isArray(schemaValue[subKey]) ? + { required: uniqueItems(...required, schemaValue[subKey]) } : + schemaValue[subKey]; + combinedObject[subKey] = + mergeSchemas(combinedDependency, schemaDependency); + } else { + return { allOf: [ ...schemas ] }; + } + } + combinedSchema.dependencies = combinedObject; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'items': + // If arrays, keep only items that appear in both arrays + if (isArray(combinedValue) && isArray(schemaValue)) { + combinedSchema.items = combinedValue.filter(item1 => + schemaValue.findIndex(item2 => _.isEqual(item1, item2)) > -1 + ); + if (!combinedSchema.items.length) { return { allOf: [ ...schemas ] }; } + // If both keys are objects, merge them + } else if (isObject(combinedValue) && isObject(schemaValue)) { + combinedSchema.items = mergeSchemas(combinedValue, schemaValue); + // If object + array, combine object with each array item + } else if (isArray(combinedValue) && isObject(schemaValue)) { + combinedSchema.items = + combinedValue.map(item => mergeSchemas(item, schemaValue)); + } else if (isObject(combinedValue) && isArray(schemaValue)) { + combinedSchema.items = + schemaValue.map(item => mergeSchemas(item, combinedValue)); + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'multipleOf': + // TODO: Adjust to correctly handle decimal values + // If numbers, set to least common multiple + if (isNumber(combinedValue) && isNumber(schemaValue)) { + const gcd = (x, y) => !y ? x : gcd(y, x % y); + const lcm = (x, y) => (x * y) / gcd(x, y); + combinedSchema.multipleOf = lcm(combinedValue, schemaValue); + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'maximum': case 'exclusiveMaximum': case 'maxLength': + case 'maxItems': case 'maxProperties': + // If numbers, set to lowest value + if (isNumber(combinedValue) && isNumber(schemaValue)) { + combinedSchema[key] = Math.min(combinedValue, schemaValue); + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'minimum': case 'exclusiveMinimum': case 'minLength': + case 'minItems': case 'minProperties': + // If numbers, set to highest value + if (isNumber(combinedValue) && isNumber(schemaValue)) { + combinedSchema[key] = Math.max(combinedValue, schemaValue); + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'not': + // Combine not values into anyOf array + if (isObject(combinedValue) && isObject(schemaValue)) { + const notAnyOf = [combinedValue, schemaValue] + .reduce((notAnyOfArray, notSchema) => + isArray(notSchema.anyOf) && + Object.keys(notSchema).length === 1 ? + [ ...notAnyOfArray, ...notSchema.anyOf ] : + [ ...notAnyOfArray, notSchema ] + , []); + // TODO: Remove duplicate items from array + combinedSchema.not = { anyOf: notAnyOf }; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'patternProperties': + // Combine all keys from both objects + // and merge schemas on matching keys + if (isObject(combinedValue) && isObject(schemaValue)) { + const combinedObject = { ...combinedValue }; + for (const subKey of Object.keys(schemaValue)) { + if (!hasOwn(combinedObject, subKey) || + _.isEqual(combinedObject[subKey], schemaValue[subKey]) + ) { + combinedObject[subKey] = schemaValue[subKey]; + // If both keys are objects, merge them + } else if ( + isObject(schemaValue[subKey]) && isObject(combinedObject[subKey]) + ) { + combinedObject[subKey] = + mergeSchemas(combinedObject[subKey], schemaValue[subKey]); + } else { + return { allOf: [ ...schemas ] }; + } + } + combinedSchema.patternProperties = combinedObject; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'properties': + // Combine all keys from both objects + // unless additionalProperties === false + // and merge schemas on matching keys + if (isObject(combinedValue) && isObject(schemaValue)) { + const combinedObject = { ...combinedValue }; + // If new schema has additionalProperties, + // merge or remove non-matching property keys in combined schema + if (hasOwn(schemaValue, 'additionalProperties')) { + Object.keys(combinedValue) + .filter(combinedKey => !Object.keys(schemaValue).includes(combinedKey)) + .forEach(nonMatchingKey => { + if (schemaValue.additionalProperties === false) { + delete combinedObject[nonMatchingKey]; + } else if (isObject(schemaValue.additionalProperties)) { + combinedObject[nonMatchingKey] = mergeSchemas( + combinedObject[nonMatchingKey], + schemaValue.additionalProperties + ); + } + }); + } + for (const subKey of Object.keys(schemaValue)) { + if (_.isEqual(combinedObject[subKey], schemaValue[subKey]) || ( + !hasOwn(combinedObject, subKey) && + !hasOwn(combinedObject, 'additionalProperties') + )) { + combinedObject[subKey] = schemaValue[subKey]; + // If combined schema has additionalProperties, + // merge or ignore non-matching property keys in new schema + } else if ( + !hasOwn(combinedObject, subKey) && + hasOwn(combinedObject, 'additionalProperties') + ) { + // If combinedObject.additionalProperties === false, + // do nothing (don't set key) + // If additionalProperties is object, merge with new key + if (isObject(combinedObject.additionalProperties)) { + combinedObject[subKey] = mergeSchemas( + combinedObject.additionalProperties, schemaValue[subKey] + ); + } + // If both keys are objects, merge them + } else if ( + isObject(schemaValue[subKey]) && + isObject(combinedObject[subKey]) + ) { + combinedObject[subKey] = + mergeSchemas(combinedObject[subKey], schemaValue[subKey]); + } else { + return { allOf: [ ...schemas ] }; + } + } + combinedSchema.properties = combinedObject; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'required': + // If arrays, include all items from both arrays, excluding duplicates + if (isArray(combinedValue) && isArray(schemaValue)) { + combinedSchema.required = uniqueItems(...combinedValue, ...schemaValue); + // If booleans, aet true if either true + } else if ( + typeof schemaValue === 'boolean' && + typeof combinedValue === 'boolean' + ) { + combinedSchema.required = !!combinedValue || !!schemaValue; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case '$schema': case '$id': case 'id': + // Don't combine these keys + break; + case 'title': case 'description': + // Return the last value, overwriting any previous one + // These properties are not used for validation, so conflicts don't matter + combinedSchema[key] = schemaValue; + break; + case 'type': + if ( + (isArray(schemaValue) || isString(schemaValue)) && + (isArray(combinedValue) || isString(combinedValue)) + ) { + const combinedTypes = commonItems(combinedValue, schemaValue); + if (!combinedTypes.length) { return { allOf: [ ...schemas ] }; } + combinedSchema.type = combinedTypes.length > 1 ? combinedTypes : combinedTypes[0]; + } else { + return { allOf: [ ...schemas ] }; + } + break; + case 'uniqueItems': + // Set true if either true + combinedSchema.uniqueItems = !!combinedValue || !!schemaValue; + break; + default: + return { allOf: [ ...schemas ] }; + } + } + } + } + return combinedSchema; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/utility.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/utility.functions.ts new file mode 100644 index 000000000..bec4edc78 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/utility.functions.ts @@ -0,0 +1,320 @@ +import { + hasValue, + inArray, + isArray, + isDefined, + isEmpty, + isMap, + isObject, + isSet, + isString, + PlainObject + } from './validator.functions'; + +/** + * Utility function library: + * + * addClasses, copy, forEach, forEachCopy, hasOwn, mergeFilteredObject, + * uniqueItems, commonItems, fixTitle, toTitleCase +*/ + +/** + * 'addClasses' function + * + * Merges two space-delimited lists of CSS classes and removes duplicates. + * + * // {string | string[] | Set} oldClasses + * // {string | string[] | Set} newClasses + * // {string | string[] | Set} - Combined classes + */ +export function addClasses( + oldClasses: string | string[] | Set, + newClasses: string | string[] | Set +): string | string[] | Set { + const badType = i => !isSet(i) && !isArray(i) && !isString(i); + if (badType(newClasses)) { return oldClasses; } + if (badType(oldClasses)) { oldClasses = ''; } + const toSet = i => isSet(i) ? i : isArray(i) ? new Set(i) : new Set(i.split(' ')); + const combinedSet: Set = toSet(oldClasses); + const newSet: Set = toSet(newClasses); + newSet.forEach(c => combinedSet.add(c)); + if (isSet(oldClasses)) { return combinedSet; } + if (isArray(oldClasses)) { return Array.from(combinedSet); } + return Array.from(combinedSet).join(' '); +} + +/** + * 'copy' function + * + * Makes a shallow copy of a JavaScript object, array, Map, or Set. + * If passed a JavaScript primitive value (string, number, boolean, or null), + * it returns the value. + * + * // {Object|Array|string|number|boolean|null} object - The object to copy + * // {boolean = false} errors - Show errors? + * // {Object|Array|string|number|boolean|null} - The copied object + */ +export function copy(object: any, errors = false): any { + if (typeof object !== 'object' || object === null) { return object; } + if (isMap(object)) { return new Map(object); } + if (isSet(object)) { return new Set(object); } + if (isArray(object)) { return [ ...object ]; } + if (isObject(object)) { return { ...object }; } + if (errors) { + console.error('copy error: Object to copy must be a JavaScript object or value.'); + } + return object; +} + +/** + * 'forEach' function + * + * Iterates over all items in the first level of an object or array + * and calls an iterator funciton on each item. + * + * The iterator function is called with four values: + * 1. The current item's value + * 2. The current item's key + * 3. The parent object, which contains the current item + * 4. The root object + * + * Setting the optional third parameter to 'top-down' or 'bottom-up' will cause + * it to also recursively iterate over items in sub-objects or sub-arrays in the + * specified direction. + * + * // {Object|Array} object - The object or array to iterate over + * // {function} fn - the iterator funciton to call on each item + * // {boolean = false} errors - Show errors? + * // {void} + */ +export function forEach( + object: any, fn: (v: any, k?: string | number, c?: any, rc?: any) => any, + recurse: boolean | string = false, rootObject: any = object, errors = false +): void { + if (isEmpty(object)) { return; } + if ((isObject(object) || isArray(object)) && typeof fn === 'function') { + for (const key of Object.keys(object)) { + const value = object[key]; + if (recurse === 'bottom-up' && (isObject(value) || isArray(value))) { + forEach(value, fn, recurse, rootObject); + } + fn(value, key, object, rootObject); + if (recurse === 'top-down' && (isObject(value) || isArray(value))) { + forEach(value, fn, recurse, rootObject); + } + } + } + if (errors) { + if (typeof fn !== 'function') { + console.error('forEach error: Iterator must be a function.'); + console.error('function', fn); + } + if (!isObject(object) && !isArray(object)) { + console.error('forEach error: Input object must be an object or array.'); + console.error('object', object); + } + } +} + +/** + * 'forEachCopy' function + * + * Iterates over all items in the first level of an object or array + * and calls an iterator function on each item. Returns a new object or array + * with the same keys or indexes as the original, and values set to the results + * of the iterator function. + * + * Does NOT recursively iterate over items in sub-objects or sub-arrays. + * + * // {Object | Array} object - The object or array to iterate over + * // {function} fn - The iterator funciton to call on each item + * // {boolean = false} errors - Show errors? + * // {Object | Array} - The resulting object or array + */ +export function forEachCopy( + object: any, fn: (v: any, k?: string | number, o?: any, p?: string) => any, + errors = false +): any { + if (!hasValue(object)) { return; } + if ((isObject(object) || isArray(object)) && typeof object !== 'function') { + const newObject: any = isArray(object) ? [] : {}; + for (const key of Object.keys(object)) { + newObject[key] = fn(object[key], key, object); + } + return newObject; + } + if (errors) { + if (typeof fn !== 'function') { + console.error('forEachCopy error: Iterator must be a function.'); + console.error('function', fn); + } + if (!isObject(object) && !isArray(object)) { + console.error('forEachCopy error: Input object must be an object or array.'); + console.error('object', object); + } + } +} + +/** + * 'hasOwn' utility function + * + * Checks whether an object or array has a particular property. + * + * // {any} object - the object to check + * // {string} property - the property to look for + * // {boolean} - true if object has property, false if not + */ +export function hasOwn(object: any, property: string): boolean { + if (!object || !['number', 'string', 'symbol'].includes(typeof property) || + (!isObject(object) && !isArray(object) && !isMap(object) && !isSet(object)) + ) { return false; } + if (isMap(object) || isSet(object)) { return object.has(property); } + if (typeof property === 'number') { + if (isArray(object)) { return object[property]; } + property = property + ''; + } + return object.hasOwnProperty(property); +} + +/** + * 'mergeFilteredObject' utility function + * + * Shallowly merges two objects, setting key and values from source object + * in target object, excluding specified keys. + * + * Optionally, it can also use functions to transform the key names and/or + * the values of the merging object. + * + * // {PlainObject} targetObject - Target object to add keys and values to + * // {PlainObject} sourceObject - Source object to copy keys and values from + * // {string[]} excludeKeys - Array of keys to exclude + * // {(string: string) => string = (k) => k} keyFn - Function to apply to keys + * // {(any: any) => any = (v) => v} valueFn - Function to apply to values + * // {PlainObject} - Returns targetObject + */ +export function mergeFilteredObject( + targetObject: PlainObject, + sourceObject: PlainObject, + excludeKeys = [], + keyFn = (key: string): string => key, + valFn = (val: any): any => val +): PlainObject { + if (!isObject(sourceObject)) { return targetObject; } + if (!isObject(targetObject)) { targetObject = {}; } + for (const key of Object.keys(sourceObject)) { + if (!inArray(key, excludeKeys) && isDefined(sourceObject[key])) { + targetObject[keyFn(key)] = valFn(sourceObject[key]); + } + } + return targetObject; +} + +/** + * 'uniqueItems' function + * + * Accepts any number of string value inputs, + * and returns an array of all input vaues, excluding duplicates. + * + * // {...string} ...items - + * // {string[]} - + */ +export function uniqueItems(...items): string[] { + const returnItems = []; + for (const item of items) { + if (!returnItems.includes(item)) { returnItems.push(item); } + } + return returnItems; +} + +/** + * 'commonItems' function + * + * Accepts any number of strings or arrays of string values, + * and returns a single array containing only values present in all inputs. + * + * // {...string|string[]} ...arrays - + * // {string[]} - + */ +export function commonItems(...arrays): string[] { + let returnItems = null; + for (let array of arrays) { + if (isString(array)) { array = [array]; } + returnItems = returnItems === null ? [ ...array ] : + returnItems.filter(item => array.includes(item)); + if (!returnItems.length) { return []; } + } + return returnItems; +} + +/** + * 'fixTitle' function + * + * + * // {string} input - + * // {string} - + */ +export function fixTitle(name: string): string { + return name && toTitleCase(name.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/_/g, ' ')); +} + +/** + * 'toTitleCase' function + * + * Intelligently converts an input string to Title Case. + * + * Accepts an optional second parameter with a list of additional + * words and abbreviations to force into a particular case. + * + * This function is built on prior work by John Gruber and David Gouch: + * http://daringfireball.net/2008/08/title_case_update + * https://github.com/gouch/to-title-case + * + * // {string} input - + * // {string|string[]} forceWords? - + * // {string} - + */ +export function toTitleCase(input: string, forceWords?: string|string[]): string { + if (!isString(input)) { return input; } + let forceArray: string[] = ['a', 'an', 'and', 'as', 'at', 'but', 'by', 'en', + 'for', 'if', 'in', 'nor', 'of', 'on', 'or', 'per', 'the', 'to', 'v', 'v.', + 'vs', 'vs.', 'via']; + if (isString(forceWords)) { forceWords = (forceWords).split('|'); } + if (isArray(forceWords)) { forceArray = forceArray.concat(forceWords); } + const forceArrayLower: string[] = forceArray.map(w => w.toLowerCase()); + const noInitialCase: boolean = + input === input.toUpperCase() || input === input.toLowerCase(); + let prevLastChar = ''; + input = input.trim(); + return input.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, (word, idx) => { + if (!noInitialCase && word.slice(1).search(/[A-Z]|\../) !== -1) { + return word; + } else { + let newWord: string; + const forceWord: string = + forceArray[forceArrayLower.indexOf(word.toLowerCase())]; + if (!forceWord) { + if (noInitialCase) { + if (word.slice(1).search(/\../) !== -1) { + newWord = word.toLowerCase(); + } else { + newWord = word[0].toUpperCase() + word.slice(1).toLowerCase(); + } + } else { + newWord = word[0].toUpperCase() + word.slice(1); + } + } else if ( + forceWord === forceWord.toLowerCase() && ( + idx === 0 || idx + word.length === input.length || + prevLastChar === ':' || input[idx - 1].search(/[^\s-]/) !== -1 || + (input[idx - 1] !== '-' && input[idx + word.length] === '-') + ) + ) { + newWord = forceWord[0].toUpperCase() + forceWord.slice(1); + } else { + newWord = forceWord; + } + prevLastChar = word.slice(-1); + return newWord; + } + }); +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/shared/validator.functions.ts b/frontend/projects/angular7-json-schema-form/src/lib/shared/validator.functions.ts new file mode 100644 index 000000000..0ca7844a4 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/shared/validator.functions.ts @@ -0,0 +1,591 @@ +import { AbstractControl } from '@angular/forms'; +import { from, Observable } from 'rxjs'; + +/** + * Validator utility function library: + * + * Validator and error utilities: + * _executeValidators, _executeAsyncValidators, _mergeObjects, _mergeErrors + * + * Individual value checking: + * isDefined, hasValue, isEmpty + * + * Individual type checking: + * isString, isNumber, isInteger, isBoolean, isFunction, isObject, isArray, + * isMap, isSet, isPromise, isObservable + * + * Multiple type checking and fixing: + * getType, isType, isPrimitive, toJavaScriptType, toSchemaType, + * _toPromise, toObservable + * + * Utility functions: + * inArray, xor + * + * Typescript types and interfaces: + * SchemaPrimitiveType, SchemaType, JavaScriptPrimitiveType, JavaScriptType, + * PrimitiveValue, PlainObject, IValidatorFn, AsyncIValidatorFn + * + * Note: 'IValidatorFn' is short for 'invertable validator function', + * which is a validator functions that accepts an optional second + * argument which, if set to TRUE, causes the validator to perform + * the opposite of its original function. + */ + +export type SchemaPrimitiveType = + 'string' | 'number' | 'integer' | 'boolean' | 'null'; +export type SchemaType = + 'string' | 'number' | 'integer' | 'boolean' | 'null' | 'object' | 'array'; +export type JavaScriptPrimitiveType = + 'string' | 'number' | 'boolean' | 'null' | 'undefined'; +export type JavaScriptType = + 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'object' | 'array' | + 'map' | 'set' | 'arguments' | 'date' | 'error' | 'function' | 'json' | + 'math' | 'regexp'; // Note: this list is incomplete +export type PrimitiveValue = string | number | boolean | null | undefined; +export interface PlainObject { [k: string]: any; } + +export type IValidatorFn = (c: AbstractControl, i?: boolean) => PlainObject; +export type AsyncIValidatorFn = (c: AbstractControl, i?: boolean) => any; + +/** + * '_executeValidators' utility function + * + * Validates a control against an array of validators, and returns + * an array of the same length containing a combination of error messages + * (from invalid validators) and null values (from valid validators) + * + * // { AbstractControl } control - control to validate + * // { IValidatorFn[] } validators - array of validators + * // { boolean } invert - invert? + * // { PlainObject[] } - array of nulls and error message + */ +export function _executeValidators(control, validators, invert = false) { + return validators.map(validator => validator(control, invert)); +} + +/** + * '_executeAsyncValidators' utility function + * + * Validates a control against an array of async validators, and returns + * an array of observabe results of the same length containing a combination of + * error messages (from invalid validators) and null values (from valid ones) + * + * // { AbstractControl } control - control to validate + * // { AsyncIValidatorFn[] } validators - array of async validators + * // { boolean } invert - invert? + * // - array of observable nulls and error message + */ +export function _executeAsyncValidators(control, validators, invert = false) { + return validators.map(validator => validator(control, invert)); +} + +/** + * '_mergeObjects' utility function + * + * Recursively Merges one or more objects into a single object with combined keys. + * Automatically detects and ignores null and undefined inputs. + * Also detects duplicated boolean 'not' keys and XORs their values. + * + * // { PlainObject[] } objects - one or more objects to merge + * // { PlainObject } - merged object + */ +export function _mergeObjects(...objects) { + const mergedObject: PlainObject = { }; + for (const currentObject of objects) { + if (isObject(currentObject)) { + for (const key of Object.keys(currentObject)) { + const currentValue = currentObject[key]; + const mergedValue = mergedObject[key]; + mergedObject[key] = !isDefined(mergedValue) ? currentValue : + key === 'not' && isBoolean(mergedValue, 'strict') && + isBoolean(currentValue, 'strict') ? xor(mergedValue, currentValue) : + getType(mergedValue) === 'object' && getType(currentValue) === 'object' ? + _mergeObjects(mergedValue, currentValue) : + currentValue; + } + } + } + return mergedObject; +} + +/** + * '_mergeErrors' utility function + * + * Merges an array of objects. + * Used for combining the validator errors returned from 'executeValidators' + * + * // { PlainObject[] } arrayOfErrors - array of objects + * // { PlainObject } - merged object, or null if no usable input objectcs + */ +export function _mergeErrors(arrayOfErrors) { + const mergedErrors = _mergeObjects(...arrayOfErrors); + return isEmpty(mergedErrors) ? null : mergedErrors; +} + +/** + * 'isDefined' utility function + * + * Checks if a variable contains a value of any type. + * Returns true even for otherwise 'falsey' values of 0, '', and false. + * + * // value - the value to check + * // { boolean } - false if undefined or null, otherwise true + */ +export function isDefined(value) { + return value !== undefined && value !== null; +} + +/** + * 'hasValue' utility function + * + * Checks if a variable contains a value. + * Returs false for null, undefined, or a zero-length strng, '', + * otherwise returns true. + * (Stricter than 'isDefined' because it also returns false for '', + * though it stil returns true for otherwise 'falsey' values 0 and false.) + * + * // value - the value to check + * // { boolean } - false if undefined, null, or '', otherwise true + */ +export function hasValue(value) { + return value !== undefined && value !== null && value !== ''; +} + +/** + * 'isEmpty' utility function + * + * Similar to !hasValue, but also returns true for empty arrays and objects. + * + * // value - the value to check + * // { boolean } - false if undefined, null, or '', otherwise true + */ +export function isEmpty(value) { + if (isArray(value)) { return !value.length; } + if (isObject(value)) { return !Object.keys(value).length; } + return value === undefined || value === null || value === ''; +} + +/** + * 'isString' utility function + * + * Checks if a value is a string. + * + * // value - the value to check + * // { boolean } - true if string, false if not + */ +export function isString(value) { + return typeof value === 'string'; +} + +/** + * 'isNumber' utility function + * + * Checks if a value is a regular number, numeric string, or JavaScript Date. + * + * // value - the value to check + * // { any = false } strict - if truthy, also checks JavaScript tyoe + * // { boolean } - true if number, false if not + */ +export function isNumber(value, strict: any = false) { + if (strict && typeof value !== 'number') { return false; } + return !isNaN(value) && value !== value / 0; +} + +/** + * 'isInteger' utility function + * + * Checks if a value is an integer. + * + * // value - the value to check + * // { any = false } strict - if truthy, also checks JavaScript tyoe + * // {boolean } - true if number, false if not + */ +export function isInteger(value, strict: any = false) { + if (strict && typeof value !== 'number') { return false; } + return !isNaN(value) && value !== value / 0 && value % 1 === 0; +} + +/** + * 'isBoolean' utility function + * + * Checks if a value is a boolean. + * + * // value - the value to check + * // { any = null } option - if 'strict', also checks JavaScript type + * if TRUE or FALSE, checks only for that value + * // { boolean } - true if boolean, false if not + */ +export function isBoolean(value, option: any = null) { + if (option === 'strict') { return value === true || value === false; } + if (option === true) { + return value === true || value === 1 || value === 'true' || value === '1'; + } + if (option === false) { + return value === false || value === 0 || value === 'false' || value === '0'; + } + return value === true || value === 1 || value === 'true' || value === '1' || + value === false || value === 0 || value === 'false' || value === '0'; +} + +export function isFunction(item: any): boolean { + return typeof item === 'function'; +} + +export function isObject(item: any): boolean { + return item !== null && typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Object]'; +} + +export function isArray(item: any): boolean { + return Array.isArray(item) || + Object.prototype.toString.call(item) === '[object Array]'; +} + +export function isDate(item: any): boolean { + return typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Date]'; +} + +export function isMap(item: any): boolean { + return typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Map]'; +} + +export function isSet(item: any): boolean { + return typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Set]'; +} + +export function isSymbol(item: any): boolean { + return typeof item === 'symbol'; +} + +/** + * 'getType' function + * + * Detects the JSON Schema Type of a value. + * By default, detects numbers and integers even if formatted as strings. + * (So all integers are also numbers, and any number may also be a string.) + * However, it only detects true boolean values (to detect boolean values + * in non-boolean formats, use isBoolean() instead). + * + * If passed a second optional parameter of 'strict', it will only detect + * numbers and integers if they are formatted as JavaScript numbers. + * + * Examples: + * getType('10.5') = 'number' + * getType(10.5) = 'number' + * getType('10') = 'integer' + * getType(10) = 'integer' + * getType('true') = 'string' + * getType(true) = 'boolean' + * getType(null) = 'null' + * getType({ }) = 'object' + * getType([]) = 'array' + * + * getType('10.5', 'strict') = 'string' + * getType(10.5, 'strict') = 'number' + * getType('10', 'strict') = 'string' + * getType(10, 'strict') = 'integer' + * getType('true', 'strict') = 'string' + * getType(true, 'strict') = 'boolean' + * + * // value - value to check + * // { any = false } strict - if truthy, also checks JavaScript tyoe + * // { SchemaType } + */ +export function getType(value, strict: any = false) { + if (!isDefined(value)) { return 'null'; } + if (isArray(value)) { return 'array'; } + if (isObject(value)) { return 'object'; } + if (isBoolean(value, 'strict')) { return 'boolean'; } + if (isInteger(value, strict)) { return 'integer'; } + if (isNumber(value, strict)) { return 'number'; } + if (isString(value) || (!strict && isDate(value))) { return 'string'; } + return null; +} + +/** + * 'isType' function + * + * Checks wether an input (probably string) value contains data of + * a specified JSON Schema type + * + * // { PrimitiveValue } value - value to check + * // { SchemaPrimitiveType } type - type to check + * // { boolean } + */ +export function isType(value, type) { + switch (type) { + case 'string': + return isString(value) || isDate(value); + case 'number': + return isNumber(value); + case 'integer': + return isInteger(value); + case 'boolean': + return isBoolean(value); + case 'null': + return !hasValue(value); + default: + console.error(`isType error: "${type}" is not a recognized type.`); + return null; + } +} + +/** + * 'isPrimitive' function + * + * Checks wether an input value is a JavaScript primitive type: + * string, number, boolean, or null. + * + * // value - value to check + * // { boolean } + */ +export function isPrimitive(value) { + return (isString(value) || isNumber(value) || + isBoolean(value, 'strict') || value === null); +} + +/** + * 'toJavaScriptType' function + * + * Converts an input (probably string) value to a JavaScript primitive type - + * 'string', 'number', 'boolean', or 'null' - before storing in a JSON object. + * + * Does not coerce values (other than null), and only converts the types + * of values that would otherwise be valid. + * + * If the optional third parameter 'strictIntegers' is TRUE, and the + * JSON Schema type 'integer' is specified, it also verifies the input value + * is an integer and, if it is, returns it as a JaveScript number. + * If 'strictIntegers' is FALSE (or not set) the type 'integer' is treated + * exactly the same as 'number', and allows decimals. + * + * Valid Examples: + * toJavaScriptType('10', 'number' ) = 10 // '10' is a number + * toJavaScriptType('10', 'integer') = 10 // '10' is also an integer + * toJavaScriptType( 10, 'integer') = 10 // 10 is still an integer + * toJavaScriptType( 10, 'string' ) = '10' // 10 can be made into a string + * toJavaScriptType('10.5', 'number' ) = 10.5 // '10.5' is a number + * + * Invalid Examples: + * toJavaScriptType('10.5', 'integer') = null // '10.5' is not an integer + * toJavaScriptType( 10.5, 'integer') = null // 10.5 is still not an integer + * + * // { PrimitiveValue } value - value to convert + * // { SchemaPrimitiveType | SchemaPrimitiveType[] } types - types to convert to + * // { boolean = false } strictIntegers - if FALSE, treat integers as numbers + * // { PrimitiveValue } + */ +export function toJavaScriptType(value, types, strictIntegers = true) { + if (!isDefined(value)) { return null; } + if (isString(types)) { types = [types]; } + if (strictIntegers && inArray('integer', types)) { + if (isInteger(value, 'strict')) { return value; } + if (isInteger(value)) { return parseInt(value, 10); } + } + if (inArray('number', types) || (!strictIntegers && inArray('integer', types))) { + if (isNumber(value, 'strict')) { return value; } + if (isNumber(value)) { return parseFloat(value); } + } + if (inArray('string', types)) { + if (isString(value)) { return value; } + // If value is a date, and types includes 'string', + // convert the date to a string + if (isDate(value)) { return value.toISOString().slice(0, 10); } + if (isNumber(value)) { return value.toString(); } + } + // If value is a date, and types includes 'integer' or 'number', + // but not 'string', convert the date to a number + if (isDate(value) && (inArray('integer', types) || inArray('number', types))) { + return value.getTime(); + } + if (inArray('boolean', types)) { + if (isBoolean(value, true)) { return true; } + if (isBoolean(value, false)) { return false; } + } + return null; +} + +/** + * 'toSchemaType' function + * + * Converts an input (probably string) value to the "best" JavaScript + * equivalent available from an allowed list of JSON Schema types, which may + * contain 'string', 'number', 'integer', 'boolean', and/or 'null'. + * If necssary, it does progressively agressive type coersion. + * It will not return null unless null is in the list of allowed types. + * + * Number conversion examples: + * toSchemaType('10', ['number','integer','string']) = 10 // integer + * toSchemaType('10', ['number','string']) = 10 // number + * toSchemaType('10', ['string']) = '10' // string + * toSchemaType('10.5', ['number','integer','string']) = 10.5 // number + * toSchemaType('10.5', ['integer','string']) = '10.5' // string + * toSchemaType('10.5', ['integer']) = 10 // integer + * toSchemaType(10.5, ['null','boolean','string']) = '10.5' // string + * toSchemaType(10.5, ['null','boolean']) = true // boolean + * + * String conversion examples: + * toSchemaType('1.5x', ['boolean','number','integer','string']) = '1.5x' // string + * toSchemaType('1.5x', ['boolean','number','integer']) = '1.5' // number + * toSchemaType('1.5x', ['boolean','integer']) = '1' // integer + * toSchemaType('1.5x', ['boolean']) = true // boolean + * toSchemaType('xyz', ['number','integer','boolean','null']) = true // boolean + * toSchemaType('xyz', ['number','integer','null']) = null // null + * toSchemaType('xyz', ['number','integer']) = 0 // number + * + * Boolean conversion examples: + * toSchemaType('1', ['integer','number','string','boolean']) = 1 // integer + * toSchemaType('1', ['number','string','boolean']) = 1 // number + * toSchemaType('1', ['string','boolean']) = '1' // string + * toSchemaType('1', ['boolean']) = true // boolean + * toSchemaType('true', ['number','string','boolean']) = 'true' // string + * toSchemaType('true', ['boolean']) = true // boolean + * toSchemaType('true', ['number']) = 0 // number + * toSchemaType(true, ['number','string','boolean']) = true // boolean + * toSchemaType(true, ['number','string']) = 'true' // string + * toSchemaType(true, ['number']) = 1 // number + * + * // { PrimitiveValue } value - value to convert + * // { SchemaPrimitiveType | SchemaPrimitiveType[] } types - allowed types to convert to + * // { PrimitiveValue } + */ +export function toSchemaType(value, types) { + if (!isArray(types)) { + types = [types]; + } + if ((types).includes('null') && !hasValue(value)) { + return null; + } + if ((types).includes('boolean') && !isBoolean(value, 'strict')) { + return value; + } + if ((types).includes('integer')) { + const testValue = toJavaScriptType(value, 'integer'); + if (testValue !== null) { return +testValue; } + } + if ((types).includes('number')) { + const testValue = toJavaScriptType(value, 'number'); + if (testValue !== null) { return +testValue; } + } + if ( + (isString(value) || isNumber(value, 'strict')) && + (types).includes('string') + ) { // Convert number to string + return toJavaScriptType(value, 'string'); + } + if ((types).includes('boolean') && isBoolean(value)) { + return toJavaScriptType(value, 'boolean'); + } + if ((types).includes('string')) { // Convert null & boolean to string + if (value === null) { return ''; } + const testValue = toJavaScriptType(value, 'string'); + if (testValue !== null) { return testValue; } + } + if (( + (types).includes('number') || + (types).includes('integer')) + ) { + if (value === true) { return 1; } // Convert boolean & null to number + if (value === false || value === null || value === '') { return 0; } + } + if ((types).includes('number')) { // Convert mixed string to number + const testValue = parseFloat(value); + if (!!testValue) { return testValue; } + } + if ((types).includes('integer')) { // Convert string or number to integer + const testValue = parseInt(value, 10); + if (!!testValue) { return testValue; } + } + if ((types).includes('boolean')) { // Convert anything to boolean + return !!value; + } + if (( + (types).includes('number') || + (types).includes('integer') + ) && !(types).includes('null') + ) { + return 0; // If null not allowed, return 0 for non-convertable values + } +} + +/** + * 'isPromise' function + * + * // object + * // { boolean } + */ +export function isPromise(object): object is Promise { + return !!object && typeof object.then === 'function'; +} + +/** + * 'isObservable' function + * + * // object + * // { boolean } + */ +export function isObservable(object): object is Observable { + return !!object && typeof object.subscribe === 'function'; +} + +/** + * '_toPromise' function + * + * // { object } object + * // { Promise } + */ +export function _toPromise(object): Promise { + return isPromise(object) ? object : object.toPromise(); +} + +/** + * 'toObservable' function + * + * // { object } object + * // { Observable } + */ +export function toObservable(object): Observable { + const observable = isPromise(object) ? from(object) : object; + if (isObservable(observable)) { return observable; } + console.error('toObservable error: Expected validator to return Promise or Observable.'); + return new Observable(); +} + +/** + * 'inArray' function + * + * Searches an array for an item, or one of a list of items, and returns true + * as soon as a match is found, or false if no match. + * + * If the optional third parameter allIn is set to TRUE, and the item to find + * is an array, then the function returns true only if all elements from item + * are found in the array list, and false if any element is not found. If the + * item to find is not an array, setting allIn to TRUE has no effect. + * + * // { any|any[] } item - the item to search for + * // array - the array to search + * // { boolean = false } allIn - if TRUE, all items must be in array + * // { boolean } - true if item(s) in array, false otherwise + */ +export function inArray(item, array, allIn = false) { + if (!isDefined(item) || !isArray(array)) { return false; } + return isArray(item) ? + item[allIn ? 'every' : 'some'](subItem => array.includes(subItem)) : + array.includes(item); +} + +/** + * 'xor' utility function - exclusive or + * + * Returns true if exactly one of two values is truthy. + * + * // value1 - first value to check + * // value2 - second value to check + * // { boolean } - true if exactly one input value is truthy, false if not + */ +export function xor(value1, value2) { + return (!!value1 && !value2) || (!value1 && !!value2); +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/add-reference.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/add-reference.component.ts new file mode 100644 index 000000000..c417bc217 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/add-reference.component.ts @@ -0,0 +1,59 @@ +import { + ChangeDetectionStrategy, + Component, + Input, + OnInit + } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'add-reference-widget', + template: ` + `, + changeDetection: ChangeDetectionStrategy.Default, +}) +export class AddReferenceComponent implements OnInit { + options: any; + itemCount: number; + previousLayoutIndex: number[]; + previousDataIndex: number[]; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + } + + get showAddButton(): boolean { + return !this.layoutNode.arrayItem || + this.layoutIndex[this.layoutIndex.length - 1] < this.options.maxItems; + } + + addItem(event) { + event.preventDefault(); + this.jsf.addItem(this); + } + + get buttonText(): string { + const parent: any = { + dataIndex: this.dataIndex.slice(0, -1), + layoutIndex: this.layoutIndex.slice(0, -1), + layoutNode: this.jsf.getParentNode(this) + }; + return parent.layoutNode.add || + this.jsf.setArrayItemTitle(parent, this.layoutNode, this.itemCount); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/button.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/button.component.ts new file mode 100644 index 000000000..96570bcbb --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/button.component.ts @@ -0,0 +1,54 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'button-widget', + template: ` +
+ +
`, +}) +export class ButtonComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + if (typeof this.options.onClick === 'function') { + this.options.onClick(event); + } else { + this.jsf.updateValue(this, event.target.value); + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkbox.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkbox.component.ts new file mode 100644 index 000000000..ffd37c311 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkbox.component.ts @@ -0,0 +1,74 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'checkbox-widget', + template: ` + `, +}) +export class CheckboxComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + trueValue: any = true; + falseValue: any = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (this.controlValue === null || this.controlValue === undefined) { + this.controlValue = this.options.title; + } + } + + updateValue(event) { + event.preventDefault(); + this.jsf.updateValue(this, event.target.checked ? this.trueValue : this.falseValue); + } + + get isChecked() { + return this.jsf.getFormControlValue(this) === this.trueValue; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkboxes.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkboxes.component.ts new file mode 100644 index 000000000..7f8bfa17d --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/checkboxes.component.ts @@ -0,0 +1,104 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap } from '../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService, TitleMapItem } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'checkboxes-widget', + template: ` + + + +
+ +
+ + +
+
+ +
+
`, +}) +export class CheckboxesComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + layoutOrientation: string; + formArray: AbstractControl; + checkboxList: TitleMapItem[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.layoutOrientation = (this.layoutNode.type === 'checkboxes-inline' || + this.layoutNode.type === 'checkboxbuttons') ? 'horizontal' : 'vertical'; + this.jsf.initializeControl(this); + this.checkboxList = buildTitleMap( + this.options.titleMap || this.options.enumNames, this.options.enum, true + ); + if (this.boundControl) { + const formArray = this.jsf.getFormControl(this); + this.checkboxList.forEach(checkboxItem => + checkboxItem.checked = formArray.value.includes(checkboxItem.value) + ); + } + } + + updateValue(event) { + for (const checkboxItem of this.checkboxList) { + if (event.target.value === checkboxItem.value) { + checkboxItem.checked = event.target.checked; + } + } + if (this.boundControl) { + this.jsf.updateArrayCheckboxList(this, this.checkboxList); + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/file.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/file.component.ts new file mode 100644 index 000000000..ec4a52b90 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/file.component.ts @@ -0,0 +1,36 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'file-widget', + template: ``, +}) +export class FileComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/hidden.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/hidden.component.ts new file mode 100644 index 000000000..358625af0 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/hidden.component.ts @@ -0,0 +1,39 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'hidden-widget', + template: ` + + `, +}) +export class HiddenComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.jsf.initializeControl(this); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/index.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/index.ts new file mode 100644 index 000000000..6d9c9023c --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/index.ts @@ -0,0 +1,56 @@ +import { AddReferenceComponent } from './add-reference.component'; +import { ButtonComponent } from './button.component'; +import { CheckboxComponent } from './checkbox.component'; +import { CheckboxesComponent } from './checkboxes.component'; +import { FileComponent } from './file.component'; +import { HiddenComponent } from './hidden.component'; +import { InputComponent } from './input.component'; +import { MessageComponent } from './message.component'; +import { NoneComponent } from './none.component'; +import { NumberComponent } from './number.component'; +import { OneOfComponent } from './one-of.component'; +import { RadiosComponent } from './radios.component'; +import { RootComponent } from './root.component'; +import { SectionComponent } from './section.component'; +import { SelectComponent } from './select.component'; +import { SelectFrameworkComponent } from './select-framework.component'; +import { SelectWidgetComponent } from './select-widget.component'; +import { SubmitComponent } from './submit.component'; +import { TabComponent } from './tab.component'; +import { TabsComponent } from './tabs.component'; +import { TemplateComponent } from './template.component'; +import { TextareaComponent } from './textarea.component'; + +export const BASIC_WIDGETS = [ + AddReferenceComponent, OneOfComponent, ButtonComponent, CheckboxComponent, + CheckboxesComponent, FileComponent, HiddenComponent, InputComponent, + MessageComponent, NoneComponent, NumberComponent, RadiosComponent, + RootComponent, SectionComponent, SelectComponent, SelectFrameworkComponent, + SelectWidgetComponent, SubmitComponent, TabComponent, TabsComponent, + TemplateComponent, TextareaComponent +]; + +export { AddReferenceComponent } from './add-reference.component'; +export { OneOfComponent } from './one-of.component'; +export { ButtonComponent } from './button.component'; +export { CheckboxComponent } from './checkbox.component'; +export { CheckboxesComponent } from './checkboxes.component'; +export { FileComponent } from './file.component'; +export { HiddenComponent } from './hidden.component'; +export { InputComponent } from './input.component'; +export { MessageComponent } from './message.component'; +export { NoneComponent } from './none.component'; +export { NumberComponent } from './number.component'; +export { OrderableDirective } from './orderable.directive'; +export { RadiosComponent } from './radios.component'; +export { RootComponent } from './root.component'; +export { SectionComponent } from './section.component'; +export { SelectComponent } from './select.component'; +export { SelectFrameworkComponent } from './select-framework.component'; +export { SelectWidgetComponent } from './select-widget.component'; +export { SubmitComponent } from './submit.component'; +export { TabComponent } from './tab.component'; +export { TabsComponent } from './tabs.component'; +export { TemplateComponent } from './template.component'; +export { TextareaComponent } from './textarea.component'; +export { WidgetLibraryService } from './widget-library.service'; diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/input.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/input.component.ts new file mode 100644 index 000000000..929089b08 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/input.component.ts @@ -0,0 +1,76 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'input-widget', + template: ` +
+ + + + + +
`, +}) +export class InputComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: string; + controlDisabled = false; + boundControl = false; + options: any; + autoCompleteList: string[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/message.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/message.component.ts new file mode 100644 index 000000000..69add8211 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/message.component.ts @@ -0,0 +1,29 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'message-widget', + template: ` + `, +}) +export class MessageComponent implements OnInit { + options: any; + message: string = null; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.message = this.options.help || this.options.helpvalue || + this.options.msg || this.options.message; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/none.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/none.component.ts new file mode 100644 index 000000000..6e0a62043 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/none.component.ts @@ -0,0 +1,12 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'none-widget', + template: ``, +}) +export class NoneComponent { + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/number.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/number.component.ts new file mode 100644 index 000000000..938f69f0d --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/number.component.ts @@ -0,0 +1,79 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; + +import { JsonSchemaFormService } from '../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'number-widget', + template: ` +
+ + + + +
`, +}) +export class NumberComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + allowNegative = true; + allowDecimal = true; + allowExponents = false; + lastValidNumber = ''; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (this.layoutNode.dataType === 'integer') { this.allowDecimal = false; } + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/one-of.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/one-of.component.ts new file mode 100644 index 000000000..d66b71e82 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/one-of.component.ts @@ -0,0 +1,36 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; + +import { JsonSchemaFormService } from '../json-schema-form.service'; + +// TODO: Add this control + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'one-of-widget', + template: ``, +}) +export class OneOfComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/orderable.directive.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/orderable.directive.ts new file mode 100644 index 000000000..4d09d2059 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/orderable.directive.ts @@ -0,0 +1,129 @@ +import { + Directive, + ElementRef, + Input, + NgZone, + OnInit + } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +/** + * OrderableDirective + * + * Enables array elements to be reordered by dragging and dropping. + * + * Only works for arrays that have at least two elements. + * + * Also detects arrays-within-arrays, and correctly moves either + * the child array element or the parent array element, + * depending on the drop targert. + * + * Listeners for movable element being dragged: + * - dragstart: add 'dragging' class to element, set effectAllowed = 'move' + * - dragover: set dropEffect = 'move' + * - dragend: remove 'dragging' class from element + * + * Listeners for stationary items being dragged over: + * - dragenter: add 'drag-target-...' classes to element + * - dragleave: remove 'drag-target-...' classes from element + * - drop: remove 'drag-target-...' classes from element, move dropped array item + */ +@Directive({ + // tslint:disable-next-line:directive-selector + selector: '[orderable]', +}) +export class OrderableDirective implements OnInit { + arrayLayoutIndex: string; + element: any; + overParentElement = false; + overChildElement = false; + @Input() orderable: boolean; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private elementRef: ElementRef, + private jsf: JsonSchemaFormService, + private ngZone: NgZone + ) { } + + ngOnInit() { + if (this.orderable && this.layoutNode && this.layoutIndex && this.dataIndex) { + this.element = this.elementRef.nativeElement; + this.element.draggable = true; + this.arrayLayoutIndex = 'move:' + this.layoutIndex.slice(0, -1).toString(); + + this.ngZone.runOutsideAngular(() => { + + // Listeners for movable element being dragged: + + this.element.addEventListener('dragstart', (event) => { + event.dataTransfer.effectAllowed = 'move'; + // Hack to bypass stupid HTML drag-and-drop dataTransfer protection + // so drag source info will be available on dragenter + const sourceArrayIndex = this.dataIndex[this.dataIndex.length - 1]; + sessionStorage.setItem(this.arrayLayoutIndex, sourceArrayIndex + ''); + }); + + this.element.addEventListener('dragover', (event) => { + if (event.preventDefault) { event.preventDefault(); } + event.dataTransfer.dropEffect = 'move'; + return false; + }); + + // Listeners for stationary items being dragged over: + + this.element.addEventListener('dragenter', (event) => { + // Part 1 of a hack, inspired by Dragster, to simulate mouseover and mouseout + // behavior while dragging items - http://bensmithett.github.io/dragster/ + if (this.overParentElement) { + return this.overChildElement = true; + } else { + this.overParentElement = true; + } + + const sourceArrayIndex = sessionStorage.getItem(this.arrayLayoutIndex); + if (sourceArrayIndex !== null) { + if (this.dataIndex[this.dataIndex.length - 1] < +sourceArrayIndex) { + this.element.classList.add('drag-target-top'); + } else if (this.dataIndex[this.dataIndex.length - 1] > +sourceArrayIndex) { + this.element.classList.add('drag-target-bottom'); + } + } + }); + + this.element.addEventListener('dragleave', (event) => { + // Part 2 of the Dragster hack + if (this.overChildElement) { + this.overChildElement = false; + } else if (this.overParentElement) { + this.overParentElement = false; + } + + const sourceArrayIndex = sessionStorage.getItem(this.arrayLayoutIndex); + if (!this.overParentElement && !this.overChildElement && sourceArrayIndex !== null) { + this.element.classList.remove('drag-target-top'); + this.element.classList.remove('drag-target-bottom'); + } + }); + + this.element.addEventListener('drop', (event) => { + this.element.classList.remove('drag-target-top'); + this.element.classList.remove('drag-target-bottom'); + // Confirm that drop target is another item in the same array as source item + const sourceArrayIndex = sessionStorage.getItem(this.arrayLayoutIndex); + const destArrayIndex = this.dataIndex[this.dataIndex.length - 1]; + if (sourceArrayIndex !== null && +sourceArrayIndex !== destArrayIndex) { + // Move array item + this.jsf.moveArrayItem(this, +sourceArrayIndex, destArrayIndex); + } + sessionStorage.removeItem(this.arrayLayoutIndex); + return false; + }); + + }); + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/radios.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/radios.component.ts new file mode 100644 index 000000000..a8a668db5 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/radios.component.ts @@ -0,0 +1,101 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap } from '../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'radios-widget', + template: ` + + + +
+ +
+ + +
+
+ +
+
`, +}) +export class RadiosComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + layoutOrientation = 'vertical'; + radiosList: any[] = []; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + if (this.layoutNode.type === 'radios-inline' || + this.layoutNode.type === 'radiobuttons' + ) { + this.layoutOrientation = 'horizontal'; + } + this.radiosList = buildTitleMap( + this.options.titleMap || this.options.enumNames, + this.options.enum, true + ); + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/root.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/root.component.ts new file mode 100644 index 000000000..51bf64418 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/root.component.ts @@ -0,0 +1,78 @@ +import { Component, Input } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'root-widget', + template: ` +
+
+ +
+
`, + styles: [` + [draggable=true] { + transition: all 150ms cubic-bezier(.4, 0, .2, 1); + } + [draggable=true]:hover { + cursor: move; + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); + position: relative; z-index: 10; + margin-top: -1px; + margin-left: -1px; + margin-right: 1px; + margin-bottom: 1px; + } + [draggable=true].drag-target-top { + box-shadow: 0 -2px 0 #000; + position: relative; z-index: 20; + } + [draggable=true].drag-target-bottom { + box-shadow: 0 2px 0 #000; + position: relative; z-index: 20; + } + `], +}) +export class RootComponent { + options: any; + @Input() dataIndex: number[]; + @Input() layoutIndex: number[]; + @Input() layout: any[]; + @Input() isOrderable: boolean; + @Input() isFlexItem = false; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + isDraggable(node: any): boolean { + return node.arrayItem && node.type !== '$ref' && + node.arrayItemType === 'list' && this.isOrderable !== false; + } + + // Set attributes for flexbox child + // (container attributes are set in section.component) + getFlexAttribute(node: any, attribute: string) { + const index = ['flex-grow', 'flex-shrink', 'flex-basis'].indexOf(attribute); + return ((node.options || {}).flex || '').split(/\s+/)[index] || + (node.options || {})[attribute] || ['1', '1', 'auto'][index]; + } + + showWidget(layoutNode: any): boolean { + return this.jsf.evaluateCondition(layoutNode, this.dataIndex); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/section.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/section.component.ts new file mode 100644 index 000000000..3a5349fb2 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/section.component.ts @@ -0,0 +1,133 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'section-widget', + template: ` +
+ + +
+
+ +
+

+
+ +
+

+
+
`, + styles: [` + .legend { font-weight: bold; } + .expandable > legend:before, .expandable > label:before { content: 'â–¶'; padding-right: .3em; } + .expanded > legend:before, .expanded > label:before { content: 'â–¼'; padding-right: .2em; } + `], +}) +export class SectionComponent implements OnInit { + options: any; + expanded = true; + containerType: string; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + get sectionTitle() { + return this.options.notitle ? null : this.jsf.setItemTitle(this); + } + + ngOnInit() { + this.jsf.initializeControl(this); + this.options = this.layoutNode.options || {}; + this.expanded = typeof this.options.expanded === 'boolean' ? + this.options.expanded : !this.options.expandable; + switch (this.layoutNode.type) { + case 'fieldset': case 'array': case 'tab': case 'advancedfieldset': + case 'authfieldset': case 'optionfieldset': case 'selectfieldset': + this.containerType = 'fieldset'; + break; + default: // 'div', 'flex', 'section', 'conditional', 'actions', 'tagsinput' + this.containerType = 'div'; + break; + } + } + + toggleExpanded() { + if (this.options.expandable) { this.expanded = !this.expanded; } + } + + // Set attributes for flexbox container + // (child attributes are set in root.component) + getFlexAttribute(attribute: string) { + const flexActive: boolean = + this.layoutNode.type === 'flex' || + !!this.options.displayFlex || + this.options.display === 'flex'; + if (attribute !== 'flex' && !flexActive) { return null; } + switch (attribute) { + case 'is-flex': + return flexActive; + case 'display': + return flexActive ? 'flex' : 'initial'; + case 'flex-direction': case 'flex-wrap': + const index = ['flex-direction', 'flex-wrap'].indexOf(attribute); + return (this.options['flex-flow'] || '').split(/\s+/)[index] || + this.options[attribute] || ['column', 'nowrap'][index]; + case 'justify-content': case 'align-items': case 'align-content': + return this.options[attribute]; + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-framework.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-framework.component.ts new file mode 100644 index 000000000..5c4724c8c --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-framework.component.ts @@ -0,0 +1,46 @@ +import { + Component, ComponentFactoryResolver, ComponentRef, Input, + OnChanges, OnInit, ViewChild, ViewContainerRef +} from '@angular/core'; + +import { JsonSchemaFormService } from '../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'select-framework-widget', + template: `
`, +}) +export class SelectFrameworkComponent implements OnChanges, OnInit { + newComponent: ComponentRef = null; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + @ViewChild('widgetContainer', { read: ViewContainerRef }) + widgetContainer: ViewContainerRef; + + constructor( + private componentFactory: ComponentFactoryResolver, + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.updateComponent(); + } + + ngOnChanges() { + this.updateComponent(); + } + + updateComponent() { + if (!this.newComponent && this.jsf.framework) { + this.newComponent = this.widgetContainer.createComponent( + this.componentFactory.resolveComponentFactory(this.jsf.framework) + ); + } + if (this.newComponent) { + for (const input of ['layoutNode', 'layoutIndex', 'dataIndex']) { + this.newComponent.instance[input] = this[input]; + } + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-widget.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-widget.component.ts new file mode 100644 index 000000000..7c944bf22 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select-widget.component.ts @@ -0,0 +1,46 @@ +import { + Component, ComponentFactoryResolver, ComponentRef, Input, + OnChanges, OnInit, ViewChild, ViewContainerRef +} from '@angular/core'; + +import { JsonSchemaFormService } from '../json-schema-form.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'select-widget-widget', + template: `
`, +}) +export class SelectWidgetComponent implements OnChanges, OnInit { + newComponent: ComponentRef = null; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + @ViewChild('widgetContainer', { read: ViewContainerRef }) + widgetContainer: ViewContainerRef; + + constructor( + private componentFactory: ComponentFactoryResolver, + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.updateComponent(); + } + + ngOnChanges() { + this.updateComponent(); + } + + updateComponent() { + if (!this.newComponent && (this.layoutNode || {}).widget) { + this.newComponent = this.widgetContainer.createComponent( + this.componentFactory.resolveComponentFactory(this.layoutNode.widget) + ); + } + if (this.newComponent) { + for (const input of ['layoutNode', 'layoutIndex', 'dataIndex']) { + this.newComponent.instance[input] = this[input]; + } + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select.component.ts new file mode 100644 index 000000000..b6e4c7282 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/select.component.ts @@ -0,0 +1,96 @@ +import { AbstractControl } from '@angular/forms'; +import { buildTitleMap, isArray } from '../shared'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'select-widget', + template: ` +
+ + + +
`, +}) +export class SelectComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + selectList: any[] = []; + isArray = isArray; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.selectList = buildTitleMap( + this.options.titleMap || this.options.enumNames, + this.options.enum, !!this.options.required, !!this.options.flatList + ); + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/submit.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/submit.component.ts new file mode 100644 index 000000000..936932b0d --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/submit.component.ts @@ -0,0 +1,62 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { hasOwn } from '../shared/utility.functions'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'submit-widget', + template: ` +
+ +
`, +}) +export class SubmitComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + if (hasOwn(this.options, 'disabled')) { + this.controlDisabled = this.options.disabled; + } else if (this.jsf.formOptions.disableInvalidSubmit) { + this.controlDisabled = !this.jsf.isValid; + this.jsf.isValidChanges.subscribe(isValid => this.controlDisabled = !isValid); + } + if (this.controlValue === null || this.controlValue === undefined) { + this.controlValue = this.options.title; + } + } + + updateValue(event) { + if (typeof this.options.onClick === 'function') { + this.options.onClick(event); + } else { + this.jsf.updateValue(this, event.target.value); + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tab.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tab.component.ts new file mode 100644 index 000000000..4bcd7773b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tab.component.ts @@ -0,0 +1,29 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'tab-widget', + template: ` +
+ +
`, +}) +export class TabComponent implements OnInit { + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tabs.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tabs.component.ts new file mode 100644 index 000000000..dd53f0437 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/tabs.component.ts @@ -0,0 +1,83 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'tabs-widget', + template: ` +
    +
  • + +
  • +
+ +
+ + + +
`, + styles: [` a { cursor: pointer; } `], +}) +export class TabsComponent implements OnInit { + options: any; + itemCount: number; + selectedItem = 0; + showAddTab = true; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.itemCount = this.layoutNode.items.length - 1; + this.updateControl(); + } + + select(index) { + if (this.layoutNode.items[index].type === '$ref') { + this.itemCount = this.layoutNode.items.length; + this.jsf.addItem({ + layoutNode: this.layoutNode.items[index], + layoutIndex: this.layoutIndex.concat(index), + dataIndex: this.dataIndex.concat(index) + }); + this.updateControl(); + } + this.selectedItem = index; + } + + updateControl() { + const lastItem = this.layoutNode.items[this.layoutNode.items.length - 1]; + if (lastItem.type === '$ref' && + this.itemCount >= (lastItem.options.maxItems || 1000) + ) { + this.showAddTab = false; + } + } + + setTabTitle(item: any, index: number): string { + return this.jsf.setArrayItemTitle(this, item, index); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/template.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/template.component.ts new file mode 100644 index 000000000..38336d433 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/template.component.ts @@ -0,0 +1,52 @@ +import { + Component, + ComponentFactoryResolver, + ComponentRef, + Input, + OnChanges, + OnInit, + ViewChild, + ViewContainerRef + } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'template-widget', + template: `
`, +}) +export class TemplateComponent implements OnInit, OnChanges { + newComponent: ComponentRef = null; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + @ViewChild('widgetContainer', { read: ViewContainerRef }) + widgetContainer: ViewContainerRef; + + constructor( + private componentFactory: ComponentFactoryResolver, + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.updateComponent(); + } + + ngOnChanges() { + this.updateComponent(); + } + + updateComponent() { + if (!this.newComponent && this.layoutNode.options.template) { + this.newComponent = this.widgetContainer.createComponent( + this.componentFactory.resolveComponentFactory(this.layoutNode.options.template) + ); + } + if (this.newComponent) { + for (const input of ['layoutNode', 'layoutIndex', 'dataIndex']) { + this.newComponent.instance[input] = this[input]; + } + } + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/textarea.component.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/textarea.component.ts new file mode 100644 index 000000000..6f55e1ea6 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/textarea.component.ts @@ -0,0 +1,68 @@ +import { AbstractControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { JsonSchemaFormService } from '../json-schema-form.service'; + + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'textarea-widget', + template: ` +
+ + + +
`, +}) +export class TextareaComponent implements OnInit { + formControl: AbstractControl; + controlName: string; + controlValue: any; + controlDisabled = false; + boundControl = false; + options: any; + @Input() layoutNode: any; + @Input() layoutIndex: number[]; + @Input() dataIndex: number[]; + + constructor( + private jsf: JsonSchemaFormService + ) { } + + ngOnInit() { + this.options = this.layoutNode.options || {}; + this.jsf.initializeControl(this); + } + + updateValue(event) { + this.jsf.updateValue(this, event.target.value); + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.module.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.module.ts new file mode 100644 index 000000000..24d0cbc9b --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.module.ts @@ -0,0 +1,22 @@ +import { BASIC_WIDGETS } from './index'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { JsonSchemaFormService } from '../json-schema-form.service'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { OrderableDirective } from './orderable.directive'; + +@NgModule({ + imports: [ CommonModule, FormsModule, ReactiveFormsModule ], + declarations: [ ...BASIC_WIDGETS, OrderableDirective ], + exports: [ ...BASIC_WIDGETS, OrderableDirective ], + entryComponents: [ ...BASIC_WIDGETS ], + providers: [ JsonSchemaFormService ] +}) +export class WidgetLibraryModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: WidgetLibraryModule, + providers: [ JsonSchemaFormService ] + }; + } +} diff --git a/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.service.ts b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.service.ts new file mode 100644 index 000000000..7b49c3188 --- /dev/null +++ b/frontend/projects/angular7-json-schema-form/src/lib/widget-library/widget-library.service.ts @@ -0,0 +1,232 @@ +import { AddReferenceComponent } from './add-reference.component'; +import { ButtonComponent } from './button.component'; +import { CheckboxComponent } from './checkbox.component'; +import { CheckboxesComponent } from './checkboxes.component'; +import { FileComponent } from './file.component'; +import { hasOwn } from '../shared/utility.functions'; +import { Injectable } from '@angular/core'; +import { InputComponent } from './input.component'; +import { MessageComponent } from './message.component'; +import { NoneComponent } from './none.component'; +import { NumberComponent } from './number.component'; +import { OneOfComponent } from './one-of.component'; +import { RadiosComponent } from './radios.component'; +import { RootComponent } from './root.component'; +import { SectionComponent } from './section.component'; +import { SelectComponent } from './select.component'; +import { SelectFrameworkComponent } from './select-framework.component'; +import { SelectWidgetComponent } from './select-widget.component'; +import { SubmitComponent } from './submit.component'; +import { TabsComponent } from './tabs.component'; +import { TemplateComponent } from './template.component'; +import { TextareaComponent } from './textarea.component'; + +@Injectable() +export class WidgetLibraryService { + + defaultWidget = 'text'; + widgetLibrary: any = { + + // Angular JSON Schema Form administrative widgets + 'none': NoneComponent, // Placeholder, for development - displays nothing + 'root': RootComponent, // Form root, renders a complete layout + 'select-framework': SelectFrameworkComponent, // Applies the selected framework to a specified widget + 'select-widget': SelectWidgetComponent, // Displays a specified widget + '$ref': AddReferenceComponent, // Button to add a new array item or $ref element + + // Free-form text HTML 'input' form control widgets + 'email': 'text', + 'integer': 'number', // Note: 'integer' is not a recognized HTML input type + 'number': NumberComponent, + 'password': 'text', + 'search': 'text', + 'tel': 'text', + 'text': InputComponent, + 'url': 'text', + + // Controlled text HTML 'input' form control widgets + 'color': 'text', + 'date': 'text', + 'datetime': 'text', + 'datetime-local': 'text', + 'month': 'text', + 'range': 'number', + 'time': 'text', + 'week': 'text', + + // Non-text HTML 'input' form control widgets + // 'button': not used, use - - - diff --git a/frontend/src/app/components/example.component.spec.ts b/frontend/src/app/components/example.component.spec.ts deleted file mode 100644 index 7ac35f0c3..000000000 --- a/frontend/src/app/components/example.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ExampleComponent } from './example.component'; - -describe('ExampleComponent', () => { - let component: ExampleComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ExampleComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ExampleComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/components/example.component.ts b/frontend/src/app/components/example.component.ts deleted file mode 100644 index c8b955b39..000000000 --- a/frontend/src/app/components/example.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormGroup, FormControl } from '@angular/forms'; -import {ExampleService} from '../service/example.service'; -import {Example} from './example'; - -@Component({ - selector: 'app-example', - templateUrl: './example.component.html', - styleUrls: ['./example.component.css'] -}) -export class ExampleComponent { - register = new FormGroup({ - title: new FormControl(''), - type: new FormControl('') - }); - types = ['atribuido', 'formal']; - - constructor(private exampleService: ExampleService) {} - onSubmit(): void { - const dataExample: Example = {id: 3443 } as Example; - this.exampleService - .sendExample(dataExample) - .subscribe(result => console.log(result)); - } - -} diff --git a/frontend/src/app/components/example.ts b/frontend/src/app/components/example.ts deleted file mode 100644 index 9fa4b1a54..000000000 --- a/frontend/src/app/components/example.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Example { - id: number; -} diff --git a/frontend/src/app/demo-root.component.ts b/frontend/src/app/demo-root.component.ts new file mode 100755 index 000000000..24c0c2834 --- /dev/null +++ b/frontend/src/app/demo-root.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'demo-root', + template: `` +}) +export class DemoRootComponent { } diff --git a/frontend/src/app/demo.component.html b/frontend/src/app/demo.component.html new file mode 100755 index 000000000..637159f14 --- /dev/null +++ b/frontend/src/app/demo.component.html @@ -0,0 +1,196 @@ +
+ + Angular JSON Schema Form — Demonstration Playground + +
+ An Angular JSON Schema Form builder + for Angular 4 and 5, similar to, and mostly API compatible with, + + + + + Angular Schema Form, + + + React JSON Schema Form, + and + + + + JSON Form. +
+ Choose an example, or create your own, and check out the generated form.

+ + Current example: + + + + + + + + + + + + + + + + +
+
+
+ + +

+ {{visible.options ? 'â–¼' : 'â–¶'}} Selected Framework and Options +

+
+ + + + {{frameworks[framework]}} + + + + + + + {{languages[language]}} + + + +
+ + Return empty fields? + + (default = true) +
+
+ + Add submit button? + + (default = only add if no layout is defined) +
+
+ + Show inline fedback? + + (default = false) +
+
+ + Show debuging information? + + (default = false) +
+
+
+

+ {{visible.schema ? 'â–¼' : 'â–¶'}} Input JSON Schema and Form Layout +

+
+ (loading form specification...) +
+
+ + +

+ {{visible.form ? 'â–¼' : 'â–¶'}} Generated Form +

+
+
{{jsonFormStatusMessage}}
+ + + + + +
+
+

+ {{visible.output ? 'â–¼' : 'â–¶'}} Form Output +

+
+
+ Valid?: + + {{formIsValid ? 'Yes' : 'No'}} + + n/a + — errors from validationErrors(): +
+

+
+ Live data — from onChanges(): +
{{prettyLiveFormData}}
+

+
+ Submitted data — from onSubmit(): +
{{prettySubmittedFormData}}
+
+
+
+ +
diff --git a/frontend/src/app/demo.component.ts b/frontend/src/app/demo.component.ts new file mode 100755 index 000000000..145b677f4 --- /dev/null +++ b/frontend/src/app/demo.component.ts @@ -0,0 +1,254 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatMenuTrigger } from '@angular/material'; +import { trigger, state, style, animate, transition } from '@angular/animations'; +import { ActivatedRoute, Router } from '@angular/router'; +import { HttpClient } from '@angular/common/http'; + +import { Examples } from './example-schemas.model'; +import { JsonPointer } from 'angular7-json-schema-form'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'demo', + templateUrl: 'demo.component.html', + animations: [ + trigger('expandSection', [ + state('in', style({ height: '*' })), + transition(':enter', [ + style({ height: 0 }), animate(100), + ]), + transition(':leave', [ + style({ height: '*' }), + animate(100, style({ height: 0 })), + ]), + ]), + ], +}) +export class DemoComponent implements OnInit { + examples: any = Examples; + languageList: any = ['en', 'fr']; + languages: any = { + 'en': 'English', + 'fr': 'French', + }; + frameworkList: any = ['material-design', 'bootstrap-3', 'bootstrap-4', 'no-framework']; + frameworks: any = { + 'material-design': 'Material Design', + 'bootstrap-3': 'Bootstrap 3', + 'bootstrap-4': 'Bootstrap 4', + 'no-framework': 'None (plain HTML)', + }; + selectedSet = 'ng-jsf'; + selectedSetName = ''; + selectedExample = 'ng-jsf-flex-layout'; + selectedExampleName = 'Flexbox layout'; + selectedFramework = 'material-design'; + selectedLanguage = 'en'; + visible = { + options: true, + schema: true, + form: true, + output: true + }; + + formActive = false; + jsonFormSchema: string; + jsonFormValid = false; + jsonFormStatusMessage = 'Loading form...'; + jsonFormObject: any; + jsonFormOptions: any = { + addSubmit: true, // Add a submit button if layout does not have one + debug: false, // Don't show inline debugging information + loadExternalAssets: true, // Load external css and JavaScript for frameworks + returnEmptyFields: false, // Don't return values for empty input fields + setSchemaDefaults: true, // Always use schema defaults for empty fields + defautWidgetOptions: { feedback: true }, // Show inline feedback icons + }; + liveFormData: any = {}; + formValidationErrors: any; + formIsValid = null; + submittedFormData: any = null; + aceEditorOptions: any = { + highlightActiveLine: true, + maxLines: 1000, + printMargin: false, + autoScrollEditorIntoView: true, + }; + @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger; + + constructor( + private http: HttpClient, + private route: ActivatedRoute, + private router: Router + ) { } + + ngOnInit() { + // Subscribe to query string to detect schema to load + this.route.queryParams.subscribe( + params => { + if (params['set']) { + this.selectedSet = params['set']; + this.selectedSetName = ({ + 'ng-jsf': '', + 'asf': 'Angular Schema Form:', + 'rsf': 'React Schema Form:', + 'jsf': 'JSONForm:' + })[this.selectedSet]; + } + if (params['example']) { + this.selectedExample = params['example']; + this.selectedExampleName = this.examples[this.selectedSet].schemas + .find(schema => schema.file === this.selectedExample).name; + } + if (params['framework']) { + this.selectedFramework = params['framework']; + } + if (params['language']) { + this.selectedLanguage = params['language']; + } + this.loadSelectedExample(); + } + ); + } + + onSubmit(data: any) { + this.submittedFormData = data; + } + + get prettySubmittedFormData() { + return JSON.stringify(this.submittedFormData, null, 2); + } + + onChanges(data: any) { + this.liveFormData = data; + } + + get prettyLiveFormData() { + return JSON.stringify(this.liveFormData, null, 2); + } + + isValid(isValid: boolean): void { + this.formIsValid = isValid; + } + + validationErrors(data: any): void { + this.formValidationErrors = data; + } + + get prettyValidationErrors() { + if (!this.formValidationErrors) { return null; } + const errorArray = []; + for (const error of this.formValidationErrors) { + const message = error.message; + const dataPathArray = JsonPointer.parse(error.dataPath); + if (dataPathArray.length) { + let field = dataPathArray[0]; + for (let i = 1; i < dataPathArray.length; i++) { + const key = dataPathArray[i]; + field += /^\d+$/.test(key) ? `[${key}]` : `.${key}`; + } + errorArray.push(`${field}: ${message}`); + } else { + errorArray.push(message); + } + } + return errorArray.join('
'); + } + + loadSelectedExample( + selectedSet: string = this.selectedSet, + selectedSetName: string = this.selectedSetName, + selectedExample: string = this.selectedExample, + selectedExampleName: string = this.selectedExampleName + ) { + if (this.menuTrigger.menuOpen) { this.menuTrigger.closeMenu(); } + if (selectedExample !== this.selectedExample) { + this.formActive = false; + this.selectedSet = selectedSet; + this.selectedSetName = selectedSetName; + this.selectedExample = selectedExample; + this.selectedExampleName = selectedExampleName; + this.router.navigateByUrl( + '/?set=' + selectedSet + + '&example=' + selectedExample + + '&framework=' + this.selectedFramework + + '&language=' + this.selectedLanguage + ); + this.liveFormData = {}; + this.submittedFormData = null; + this.formIsValid = null; + this.formValidationErrors = null; + } + const exampleURL = `assets/example-schemas/${this.selectedExample}.json`; + this.http + .get(exampleURL, { responseType: 'text' }) + .subscribe(schema => { + this.jsonFormSchema = schema; + this.generateForm(this.jsonFormSchema); + }); + } + + loadSelectedLanguage() { + window.location.href = + '/?set=' + this.selectedSet + + '&example=' + this.selectedExample + + '&framework=' + this.selectedFramework + + '&language=' + this.selectedLanguage; + } + + // Display the form entered by the user + // (runs whenever the user changes the jsonform object in the ACE input field) + generateForm(newFormString: string) { + if (!newFormString) { return; } + this.jsonFormStatusMessage = 'Loading form...'; + this.formActive = false; + this.liveFormData = {}; + this.submittedFormData = null; + + // Most examples should be written in pure JSON, + // but if an example schema includes a function, + // it will be compiled it as Javascript instead + try { + + // Parse entered content as JSON + this.jsonFormObject = JSON.parse(newFormString); + this.jsonFormValid = true; + } catch (jsonError) { + try { + + // If entered content is not valid JSON, + // parse as JavaScript instead to include functions + const newFormObject: any = null; + /* tslint:disable */ + eval('newFormObject = ' + newFormString); + /* tslint:enable */ + this.jsonFormObject = newFormObject; + this.jsonFormValid = true; + } catch (javascriptError) { + + // If entered content is not valid JSON or JavaScript, show error + this.jsonFormValid = false; + this.jsonFormStatusMessage = + 'Entered content is not currently a valid JSON Form object.\n' + + 'As soon as it is, you will see your form here. So keep typing. :-)\n\n' + + 'JavaScript parser returned:\n\n' + jsonError; + return; + } + } + this.formActive = true; + } + + toggleVisible(item: string) { + this.visible[item] = !this.visible[item]; + } + + toggleFormOption(option: string) { + if (option === 'feedback') { + this.jsonFormOptions.defautWidgetOptions.feedback = + !this.jsonFormOptions.defautWidgetOptions.feedback; + } else { + this.jsonFormOptions[option] = !this.jsonFormOptions[option]; + } + this.generateForm(this.jsonFormSchema); + } +} diff --git a/frontend/src/app/demo.module.ts b/frontend/src/app/demo.module.ts new file mode 100755 index 000000000..7e0e26112 --- /dev/null +++ b/frontend/src/app/demo.module.ts @@ -0,0 +1,58 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { + MatButtonModule, MatCardModule, MatCheckboxModule, MatIconModule, + MatMenuModule, MatSelectModule, MatToolbarModule +} from '@angular/material'; +import { RouterModule } from '@angular/router'; + + + +// To include JsonSchemaFormModule after downloading from NPM, use this instead: +// +// import { JsonSchemaFormModule, NoFrameworkModule } from 'angular7-json-schema-form'; +// +// but replace "NoFrameworkModule" with the framework you want to use, +// then import both JsonSchemaFormModule and the framework module, like this: +// +// imports: [ ... NoFrameworkModule, JsonSchemaFormModule.forRoot(NoFrameworkModule) ... ] + +import { AceEditorDirective } from './ace-editor.directive'; +import { DemoComponent } from './demo.component'; +import { DemoRootComponent } from './demo-root.component'; + +import { routes } from './demo.routes'; +import { + MaterialDesignFrameworkModule, Bootstrap4FrameworkModule, + Bootstrap3FrameworkModule, NoFrameworkModule +} from 'angular7-json-schema-form'; + +@NgModule({ + declarations: [AceEditorDirective, DemoComponent, DemoRootComponent], + imports: [ + BrowserModule, BrowserAnimationsModule, FlexLayoutModule, FormsModule, + HttpClientModule, MatButtonModule, MatCardModule, MatCheckboxModule, + MatIconModule, MatMenuModule, MatSelectModule, MatToolbarModule, + RouterModule.forRoot(routes), + MaterialDesignFrameworkModule, + Bootstrap4FrameworkModule, + Bootstrap3FrameworkModule, + NoFrameworkModule + ], + bootstrap: [DemoRootComponent] +}) + +// Here, by loading 4 frameworks in JsonSchemaFormModule.forRoot(), the first, +// `NoFrameworkModule`, will be set active by default. But any of the 4 can +// be activated later by passing the framework's name to the +// tag's `framework` input. The names of these 4 frameworks are: +// 'no-framework' +// 'material-design-framework', +// 'bootstrap-3-framework' +// 'bootstrap-4-framework' + +export class DemoModule { } diff --git a/frontend/src/app/demo.routes.ts b/frontend/src/app/demo.routes.ts new file mode 100755 index 000000000..396eda7d1 --- /dev/null +++ b/frontend/src/app/demo.routes.ts @@ -0,0 +1,8 @@ +import { Route } from '@angular/router'; + +import { DemoComponent } from './demo.component'; + +export const routes: Route[] = [ + { path: '', component: DemoComponent }, + { path: '**', component: DemoComponent } +]; diff --git a/frontend/src/app/example-schemas.model.ts b/frontend/src/app/example-schemas.model.ts new file mode 100755 index 000000000..67c8b9e86 --- /dev/null +++ b/frontend/src/app/example-schemas.model.ts @@ -0,0 +1,171 @@ +/** + * Sources: + * + * Angular JSON Schema Form examples ('ng-jsf-...') are original + * + * JSON Meta-Schemas ('json-schema-...') are from + * http://json-schema.org/specification-links.html + * + * Angular Schema Form (AngularJS) examples ('asf-...') are from + * http://schemaform.io/examples/bootstrap-example.html + * + * React JSON Schema Form examples ('rjsf-...') are from + * https://mozilla-services.github.io/react-jsonschema-form/ + * + * JSONForm (jQuery) examples ('jsf-...') are from + * http://ulion.github.io/jsonform/playground/ + */ + +export const Examples: any = { + 'ng-jsf': { + name: 'Angular JSON Schema Form examples', + schemas: [ + { name: 'Flexbox layout', file: 'ng-jsf-flex-layout', }, + // { name: 'Simple Array', file: 'ng-jsf-simple-array', }, + { name: 'Nested Arrays', file: 'ng-jsf-nested-arrays', }, + { name: 'Deep Recursive References', file: 'ng-jsf-deep-ref', }, + { name: 'Select Control Lists', file: 'ng-jsf-select-list-examples', }, + // { name: 'Select Control Widgets', file: 'ng-jsf-select-widget-examples', }, + { name: 'Data Only (no Schema or Layout)', file: 'ng-jsf-data-only', }, + // { name: 'Layout Only (no Schema or Data)', file: 'ng-jsf-layout-only', }, + // { name: 'JSON Meta-Schema - Draft 6', file: 'json-schema-draft06', }, + // { name: 'JSON Meta-Schema - Draft 4', file: 'json-schema-draft04', }, + // { name: 'JSON Meta-Schema - Draft 3', file: 'json-schema-draft03', }, + // { name: 'JSON Meta-Schema - Draft 2', file: 'json-schema-draft02', }, + // { name: 'JSON Meta-Schema - Draft 1', file: 'json-schema-draft01', }, + ] + }, + 'asf': { + name: 'Angular Schema Form (AngularJS) examples', + url: 'http://schemaform.io/examples/bootstrap-example.html', + schemas: [ + { name: 'Simple', file: 'asf-simple', }, + { name: 'Basic JSON Schema Type', file: 'asf-basic-json-schema-type', }, + { name: 'Bootstrap Grid', file: 'asf-bootstrap-grid', }, + { name: 'Complex Key Support', file: 'asf-complex-key-support', }, + { name: 'Array', file: 'asf-array', }, + { name: 'Tab Array', file: 'asf-tab-array', }, + { name: 'TitleMap Examples', file: 'asf-titlemap-examples', }, + { name: 'Kitchen Sink', file: 'asf-kitchen-sink', }, + { name: 'Hack: Conditional Required', file: 'asf-hack-conditional-required', }, + ] + }, + 'rjsf': { + name: 'React JSON Schema Form examples', + url: 'https://mozilla-services.github.io/react-jsonschema-form/', + schemas: [ + { name: 'Simple', file: 'rjsf-simple', }, + { name: 'Nested', file: 'rjsf-nested', }, + { name: 'Arrays', file: 'rjsf-arrays', }, + { name: 'Numbers', file: 'rjsf-numbers', }, + { name: 'Widgets', file: 'rjsf-widgets', }, + { name: 'Ordering', file: 'rjsf-ordering', }, + { name: 'References', file: 'rjsf-references', }, + { name: 'Custom', file: 'rjsf-custom', }, + { name: 'Errors', file: 'rjsf-errors', }, + { name: 'Large', file: 'rjsf-large', }, + { name: 'Date & Time', file: 'rjsf-date-and-time', }, + { name: 'Validation', file: 'rjsf-validation', }, + { name: 'Files', file: 'rjsf-files', }, + { name: 'Single', file: 'rjsf-single', }, + // { name: 'Custom Array', file: 'rjsf-custom-array', }, + { name: 'Alternatives', file: 'rjsf-alternatives', }, + ] + }, + 'jsf': { + name: 'JSONForm (jQuery) examples', + url: 'http://ulion.github.io/jsonform/playground/', + schemas: [ + { name: 'Getting started', + file: 'jsf-gettingstarted', urlParameters: '?example=gettingstarted' }, + { name: 'JSON Schema - A basic example', + file: 'jsf-schema-basic', urlParameters: '?example=schema-basic', }, + { name: 'JSON Schema - Slightly more complex example', + file: 'jsf-schema-morecomplex', urlParameters: '?example=schema-morecomplex', }, + { name: 'JSON Schema - Arrays', + file: 'jsf-schema-array', urlParameters: '?example=schema-array', }, + { name: 'JSON Schema - Required field', + file: 'jsf-schema-required', urlParameters: '?example=schema-required', }, + { name: 'JSON Schema - Default values', + file: 'jsf-schema-default', urlParameters: '?example=schema-default', }, + { name: 'JSON Schema - Inline $ref to definitions', + file: 'jsf-schema-inlineref', urlParameters: '?example=schema-inlineref', }, + { name: 'Fields - Common properties', + file: 'jsf-fields-common', urlParameters: '?example=fields-common', }, + { name: 'Fields - Gathering secrets: the password type', + file: 'jsf-fields-password', urlParameters: '?example=fields-password', }, + { name: 'Fields - Large text: the textarea type', + file: 'jsf-fields-textarea', urlParameters: '?example=fields-textarea', }, + { name: 'Fields - text field with jquery-ui autocomplete', + file: 'jsf-fields-autocomplete', urlParameters: '?example=fields-autocomplete', }, + { name: 'Fields - Code (JavaScript, JSON...): the ace type', + file: 'jsf-fields-ace', urlParameters: '?example=fields-ace', }, + { name: 'Fields - Color picker: the color type', + file: 'jsf-fields-color', urlParameters: '?example=fields-color', }, + { name: 'Fields - Boolean flag: the checkbox type', + file: 'jsf-fields-checkbox', urlParameters: '?example=fields-checkbox', }, + { name: 'Fields - Multiple options: the checkboxes type', + file: 'jsf-fields-checkboxes', urlParameters: '?example=fields-checkboxes', }, + { name: 'Fields - Selection list: the select type', + file: 'jsf-fields-select', urlParameters: '?example=fields-select', }, + { name: 'Fields - A list of radio buttons: the radios type', + file: 'jsf-fields-radios', urlParameters: '?example=fields-radios', }, + { name: 'Fields - Radio buttons as real buttons: the radio buttons type', + file: 'jsf-fields-radiobuttons', urlParameters: '?example=fields-radiobuttons', }, + { name: 'Fields - Checkbox buttons: the checkbox buttons type', + file: 'jsf-fields-checkboxbuttons', urlParameters: '?example=fields-checkboxbuttons', }, + { name: 'Fields - Number: the range type', + file: 'jsf-fields-range', urlParameters: '?example=fields-range', }, + { name: 'Fields - Image selector: the imageselect type', + file: 'jsf-fields-imageselect', urlParameters: '?example=fields-imageselect', }, + { name: 'Fields - Icon selector: the iconselect type', + file: 'jsf-fields-iconselect', urlParameters: '?example=fields-iconselect', }, + { name: 'Fields - Grouping: the fieldset type', + file: 'jsf-fields-fieldset', urlParameters: '?example=fields-fieldset', }, + { name: 'Fields - Advanced options section: the advancedfieldset type', + file: 'jsf-fields-advancedfieldset', urlParameters: '?example=fields-advancedfieldset', }, + { name: 'Fields - Authentication settings section: the authfieldset type', + file: 'jsf-fields-authfieldset', urlParameters: '?example=fields-authfieldset', }, + { name: 'Fields - Generic group: the section type', + file: 'jsf-fields-section', urlParameters: '?example=fields-section', }, + { name: 'Fields - Group of buttons: the actions type', + file: 'jsf-fields-actions', urlParameters: '?example=fields-actions', }, + { name: 'Fields - Generic array: the array type (complex)', + file: 'jsf-fields-array', urlParameters: '?example=fields-array', }, + { name: 'Fields - Generic array: the array type (simple)', + file: 'jsf-fields-array-simple', urlParameters: '?example=fields-array-simple', }, + { name: 'Fields - Arrays with tabs: the tabarray type', + file: 'jsf-fields-tabarray', urlParameters: '?example=fields-tabarray', }, + { name: 'Fields - Arrays with tabs: the tabarray type w/ maxItems', + file: 'jsf-fields-tabarray-maxitems', urlParameters: '?example=fields-tabarray-maxitems', }, + { name: 'Fields - Arrays with tabs: the tabarray type w/ default & legend', + file: 'jsf-fields-tabarray-value', urlParameters: '?example=fields-tabarray-value', }, + { name: 'Fields - Alternative: the selectfieldset type', + file: 'jsf-fields-selectfieldset', urlParameters: '?example=fields-selectfieldset', }, + { name: 'Fields - Alternative with schema key', + file: 'jsf-fields-selectfieldset-key', urlParameters: '?example=fields-selectfieldset-key', }, + { name: 'Fields - Submit the form: the submit type', + file: 'jsf-fields-submit', urlParameters: '?example=fields-submit', }, + { name: 'Fields - Guide users: the help type', + file: 'jsf-fields-help', urlParameters: '?example=fields-help', }, + { name: 'Fields - Hidden form values: the hidden type', + file: 'jsf-fields-hidden', urlParameters: '?example=fields-hidden', }, + { name: 'Fields - Series of questions: the questions type', + file: 'jsf-fields-questions', urlParameters: '?example=fields-questions', }, + { name: 'Templating - item index with idx', + file: 'jsf-templating-idx', urlParameters: '?example=templating-idx', }, + { name: 'Templating - tab legend with value and valueInLegend', + file: 'jsf-templating-value', urlParameters: '?example=templating-value', }, + { name: 'Templating - values.xxx to reference another field', + file: 'jsf-templating-values', urlParameters: '?example=templating-values', }, + { name: 'Templating - Using the tpldata property', + file: 'jsf-templating-tpldata', urlParameters: '?example=templating-tpldata', }, + { name: 'Using event handlers', + file: 'jsf-events', urlParameters: '?example=events', }, + { name: 'Using previously submitted values', + file: 'jsf-previousvalues', urlParameters: '?example=previousvalues', }, + { name: 'Using previously submitted values - Multidimensional arrays', + file: 'jsf-previousvalues-multidimensional', urlParameters: '?example=previousvalues-multidimensional', }, + ] + } +}; diff --git a/frontend/src/app/service/example.service.spec.ts b/frontend/src/app/service/example.service.spec.ts deleted file mode 100644 index 9bf14ef0b..000000000 --- a/frontend/src/app/service/example.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ExampleService } from './example.service'; - -describe('ExampleService', () => { - let service: ExampleService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ExampleService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/service/example.service.ts b/frontend/src/app/service/example.service.ts deleted file mode 100644 index b08a89c0d..000000000 --- a/frontend/src/app/service/example.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@angular/core'; -import {HttpClient, HttpInterceptor} from '@angular/common/http'; -import { HttpHeaders } from '@angular/common/http'; -import {Observable} from 'rxjs'; -import {Example} from '../components/example'; -// @ts-ignore -import { HttpErrorHandler, HandleError } from '../http-error-handler.service'; -import {catchError} from 'rxjs/operators'; - -const httpOptions = { - headers: new HttpHeaders({ - 'Content-Type': 'application/json', - Authorization: 'my-auth-token' - }) -}; - -@Injectable({ - providedIn: 'root' -}) -export class ExampleService { - Url = 'http://localhost:7474/create'; // URL to public api - private handleError: HandleError; - - constructor(private http: HttpClient) { - } - - sendExample(id: Example): Observable { - return this.http.get(this.Url, httpOptions); - } -} diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/src/assets/example-schemas/asf-array.json b/frontend/src/assets/example-schemas/asf-array.json new file mode 100755 index 000000000..54397e070 --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-array.json @@ -0,0 +1,65 @@ +{ + "schema": { + "title": "Comment", + "type": "object", + "required": [ "comments" ], + "properties": { + "comments": { + "type": "array", + "maxItems": 2, + "items": { + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "email": { + "title": "Email", + "type": "string", + "pattern": "^\\S+@\\S+$", + "description": "Email will be used for evil." + }, + "spam": { + "title": "Spam", + "type": "boolean", + "default": true + }, + "comment": { + "title": "Comment", + "type": "string", + "maxLength": 20, + "validationMessage": "Don't be greedy!" + } + }, + "required": [ "name", "comment" ] + } + } + } + }, + "form": [ + { "type": "help", + "helpvalue": "

Array Example

Try adding a couple of forms, reorder by drag'n'drop.

" + }, + { "key": "comments", + "add": "New", + "style": { "add": "btn-success" }, + "items": [ + "comments[].name", + "comments[].email", + { "title": "Yes I want spam.", + "type": "checkbox", + "key": "comments[].spam", + "condition": "model.comments[arrayIndex].email" + }, + { "type": "textarea", + "key": "comments[].comment" + } + ] + }, + { "title": "OK", + "type": "submit", + "style": "btn-info" + } + ] +} diff --git a/frontend/src/assets/example-schemas/asf-basic-json-schema-type.json b/frontend/src/assets/example-schemas/asf-basic-json-schema-type.json new file mode 100755 index 000000000..da4317d0b --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-basic-json-schema-type.json @@ -0,0 +1,24 @@ +{ + "schema": { + "type": "object", + "title": "Types", + "properties": { + "string": { + "type": "string", + "minLength": 3 + }, + "integer": { + "type": "integer" + }, + "number": { + "type": "number" + }, + "boolean": { + "type": "boolean" + } + }, + "required": [ + "number" + ] + } +} diff --git a/frontend/src/assets/example-schemas/asf-bootstrap-grid.json b/frontend/src/assets/example-schemas/asf-bootstrap-grid.json new file mode 100755 index 000000000..372dd5cee --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-bootstrap-grid.json @@ -0,0 +1,65 @@ +{ + "schema": { + "type": "object", + "title": "Comment", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "email": { + "title": "Email", + "type": "string", + "pattern": "^\\S+@\\S+$", + "description": "Email will be used for evil." + }, + "comment": { + "title": "Comment", + "type": "string", + "maxLength": 20, + "validationMessage": "Don't be greedy!" + } + }, + "required": [ + "name", + "email", + "comment" + ] + }, + "form": [ + { + "type": "help", + "helpvalue": "
Grid it up with bootstrap
" + }, + { + "type": "section", + "htmlClass": "row", + "items": [ + { + "type": "section", + "htmlClass": "col-xs-6", + "items": [ + "name" + ] + }, + { + "type": "section", + "htmlClass": "col-xs-6", + "items": [ + "email" + ] + } + ] + }, + { + "key": "comment", + "type": "textarea", + "placeholder": "Make a comment" + }, + { + "type": "submit", + "style": "btn-info", + "title": "OK" + } + ] +} diff --git a/frontend/src/assets/example-schemas/asf-complex-key-support.json b/frontend/src/assets/example-schemas/asf-complex-key-support.json new file mode 100755 index 000000000..f62e796fd --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-complex-key-support.json @@ -0,0 +1,53 @@ +{ + "schema": { + "type": "object", + "title": "Complex Key Support", + "properties": { + "a[\"b\"].c": { "type": "string" }, + "simple": { + "type": "object", + "properties": { + "prøp": { + "title": "UTF8 in both dot and bracket notation", + "type": "string" + } + } + }, + "array-key": { + "type": "array", + "items": { + "type": "object", + "properties": { + "a'rr[\"l": { + "title": "Control Characters", + "type": "string" + }, + "˙∆∂∞˚¬": { "type": "string" } + }, + "required": [ "a'rr[\"l", "˙∆∂∞˚¬" ] + } + } + } + }, + "form": [ + { + "type": "help", + "helpvalue": "Complex keys are supported in Angular 2+." + }, + "['a[\"b\"].c']", + { + "key": "array-key", + "items": [ + "['array-key'][]['a'rr[\"l']", + { + "key": "['array-key'][]['˙∆∂∞˚¬']", + "title": "Unicode Characters" + } + ] + }, + { + "key": "simple", + "items": [ "simple.prøp" ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/asf-hack-conditional-required.json b/frontend/src/assets/example-schemas/asf-hack-conditional-required.json new file mode 100755 index 000000000..86a7b243b --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-hack-conditional-required.json @@ -0,0 +1,41 @@ +{ + "schema": { + "type": "object", + "properties": { + "switch": { + "title": "Spam me, please", + "type": "boolean" + }, + "email": { + "title": "Email", + "type": "string", + "pattern": "^\\S+@\\S+$", + "description": "Email will be used for evil." + } + }, + "required": [ + "switch" + ] + }, + "form": [ + { + "type": "help", + "helpvalue": "

Schema Form does not support oneOf (yet), but you can do a workaround and simulate certain scenarios with 'condition' and 'required' (and/or 'readonly') in the form.

" + }, + "switch", + { + "key": "email", + "condition": "model.switch", + "required": true + }, + { + "key": "email", + "condition": "!model.switch" + }, + { + "type": "submit", + "style": "btn-info", + "title": "OK" + } + ] +} \ No newline at end of file diff --git a/frontend/src/assets/example-schemas/asf-kitchen-sink.json b/frontend/src/assets/example-schemas/asf-kitchen-sink.json new file mode 100755 index 000000000..b1059498d --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-kitchen-sink.json @@ -0,0 +1,207 @@ +{ + "schema": { + "type": "object", + "required": [ "name", "shoesizeLeft" ], + "properties": { + "name": { + "title": "Name", + "description": "Gimme yea name lad", + "type": "string", + "pattern": "^[^/]*$", + "minLength": 2 + }, + "invitation": { + "type": "string", + "format": "html", + "title": "Invitation Design", + "description": "Design the invitation in full technicolor HTML" + }, + "favorite": { + "title": "Favorite", + "type": "string", + "enum": [ "undefined", "null", "NaN" ] + }, + "shoesizeLeft": { + "title": "Shoe size (left)", + "default": 42, + "type": "number" + }, + "shoesizeRight": { + "title": "Shoe size (right)", + "default": 42, + "type": "number" + }, + "attributes": { + "type": "object", + "title": "Attributes", + "required": [ "eyecolor" ], + "properties": { + "eyecolor": { + "type": "string", + "format": "color", + "title": "Eye color", + "default": "pink" + }, + "haircolor": { + "type": "string", + "title": "Hair color" + }, + "shoulders": { + "type": "object", + "title": "Shoulders", + "properties": { + "left": { "type": "string", "title": "Left" }, + "right": { "type": "string", "title": "Right" } + } + } + } + }, + "things": { + "type": "array", + "title": "I like...", + "items": { + "type": "string", + "enum": [ "clowns", "compiling", "sleeping" ] + } + }, + "dislike": { + "type": "array", + "title": "I dislike...", + "items": { + "type": "string", + "title": "I hate" + } + }, + "soul": { + "title": "Terms Of Service", + "description": "I agree to sell my undying soul", + "type": "boolean", + "default": true + }, + "soulserial": { + "title": "Soul Serial No", + "type": "string" + }, + "date": { + "title": "Date of party", + "type": "string", + "format": "date" + }, + "radio": { + "title": "Radio type", + "type": "string", + "enum": [ "Transistor", "Tube" ] + }, + "radio2": { + "title": "My Second Radio", + "type": "string", + "enum": [ "Transistor", "Tube" ] + }, + "radiobuttons": { + "type": "string", + "enum": [ "Select me!", "No me!" ] + } + } + }, + "form": [ + { + "type": "fieldset", + "title": "Stuff", + "items": [ + { + "type": "tabs", + "tabs": [ + { + "title": "Simple stuff", + "items": [ + { + "key": "name", + "placeholder": "Check the console", + "onChange": "log(modelValue)", + "feedback": "{ 'glyphicon': true, 'glyphicon-ok': hasSuccess(), 'glyphicon-star': !hasSuccess() }" + }, + { "key": "favorite", "feedback": false } + ] + }, + { + "title": "More stuff", + "items": [ + "attributes.eyecolor", + "attributes.haircolor", + { + "key": "attributes.shoulders.left", + "title": "Left shoulder", + "description": "This value is copied to attributes.shoulders.right in the model", + "copyValueTo": [ "attributes.shoulders.right" ] + }, + { + "key": "shoesizeLeft", + "feedback": false, + "copyValueTo": [ "shoesizeRight" ] + }, + { "key": "shoesizeRight" }, + { + "key": "invitation", + "tinymceOptions": { + "toolbar": [ + "undo redo| styleselect | bold italic | link image", + "alignleft aligncenter alignright" + ] + } + }, + "things", + "dislike" + ] + } + ] + } + ] + }, + { + "type": "help", + "helpvalue": "
" + }, + "soul", + { + "type": "conditional", + "condition": "modelData.soul", + "items": [ { + "key": "soulserial", + "placeholder": "ex. 666" + } ] + }, + { + "key": "date", + "minDate": "2014-06-20" + }, + { + "key": "radio", + "type": "radios", + "titleMap": [ + { "value": "Transistor", "name": "Transistor
Not the tube kind." }, + { "value": "Tube", "name": "Tube
The tube kind." } + ] + }, + { + "key": "radio2", + "type": "radios-inline", + "titleMap": [ + { "value": "Transistor", "name": "Transistor
Not the tube kind." }, + { "value": "Tube", "name": "Tube
The tube kind." } + ] + }, + { + "key": "radiobuttons", + "style": { "selected": "btn-success", "unselected": "btn-default" }, + "type": "radiobuttons", + "notitle": true + }, + { + "type": "actions", + "items": [ + { "type": "submit", "style": "btn-info", "title": "Do It!" }, + { "type": "button", "style": "btn-danger", "title": "Noooooooooooo", "onClick": "sayNo()" } + ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/asf-simple.json b/frontend/src/assets/example-schemas/asf-simple.json new file mode 100755 index 000000000..616adffc6 --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-simple.json @@ -0,0 +1,43 @@ +{ + "schema": { + "type": "object", + "title": "Comment", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "email": { + "title": "Email", + "type": "string", + "pattern": "^\\S+@\\S+$", + "description": "Email will be used for evil." + }, + "comment": { + "title": "Comment", + "type": "string", + "maxLength": 20, + "validationMessage": "Don't be greedy!" + } + }, + "required": [ + "name", + "email", + "comment" + ] + }, + "form": [ + "name", + "email", + { + "key": "comment", + "type": "textarea", + "placeholder": "Make a comment" + }, + { + "type": "submit", + "style": "btn-info", + "title": "OK" + } + ] +} diff --git a/frontend/src/assets/example-schemas/asf-tab-array.json b/frontend/src/assets/example-schemas/asf-tab-array.json new file mode 100755 index 000000000..476cc2db9 --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-tab-array.json @@ -0,0 +1,53 @@ +{ + "schema": { + "type": "object", + "title": "Comment", + "properties": { + "comments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "email": { + "title": "Email", + "type": "string", + "pattern": "^\\S+@\\S+$", + "description": "Email will be used for evil." + }, + "comment": { + "title": "Comment", + "type": "string", + "maxLength": 20, + "validationMessage": "Don't be greedy!" + } + }, + "required": [ "name", "email", "comment" ] + } + } + } + }, + "form": [ { + "type": "help", + "helpvalue": "

Tabbed Array Example

Tab arrays can have tabs to the left, top or right.

" + }, { + "key": "comments", + "type": "tabarray", + "add": "New", + "remove": "Delete", + "style": { "remove": "btn-danger" }, + "title": "{{ value.name || 'Tab ' + $index }}", + "items": [ + "comments[].name", + "comments[].email", + { "key": "comments[].comment", "type": "textarea" } + ] + }, { + "type": "submit", + "style": "btn-default", + "title": "OK" + } ] +} diff --git a/frontend/src/assets/example-schemas/asf-titlemap-examples.json b/frontend/src/assets/example-schemas/asf-titlemap-examples.json new file mode 100755 index 000000000..80d3cdcf8 --- /dev/null +++ b/frontend/src/assets/example-schemas/asf-titlemap-examples.json @@ -0,0 +1,91 @@ +{ + "schema": { + "type": "object", + "properties": { + "select": { + "title": "Select without titleMap", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "select2": { + "title": "Select with titleMap (old style)", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "noenum": { + "type": "string", + "title": "No enum, but forms says it's a select" + }, + "array": { + "title": "Array with enum defaults to 'checkboxes'", + "type": "array", + "items": { + "type": "string", + "enum": [ "a", "b", "c" ] + } + }, + "array2": { + "title": "Array with titleMap", + "type": "array", + "default": [ "b", "c" ], + "items": { + "type": "string", + "enum": [ "a", "b", "c" ] + } + }, + "radios": { + "title": "Basic radio button example", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "radiobuttons": { + "title": "Radio buttons used to switch a boolean", + "type": "boolean", + "default": false + } + } + }, + "form": [ + "select", + { "key": "select2", + "type": "select", + "titleMap": { + "a": "A", + "b": "B", + "c": "C" + } + }, + { "key": "noenum", + "type": "select", + "titleMap": [ + { "value": "a", "name": "A" }, + { "value": "b", "name": "B" }, + { "value": "c", "name": "C" } + ] + }, + "array", + { "key": "array2", + "type": "checkboxes", + "titleMap": [ + { "value": "a", "name": "A" }, + { "value": "b", "name": "B" }, + { "value": "c", "name": "C" } + ] + }, + { "key": "radios", + "type": "radios", + "titleMap": [ + { "value": "c", "name": "C" }, + { "value": "b", "name": "B" }, + { "value": "a", "name": "A" } + ] + }, + { "key": "radiobuttons", + "type": "radiobuttons", + "titleMap": [ + { "name": "No way", "value": false }, + { "name": "OK", "value": true } + ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/jsf-events.json b/frontend/src/assets/example-schemas/jsf-events.json new file mode 100755 index 000000000..c7f9685d5 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-events.json @@ -0,0 +1,22 @@ +{ + "schema": { + "text": { + "type": "string", + "title": "Text" + } + }, + "form": [ { + "key": "text", + "onChange": function (evt) { + var value = $(evt.target).val(); + if (value) alert(value); + } + }, { + "type": "button", + "title": "Click me", + "onClick": function (evt) { + evt.preventDefault(); + alert('Thank you!'); + } + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-factory-sleek.json b/frontend/src/assets/example-schemas/jsf-factory-sleek.json new file mode 100755 index 000000000..12cb9f8c5 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-factory-sleek.json @@ -0,0 +1,70 @@ +{ + "schema": { + "color": { + "title": "Color", + "type": "string", + "enum": [ "blue", "spicy", "gray", "earth", "vegetal" ], + "default":"gray", + "required": true + }, + "backgroundimage" : { + "title": "Background image for TV version", + "type": "object" + }, + "tabs": { + "title": "Tabs titles", + "type": "array", + "items": { + "title": "Short tab title (max. 15 characters)", + "type": "string", + "maxLength": 15 + } + }, + "tabicons": { + "title": "Tabs icons", + "maxLength": 8, + "type": "array", + "items": { + "title": "Tab icon", + "type": "string", + "enum": [ "contact", "event", "map", "news", + "photo", "product", "sound", "status", "video" ] + } + } + }, + "form": [ { + "type": "fieldset", + "legend": "Styles", + "items": [ + "color", + { + "key" : "backgroundimage", + "type": "file-hosted-public" + } + ] + }, { + "type": "fieldset", + "legend": "Tabs", + "items": [ { + "type": "tabarray", + "items": [ { + "type": "section", + "legend": "{{value}}", + "items": [ { + "key": "tabicons[]", + "type": "imageselect", + "imageWidth": 32, + "imageHeight": 42, + "imageButtonClass": "btn-inverse", + "imagePrefix": "app/images/tv-", + "imageSuffix": ".png", + "imageSelectorTitle": "Based on tab data source" + }, { + "key": "tabs[]", + "valueInLegend": true, + "value": "{{values.datasources.main[]}}" + } ] + } ] + } ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-ace.json b/frontend/src/assets/example-schemas/jsf-fields-ace.json new file mode 100755 index 000000000..2c344a0f6 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-ace.json @@ -0,0 +1,16 @@ +{ + "schema": { + "code": { + "type": "string", + "title": "Some JSON" + } + }, + "form": [ { + "key": "code", + "type": "ace", + "aceMode": "json", + "aceTheme": "twilight", + "width": "100%", + "height": "200px" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-actions.json b/frontend/src/assets/example-schemas/jsf-fields-actions.json new file mode 100755 index 000000000..18fcb2021 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-actions.json @@ -0,0 +1,21 @@ +{ + "schema": { + "search": { + "type": "string", + "title": "Search" + } + }, + "form": [ + "search", + { + "type": "actions", + "items": [ { + "type": "submit", + "title": "Submit" + }, { + "type": "button", + "title": "Cancel" + } ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-advancedfieldset.json b/frontend/src/assets/example-schemas/jsf-fields-advancedfieldset.json new file mode 100755 index 000000000..c5f4d9823 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-advancedfieldset.json @@ -0,0 +1,21 @@ +{ + "schema": { + "name": { + "type": "string", + "title": "Name" + }, + "age": { + "type": "number", + "title": "Age" + } + }, + "form": [ + "name", + { + "type": "advancedfieldset", + "items": [ + "age" + ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-array-simple.json b/frontend/src/assets/example-schemas/jsf-fields-array-simple.json new file mode 100755 index 000000000..d3a8f61cc --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-array-simple.json @@ -0,0 +1,39 @@ +{ + "schema": { + "friends": { + "type": "array", + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname" + }, + "animals": { + "type": "array", + "items": { + "type": "string", + "title": "Animal name" + } + } + } + } + } + }, + "form": [ { + "type": "array", + "items": { + "type": "section", + "items": [ + "friends[].nick", + { + "type": "array", + "items": [ + "friends[].animals[]" + ] + } + ] + } + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-array.json b/frontend/src/assets/example-schemas/jsf-fields-array.json new file mode 100755 index 000000000..ef592f592 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-array.json @@ -0,0 +1,62 @@ +{ + "schema": { + "type": "object", + "properties": { + "friendsA": { "$ref": "#/definitions/friends" }, + "friendsB": { "$ref": "#/definitions/friends" } + }, + "definitions": { + "friends": { + "type": "array", + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname" + }, + "animals": { + "type": "array", + "items": { + "type": "string", + "title": "Animal name" + }, + "default": [ "dog", "cat" ] + } + } + } + } + } + }, + "customFormItems": { + "friendsB": { + "type": "array", + "key": "friendsB", + "title": "Friends B", + "readOnly": true, + "items": { + "type": "section", + "items": [ + { + "type": "array", + "key": "friendsB[].animals", + "items": [ + "friendsB[].animals[]" + ] + }, + "friendsB[].nick" + ] + } + } + }, + "value": { + "friendsB": [ { + "nick": "B", + "animals": [ "fish", "bee" ] + }, { + "nick": "B2", + "animals": [ "bee", "cat" ] + } ] + } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-authfieldset.json b/frontend/src/assets/example-schemas/jsf-fields-authfieldset.json new file mode 100755 index 000000000..f778bab9f --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-authfieldset.json @@ -0,0 +1,21 @@ +{ + "schema": { + "name": { + "type": "string", + "title": "Name" + }, + "key": { + "type": "string", + "title": "Access key" + } + }, + "form": [ + "name", + { + "type": "authfieldset", + "items": [ + "key" + ] + } + ] +} \ No newline at end of file diff --git a/frontend/src/assets/example-schemas/jsf-fields-autocomplete.json b/frontend/src/assets/example-schemas/jsf-fields-autocomplete.json new file mode 100755 index 000000000..a1a42ff61 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-autocomplete.json @@ -0,0 +1,40 @@ +{ + "schema": { + "name": { + "title": "Name", + "type": "string" + }, + "nick": { + "title": "Nick name", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "array", + "items": { "type": "string" }, + "default": [ "abc", "def" ] + } + }, + "customFormItems": { + "name": { + "type": "text", + "autocomplete": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } + }, + "nick": { + "type": "text", + "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } + }, + "title": { + "type": "text", + "tagsinput": { "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } } + }, + "tags": { + "type": "tagsinput", + "tagsinput": { "typeahead": { "source": [ "abc", "bed", "bee", "dog", "cat" ] } } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-checkbox.json b/frontend/src/assets/example-schemas/jsf-fields-checkbox.json new file mode 100755 index 000000000..a0bb43104 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-checkbox.json @@ -0,0 +1,37 @@ +{ + "schema": { + "properties": { + "flag": { + "type": "boolean", + "title": "Adult" + }, + "adultOnlyInfo": { + "type": "object", + "properties": { + "field1": { + "title": "Field 1", + "type": "string" + }, + "field2": { + "title": "Field 2", + "type": "integer" + } + }, + "required": [ "field1", "field2" ] + }, + "commonInfo": { + "title": "Common Field", + "type": "string" + } + }, + "dependencies": { + "flag": [ "adultOnlyInfo" ] + } + }, + "customFormItems": { + "flag": { + "inlinetitle": "Check this box if you are over 18", + "toggleNext": 1 + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-checkboxbuttons.json b/frontend/src/assets/example-schemas/jsf-fields-checkboxbuttons.json new file mode 100755 index 000000000..24edaff0c --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-checkboxbuttons.json @@ -0,0 +1,21 @@ +{ + "schema": { + "language": { + "type": "array", + "title": "Best language", + "items": { + "type": "string", + "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ] + } + } + }, + "form": [ { + "key": "language", + "type": "checkboxbuttons", + "activeClass": "btn-success" + }, { + "title": "Submit", + "type": "submit" + } ], + "value": {"language": "Python"} +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-checkboxes.json b/frontend/src/assets/example-schemas/jsf-fields-checkboxes.json new file mode 100755 index 000000000..c262dd4a8 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-checkboxes.json @@ -0,0 +1,75 @@ +{ + "schema": { + "properties": { + "menu": { + "type": "array", + "title": "Options", + "items": { + "type": "string", + "title": "Option", + "enum": [ "starter", "maincourse", "cheese", "dessert", "OTHER" ] + }, + "minItems": 1 + }, + "menuOther": { "type": "string" }, + "menu2": { + "type": "array", + "title": "Options Inline", + "items": { + "type": "string", + "title": "Option", + "enum": [ "starter", "maincourse", "CUSTOME_OTHER_VALUE", "cheese", "dessert" ] + } + }, + "menu2Other": { "type": "string" }, + "menu3": { + "type": "array", + "title": "Options", + "description": "Other field's value as an element of result array", + "items": { + "type": "string" + }, + "minItems": 1 + } + } + }, + "nonDefaultFormItems": [ "menuOther", "menu2Other" ], + "customFormItems": { + "menu": { + "type": "checkboxes", + "titleMap": { + "starter": "Starter would be great", + "maincourse": "No way I'll skip the main course", + "cheese": "Cheddar rules!", + "dessert": "Thumbs up for a dessert" + }, + "otherField": { "key": "menuOther", "inline": true } + }, + "menu2": { + "type": "checkboxes", + "title": "Options inline style", + "inline": true, + "titleMap": { + "starter": "Starter would be great", + "maincourse": "No way I'll skip the main course", + "cheese": "Cheddar rules!", + "dessert": "Thumbs up for a dessert" + }, + "otherField": { + "key": "menu2Other", + "title": "Custom other field title", + "otherValue": "CUSTOME_OTHER_VALUE" + } + }, + "menu3": { + "type": "checkboxes", + "options": { + "starter": "Starter would be great", + "maincourse": "No way I'll skip the main course", + "cheese": "Cheddar rules!", + "dessert": "Thumbs up for a dessert" + }, + "otherField": { "key": "menu3[99]", "type": "text", "asArrayValue": true } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-color.json b/frontend/src/assets/example-schemas/jsf-fields-color.json new file mode 100755 index 000000000..a298d9acc --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-color.json @@ -0,0 +1,9 @@ +{ + "schema": { + "maincolor": { + "type": "string", + "title": "Main color", + "format": "color" + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-common.json b/frontend/src/assets/example-schemas/jsf-fields-common.json new file mode 100755 index 000000000..32c9a6d05 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-common.json @@ -0,0 +1,28 @@ +{ + "schema": { + "shortmood": { + "type": "string", + "title": "Mood of the day", + "description": "Describe how you feel in short", + "default": "happy", + "required": true + }, + "longmood": { + "type": "string", + "title": "Mood of the day", + "description": "Describe how you feel with a rather long adjective-like series of words" + } + }, + "form": [ + "shortmood", + { + "key": "longmood", + "prepend": "I feel", + "append": "today", + "notitle": true, + "htmlClass": "usermood", + "fieldHtmlClass": "input-xxlarge", + "placeholder": "incredibly and admirably great" + } + ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-fieldset.json b/frontend/src/assets/example-schemas/jsf-fields-fieldset.json new file mode 100755 index 000000000..1dc04ac20 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-fieldset.json @@ -0,0 +1,28 @@ +{ + "schema": { + "comment": { + "type": "string", + "title": "Comment" + }, + "name": { + "type": "string", + "title": "Name" + }, + "age": { + "type": "number", + "title": "Age" + } + }, + "form": [ { + "key": "comment", + "type": "textarea" + }, { + "type": "fieldset", + "title": "Author", + "expandable": true, + "items": [ + "name", + "age" + ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-help.json b/frontend/src/assets/example-schemas/jsf-fields-help.json new file mode 100755 index 000000000..b3ec1f68d --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-help.json @@ -0,0 +1,30 @@ +{ + "schema": { + "name": { + "title": "Name", + "description": "Nickname allowed", + "type": "string" + }, + "gender": { + "title": "Gender", + "description": "Your gender", + "type": "string", + "enum": [ + "male", + "female", + "alien" + ] + } + }, + "form": [ + "*", + { + "type": "help", + "helpvalue": "Click on Submit when you're done" + }, + { + "type": "submit", + "title": "Submit" + } + ] +} \ No newline at end of file diff --git a/frontend/src/assets/example-schemas/jsf-fields-hidden.json b/frontend/src/assets/example-schemas/jsf-fields-hidden.json new file mode 100755 index 000000000..89a38a2ad --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-hidden.json @@ -0,0 +1,22 @@ +{ + "schema": { + "apikey": { + "type": "string", + "title": "API key", + "default": "supercalifragilisticexpialidocious" + }, + "text": { + "type": "string", + "title": "Search string" + } + }, + "form": [ { + "key": "apikey", + "type": "hidden" + }, + "text", + { + "type": "submit", + "title": "Search" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-iconselect.json b/frontend/src/assets/example-schemas/jsf-fields-iconselect.json new file mode 100755 index 000000000..4c415243f --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-iconselect.json @@ -0,0 +1,41 @@ +{ + "schema": { + "icon": { + "title": "Choose an icon", + "type": "string", + "enum": [ "glass", "music", "search", "envelope", "heart", "star", + "star-empty", "user", "film", "th-large", "th", "th-list", "ok", + "remove", "zoom-in", "zoom-out", "off", "signal", "cog", "trash", + "home", "file", "time", "road", "download-alt", "download", "upload", + "inbox", "play-circle", "repeat", "refresh", "list-alt", "lock", "flag", + "headphones", "volume-off", "volume-down", "volume-up", "qrcode", + "barcode", "tag", "tags", "book", "bookmark", "print", "camera", "font", + "bold", "italic", "text-height", "text-width", "align-left", + "align-center", "align-right", "align-justify", "list", "indent-left", + "indent-right", "facetime-video", "picture", "pencil", "map-marker", + "adjust", "tint", "edit", "share", "check", "move", "step-backward", + "fast-backward", "backward", "play", "pause", "stop", "forward", + "fast-forward", "step-forward", "eject", "chevron-left", + "chevron-right", "plus-sign", "minus-sign", "remove-sign", "ok-sign", + "question-sign", "info-sign", "screenshot", "remove-circle", + "ok-circle", "ban-circle", "arrow-left", "arrow-right", "arrow-up", + "arrow-down", "share-alt", "resize-full", "resize-small", "plus", + "minus", "asterisk", "exclamation-sign", "gift", "leaf", "fire", + "eye-open", "eye-close", "warning-sign", "plane", "calendar", "random", + "comment", "magnet", "chevron-up", "chevron-down", "retweet", + "shopping-cart", "folder-close", "folder-open", "resize-vertical", + "resize-horizontal", "hdd", "bullhorn", "bell", "certificate", + "thumbs-up", "thumbs-down", "hand-right", "hand-left", "hand-up", + "hand-down", "circle-arrow-right", "circle-arrow-left", + "circle-arrow-up", "circle-arrow-down", "globe", "wrench", "tasks", + "filter", "briefcase", "fullscreen" ] + } + }, + "form": [ { + "key": "icon", + "type": "iconselect", + "imageButtonClass": "btn", + "imageSelectorColumns": 10, + "imageSelectorTitle": "Select an icon" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-imageselect.json b/frontend/src/assets/example-schemas/jsf-fields-imageselect.json new file mode 100755 index 000000000..2959e5ec1 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-imageselect.json @@ -0,0 +1,24 @@ +{ + "schema": { + "icon": { + "title": "Choose an icon", + "type": "string", + "enum": [ + "address-book", "archive", "balloon", + "calendar", "camera", "cd", "disk", + "heart", "home", "mail" + ] + } + }, + "form": [ { + "key": "icon", + "type": "imageselect", + "imageWidth": 64, + "imageHeight": 64, + "imageButtonClass": "btn-inverse", + "imagePrefix": "http://icons.iconarchive.com/icons/double-j-design/origami-colored-pencil/64/blue-", + "imageSuffix": "-icon.png", + "imageSelectorColumns": 4, + "imageSelectorTitle": "Random choice" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-password.json b/frontend/src/assets/example-schemas/jsf-fields-password.json new file mode 100755 index 000000000..8c426e6cb --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-password.json @@ -0,0 +1,12 @@ +{ + "schema": { + "pwd": { + "type": "string", + "title": "Your secret" + } + }, + "form": [ { + "key": "pwd", + "type": "password" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-questions.json b/frontend/src/assets/example-schemas/jsf-fields-questions.json new file mode 100755 index 000000000..4e52db60d --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-questions.json @@ -0,0 +1,42 @@ +{ + "schema": { + "response": { + "type": "string", + "title": "Search" + } + }, + "form": [ { + "type": "questions", + "key": "response", + "title": "Let's check your mood", + "items": [ { + "type": "question", + "title": "Are you happy?", + "activeClass": "btn-success", + "optionsType": "radiobuttons", + "options": [ { + "title": "Yes", + "value": "happy", + "next": "q2", + "htmlClass": "btn-primary" + }, { + "title": "No", + "value": "sad", + "submit": true + } ] + }, { + "type": "question", + "qid": "q2", + "title": "Really happy?", + "options": [ { + "title": "Yes", + "value": "reallyhappy", + "submit": true + }, { + "title": "No", + "value": "happy", + "submit": true + } ] + } ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-radiobuttons.json b/frontend/src/assets/example-schemas/jsf-fields-radiobuttons.json new file mode 100755 index 000000000..8d15ce648 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-radiobuttons.json @@ -0,0 +1,30 @@ +{ + "schema": { + "language": { + "type": "string", + "title": "Best language", + "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ] + }, + "favourite": { + "type": "boolean", + "title": "Is it your favourite?" + } + }, + "form": [ { + "key": "language", + "type": "radiobuttons", + "activeClass": "btn-success" + }, { + "key": "favourite", + "type": "radiobuttons", + "activeClass": "btn-danger", + "titleMap": { + "true": "Yes", + "false": "No" + } + }, { + "title": "Submit", + "type": "submit" + } ], + "value": { "language": "Python" } +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-radios.json b/frontend/src/assets/example-schemas/jsf-fields-radios.json new file mode 100755 index 000000000..03b247d42 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-radios.json @@ -0,0 +1,48 @@ +{ + "schema": { + "language": { + "type": "string", + "title": "Best language", + "enum": [ "JavaScript", "Python", "PHP", "Java", "C++", "other" ] + }, + "fantastic": { + "type": "boolean", + "title": "Is it fantastic?", + "required": true + }, + "cool": { + "type": "boolean", + "title": "Is it cool?" + }, + "cool2": { + "type": "boolean", + "title": "Is it cool again?" + } + }, + "form": [ { + "key": "language", + "type": "radios" + }, { + "key": "fantastic", + "type": "radios", + "inline": true, + "toggleNextMap": { "true": true } + }, { + "key": "cool", + "type": "radios", + "titleMap": { + "false": "Not at all", + "true": "Very cool" + } + }, { + "key": "cool2", + "type": "radios", + "options": { + "false": "Not at all", + "true": "Very cool" + } + }, { + "title": "Submit", + "type": "submit" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-range.json b/frontend/src/assets/example-schemas/jsf-fields-range.json new file mode 100755 index 000000000..475be3c81 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-range.json @@ -0,0 +1,18 @@ +{ + "schema": { + "range": { + "type": "integer", + "title": "Is JSON Form useful?", + "description": "The field should appear as a range that accepts values between 0 (excluded) and 200 by steps of 20 on browsers that support the \"range\" input type.
Note that the \"step\" constraint is not enforced when the form is submitted.", + "default": 40, + "minimum": 0, + "exclusiveMinimum": true, + "maximum": 200 + } + }, + "form": [ { + "key": "range", + "type": "range", + "step": 20 + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-section.json b/frontend/src/assets/example-schemas/jsf-fields-section.json new file mode 100755 index 000000000..bade5f07d --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-section.json @@ -0,0 +1,27 @@ +{ + "schema": { + "comment": { + "type": "string", + "title": "Comment" + }, + "name": { + "type": "string", + "title": "Name" + }, + "age": { + "type": "number", + "title": "Age" + } + }, + "form": [ { + "key": "comment", + "type": "textarea" + }, { + "type": "section", + "title": "Author", + "items": [ + "name", + "age" + ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-select.json b/frontend/src/assets/example-schemas/jsf-fields-select.json new file mode 100755 index 000000000..150ba1b2b --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-select.json @@ -0,0 +1,54 @@ +{ + "schema": { + "gender": { + "type": "string", + "title": "Gender", + "enum": [ "male", "female", "alien" ] + }, + "gender2": { + "type": "string", + "title": "Gender", + "enum": [ "male", "female", "alien" ], + "required": true + }, + "ismale": { + "type": "boolean", + "title": "Is male?" + }, + "isfemale": { + "type": "boolean", + "title": "Is female?" + } + }, + "form": [ { + "key": "gender", + "titleMap": { + "male": "Dude", + "female": "Dudette", + "alien": "I'm from outer space!" + } + }, { + "key": "gender2", + "title": "Gender re-ordered", + "options": { + "": "Please select", + "alien": "I'm from outer space!", + "male": "Dude", + "female": "Dudette" + } + }, { + "key": "ismale", + "type": "select", + "required": true + }, { + "key": "isfemale", + "type": "select", + "titleMap": { + "false": "No", + "true": "Yes" + } + }, { + "title": "Submit", + "type": "submit" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-selectfieldset-key.json b/frontend/src/assets/example-schemas/jsf-fields-selectfieldset-key.json new file mode 100755 index 000000000..a7555e35c --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-selectfieldset-key.json @@ -0,0 +1,31 @@ +{ + "schema": { + "choice": { + "type": "string", + "enum": [ "text", "cat" ] + }, + "text": { + "type": "string", + "title": "Text" + }, + "category": { + "type": "string", + "title": "Category", + "enum": [ "Geography", "Entertainment", + "History", "Arts", "Science", "Sports" ] + } + }, + "form": [ { + "type": "selectfieldset", + "key": "choice", + "title": "Make a choice", + "titleMap": { + "text": "Search by text", + "cat": "Search by category" + }, + "items": [ "text", "category" ] + }, { + "type": "submit", + "value": "Submit" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-selectfieldset.json b/frontend/src/assets/example-schemas/jsf-fields-selectfieldset.json new file mode 100755 index 000000000..c88ba57fa --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-selectfieldset.json @@ -0,0 +1,28 @@ +{ + "schema": { + "text": { + "type": "string", + "title": "Text" + }, + "category": { + "type": "string", + "title": "Category", + "enum": [ "Geography", "Entertainment", + "History", "Arts", "Science", "Sports" ] + } + }, + "form": [ { + "type": "selectfieldset", + "title": "Make a choice", + "items": [ { + "key": "text", + "legend": "Search by text" + }, { + "key": "category", + "legend": "Search by category" + } ] + }, { + "type": "submit", + "title": "Submit" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-submit.json b/frontend/src/assets/example-schemas/jsf-fields-submit.json new file mode 100755 index 000000000..aff72771a --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-submit.json @@ -0,0 +1,22 @@ +{ + "schema": { + "name": { + "title": "Name", + "description": "Nickname allowed", + "type": "string" + }, + "gender": { + "title": "Gender", + "description": "Your gender", + "type": "string", + "enum": [ "male", "female", "alien" ] + } + }, + "form": [ + "*", + { + "type": "submit", + "title": "OK Go - This Too Shall Pass" + } + ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-tabarray-maxitems.json b/frontend/src/assets/example-schemas/jsf-fields-tabarray-maxitems.json new file mode 100755 index 000000000..a47501146 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-tabarray-maxitems.json @@ -0,0 +1,41 @@ +{ + "schema": { + "friends": { + "type": "array", + "maxItems": 3, + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname" + }, + "animals": { + "type": "array", + "maxItems": 2, + "items": { + "type": "string", + "title": "Animal name" + } + } + } + } + } + }, + "form": [ { + "type": "tabarray", + "items": { + "type": "section", + "items": [ + "friends[].nick", + { + "type": "array", + "items": [ + "friends[].animals[]" + ] + } + ] + } + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-tabarray-value.json b/frontend/src/assets/example-schemas/jsf-fields-tabarray-value.json new file mode 100755 index 000000000..df150cdf8 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-tabarray-value.json @@ -0,0 +1,23 @@ +{ + "schema": { + "thoughts": { + "type": "array", + "items": { + "type": "string", + "title": "Thought", + "default": "wtf" + } + } + }, + "form": [ { + "type": "tabarray", + "items": [ { + "type": "section", + "legend": "{{idx}}. {{value}}", + "items": [ { + "key": "thoughts[]", + "valueInLegend": true + } ] + } ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-tabarray.json b/frontend/src/assets/example-schemas/jsf-fields-tabarray.json new file mode 100755 index 000000000..6bc445ae9 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-tabarray.json @@ -0,0 +1,39 @@ +{ + "schema": { + "friends": { + "type": "array", + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname" + }, + "animals": { + "type": "array", + "items": { + "type": "string", + "title": "Animal name" + } + } + } + } + } + }, + "form": [ { + "type": "tabarray", + "items": { + "type": "section", + "items": [ + "friends[].nick", + { + "type": "array", + "items": [ + "friends[].animals[]" + ] + } + ] + } + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-fields-textarea.json b/frontend/src/assets/example-schemas/jsf-fields-textarea.json new file mode 100755 index 000000000..83963a97d --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-fields-textarea.json @@ -0,0 +1,12 @@ +{ + "schema": { + "comment": { + "type": "string", + "title": "Your thoughts" + } + }, + "form": [ { + "key": "comment", + "type": "textarea" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-gettingstarted.json b/frontend/src/assets/example-schemas/jsf-gettingstarted.json new file mode 100755 index 000000000..e41c6adf7 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-gettingstarted.json @@ -0,0 +1,14 @@ +{ + "schema": { + "field": { + "type": "string", + "title": "A field" + } + }, + "form": [ { + "key": "field" + }, { + "type": "submit", + "title": "Submit" + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-previousvalues-multidimensional.json b/frontend/src/assets/example-schemas/jsf-previousvalues-multidimensional.json new file mode 100755 index 000000000..8a30f9af6 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-previousvalues-multidimensional.json @@ -0,0 +1,22 @@ +{ + "schema": { + "reminders": { + "type": "array", + "title": "Reminders", + "items": { + "type": "array", + "title": "Task List", + "items": { + "type": "string" + } + } + } + }, + "value": { + "reminders": [ + [ "Buy clothes", "Pick up kids" ], + [ "Call John", "Send email" ], + [ "Wash car" ] + ] + } +} diff --git a/frontend/src/assets/example-schemas/jsf-previousvalues.json b/frontend/src/assets/example-schemas/jsf-previousvalues.json new file mode 100755 index 000000000..140b61321 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-previousvalues.json @@ -0,0 +1,34 @@ +{ + "schema": { + "friends": { + "type": "array", + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname", + "required": true + }, + "gender": { + "type": "string", + "title": "Gender", + "enum": [ "male", "female", "alien" ] + }, + "age": { + "type": "integer", + "title": "Age" + } + } + } + } + }, + "value": { + "friends": [ + { "nick": "tidoust", "gender": "male", "age": 34 }, + { "nick": "titine", "gender": "female", "age": 6 }, + { "nick": "E.T.", "gender": "alien" } + ] + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-array.json b/frontend/src/assets/example-schemas/jsf-schema-array.json new file mode 100755 index 000000000..8f7ad7244 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-array.json @@ -0,0 +1,27 @@ +{ + "schema": { + "friends": { + "type": "array", + "items": { + "type": "object", + "title": "Friend", + "properties": { + "nick": { + "type": "string", + "title": "Nickname", + "required": true + }, + "gender": { + "type": "string", + "title": "Gender", + "enum": [ "male", "female", "alien" ] + }, + "age": { + "type": "integer", + "title": "Age" + } + } + } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-basic.json b/frontend/src/assets/example-schemas/jsf-schema-basic.json new file mode 100755 index 000000000..dc7da41af --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-basic.json @@ -0,0 +1,15 @@ +{ + "schema": { + "name": { + "title": "Name", + "description": "Nickname allowed", + "type": "string" + }, + "gender": { + "title": "Gender", + "description": "Your gender", + "type": "string", + "enum": [ "male", "female", "alien" ] + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-default.json b/frontend/src/assets/example-schemas/jsf-schema-default.json new file mode 100755 index 000000000..82df29cf0 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-default.json @@ -0,0 +1,47 @@ +{ + "schema": { + "friends": { + "type": "array", + "default": [ "foo", "bar" ], + "readOnly": true, + "items": { + "type": "string", + "title": "Name", + "readOnly": true + } + }, + "fiends": { + "type": "array", + "default": [ + { "name": "bob", "age": 24 }, + { "name": "alice", "age": 42 } + ], + "readOnly": true, + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "named" + }, + "age": { + "type": "integer", + "title": "Age", + "default": 29 + }, + "address": { + "title": "Address", + "type": "object", + "properties": { + "street": { "type": "string" }, + "zip": { "type": "string" }, + "city": { "type": "string" } + }, + "default": { "zip": "N/A" } + } + }, + "default": { "name": "ah", "age": 55 } + } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-inlineref.json b/frontend/src/assets/example-schemas/jsf-schema-inlineref.json new file mode 100755 index 000000000..f6a8b25f6 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-inlineref.json @@ -0,0 +1,29 @@ +{ + "schema": { + "properties": { + "animal": { "$ref": "#/definitions/animation" } + }, + "definitions": { + "animation": { + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "type": "integer" + }, + "stepper": { + "title": "Stepper", + "type": "string" + }, + "then": { + "title": "Then", + "type": "array", + "maxItems": 1, + "items": { "$ref": "#/definitions/animation" }, + "default": [] + } + } + } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-morecomplex.json b/frontend/src/assets/example-schemas/jsf-schema-morecomplex.json new file mode 100755 index 000000000..efcf1cc07 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-morecomplex.json @@ -0,0 +1,28 @@ +{ + "schema": { + "message": { + "type": "string", + "title": "Message" + }, + "author": { + "type": "object", + "title": "Author", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "gender": { + "type": "string", + "title": "Gender", + "enum": [ "male", "female", "alien" ] + }, + "magic": { + "type": "integer", + "title": "Magic number", + "default": 42 + } + } + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-schema-required.json b/frontend/src/assets/example-schemas/jsf-schema-required.json new file mode 100755 index 000000000..ea3e82d93 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-schema-required.json @@ -0,0 +1,68 @@ +{ + "schema": { + "v3customer": { + "title": "Customer", + "description": "json-schema v3 style 'required'", + "type": "object", + "required": true, + "properties": { + "name": { + "required": true, + "title": "Name", + "type": "string" + }, + "address": { + "title": "Address", + "type": "object", + "properties": { + "city": { + "required": true, + "title": "City", + "type": "string" + }, + "street": { + "required": true, + "title": "Street", + "type": "string" + }, + "zip": { + "title": "Zip", + "type": "string" + } + } + } + } + }, + "v4customer": { + "title": "CustomerV4", + "description": "json-schema v4 style 'required'", + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "address": { + "title": "Address", + "type": "object", + "properties": { + "city": { + "title": "City", + "type": "string" + }, + "street": { + "title": "Street", + "type": "string" + }, + "zip": { + "title": "Zip", + "type": "string" + } + }, + "required": [ "street", "city" ] + } + }, + "required": [ "name" ] + } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-templating-idx.json b/frontend/src/assets/example-schemas/jsf-templating-idx.json new file mode 100755 index 000000000..32e6eac06 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-templating-idx.json @@ -0,0 +1,18 @@ +{ + "schema": { + "thoughts": { + "type": "array", + "items": { + "title": "A thought", + "type": "string" + } + } + }, + "form": [ { + "type": "array", + "items": [ { + "key": "thoughts[]", + "title": "Thought number {{idx}}" + } ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-templating-tpldata.json b/frontend/src/assets/example-schemas/jsf-templating-tpldata.json new file mode 100755 index 000000000..56927b6c9 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-templating-tpldata.json @@ -0,0 +1,15 @@ +{ + "schema": { + "age": { + "type": "integer", + "title": "Age" + } + }, + "form": [ { + "key": "age", + "title": "{{user.name}}'s age" + } ], + "tpldata": { + "user": { "name": "tidoust" } + } +} diff --git a/frontend/src/assets/example-schemas/jsf-templating-value.json b/frontend/src/assets/example-schemas/jsf-templating-value.json new file mode 100755 index 000000000..29c0489e2 --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-templating-value.json @@ -0,0 +1,25 @@ +{ + "schema": { + "thoughts": { + "type": "array", + "title": "Thoughts", + "items": { + "type": "string", + "title": "A thought", + "default": "Grmpf" + } + } + }, + "form": [ { + "type": "tabarray", + "items": [ { + "type": "section", + "legend": "{{idx}}. {{value}}", + "items": [ { + "key": "thoughts[]", + "title": "Thought {{idx}}", + "valueInLegend": true + } ] + } ] + } ] +} diff --git a/frontend/src/assets/example-schemas/jsf-templating-values.json b/frontend/src/assets/example-schemas/jsf-templating-values.json new file mode 100755 index 000000000..6283b0bca --- /dev/null +++ b/frontend/src/assets/example-schemas/jsf-templating-values.json @@ -0,0 +1,19 @@ +{ + "schema": { + "firstname": { "type": "string", "title": "First name" }, + "lastname": { "type": "string", "title": "Last name" }, + "fullname": { "type": "string", "title": "Full name" } + }, + "form": [ + "firstname", + "lastname", + { + "key": "fullname", + "value": "{{values.firstname}} {{values.lastname}}" + } + ], + "value": { + "firstname": "François", + "lastname": "Daoust" + } +} diff --git a/frontend/src/assets/example-schemas/json-schema-draft01.json b/frontend/src/assets/example-schemas/json-schema-draft01.json new file mode 100644 index 000000000..214afb6e3 --- /dev/null +++ b/frontend/src/assets/example-schemas/json-schema-draft01.json @@ -0,0 +1,81 @@ +{ + "$schema" : "http://json-schema.org/draft-01/hyper-schema#", + "id" : "http://json-schema.org/draft-01/schema#", + "type" : "object", + "properties" : { + "type" : { + "type" : [ "string", "array" ], + "items" : { "type" : [ "string", { "$ref" : "#" } ] }, + "optional" : true, + "default" : "any" + }, + "properties" : { + "type" : "object", + "additionalProperties" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + }, + "items" : { + "type" : [ { "$ref" : "#" }, "array" ], + "items" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + }, + "optional" : { "type" : "boolean", "optional" : true, "default" : false }, + "additionalProperties" : { + "type" : [ { "$ref" : "#" }, "boolean" ], + "optional" : true, + "default" : {} + }, + "requires" : { "type" : [ "string", { "$ref" : "#" } ], "optional" : true }, + "minimum" : { "type" : "number", "optional" : true }, + "maximum" : { "type" : "number", "optional" : true }, + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true + }, + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true + }, + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + "maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 }, + "pattern" : { "type" : "string", "optional" : true, "format" : "regex" }, + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + "maxLength" : { "type" : "integer", "optional" : true }, + "enum" : { "type" : "array", "optional" : true, "minItems" : 1 }, + "title" : { "type" : "string", "optional" : true }, + "description" : { "type" : "string", "optional" : true }, + "format" : { "type" : "string", "optional" : true }, + "contentEncoding" : { "type" : "string", "optional" : true }, + "default" : { "type" : "any", "optional" : true }, + "maxDecimal" : { "type" : "integer", "optional" : true, "minimum" : 0 }, + "disallow" : { + "type" : [ "string", "array" ], + "items" : { "type" : "string" }, + "optional" : true + }, + "extends" : { + "type" : [ { "$ref" : "#" }, "array" ], + "items" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + } + }, + "optional" : true, + "default" : {} +} diff --git a/frontend/src/assets/example-schemas/json-schema-draft02.json b/frontend/src/assets/example-schemas/json-schema-draft02.json new file mode 100644 index 000000000..2319aa422 --- /dev/null +++ b/frontend/src/assets/example-schemas/json-schema-draft02.json @@ -0,0 +1,95 @@ +{ + "$schema" : "http://json-schema.org/draft-02/hyper-schema#", + "id" : "http://json-schema.org/draft-02/schema#", + "type" : "object", + "properties" : { + "type" : { + "type" : [ "string", "array" ], + "items" : { "type" : [ "string", { "$ref" : "#" } ] }, + "optional" : true, + "uniqueItems" : true, + "default" : "any" + }, + "properties" : { + "type" : "object", + "additionalProperties" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + }, + "items" : { + "type" : [ { "$ref" : "#" }, "array" ], + "items" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + }, + "optional" : { "type" : "boolean", "optional" : true, "default" : false }, + "additionalProperties" : { + "type" : [ { "$ref" : "#" }, "boolean" ], + "optional" : true, + "default" : {} + }, + "requires" : { "type" : [ "string", { "$ref" : "#" } ], "optional" : true }, + "minimum" : { "type" : "number", "optional" : true }, + "maximum" : { "type" : "number", "optional" : true }, + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true + }, + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true + }, + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + "maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 }, + "uniqueItems" : { "type" : "boolean", "optional" : true, "default" : false }, + "pattern" : { "type" : "string", "optional" : true, "format" : "regex" }, + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + "maxLength" : { "type" : "integer", "optional" : true }, + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1, + "uniqueItems" : true + }, + "title" : { "type" : "string", "optional" : true }, + "description" : { "type" : "string", "optional" : true }, + "format" : { "type" : "string", "optional" : true }, + "contentEncoding" : { "type" : "string", "optional" : true }, + "default" : { "type" : "any", "optional" : true }, + "divisibleBy" : { + "type" : "number", + "minimum" : 0, + "minimumCanEqual" : false, + "optional" : true, + "default" : 1 + }, + "disallow" : { + "type" : [ "string", "array" ], + "items" : { "type" : "string" }, + "optional" : true, + "uniqueItems" : true + }, + "extends" : { + "type" : [ { "$ref" : "#" }, "array" ], + "items" : { "$ref" : "#" }, + "optional" : true, + "default" : {} + } + }, + "optional" : true, + "default" : {} +} diff --git a/frontend/src/assets/example-schemas/json-schema-draft03.json b/frontend/src/assets/example-schemas/json-schema-draft03.json new file mode 100755 index 000000000..11e57d5d3 --- /dev/null +++ b/frontend/src/assets/example-schemas/json-schema-draft03.json @@ -0,0 +1,84 @@ +{ + "$schema": "http://json-schema.org/draft-03/schema#", + "id": "http://json-schema.org/draft-03/schema#", + "type": "object", + "properties": { + "type": { + "type": [ "string", "array" ], + "items": { "type": [ "string", { "$ref": "#" } ] }, + "uniqueItems": true, + "default": "any" + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": { } + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": { } + }, + "additionalProperties": { + "type": [ { "$ref": "#" }, "boolean" ], + "default": { } + }, + "items": { + "type": [ { "$ref": "#" }, "array" ], + "items": { "$ref": "#" }, + "default": { } + }, + "additionalItems": { + "type": [ { "$ref": "#" }, "boolean" ], + "default": { } + }, + "required": { "type": "boolean", "default": false }, + "dependencies": { + "type": "object", + "additionalProperties": { + "type": [ "string", "array", { "$ref": "#" } ], + "items": { "type": "string" } + }, + "default": { } + }, + "minimum": { "type": "number" }, + "maximum": { "type": "number" }, + "exclusiveMinimum": { "type": "boolean", "default": false }, + "exclusiveMaximum": { "type": "boolean", "default": false }, + "minItems": { "type": "integer", "minimum": 0, "default": 0 }, + "maxItems": { "type": "integer", "minimum": 0 }, + "uniqueItems": { "type": "boolean", "default": false }, + "pattern": { "type": "string", "format": "regex" }, + "minLength": { "type": "integer", "minimum": 0, "default": 0 }, + "maxLength": { "type": "integer" }, + "enum": { "type": "array", "minItems": 1, "uniqueItems": true }, + "default": { "type": "any" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "format": { "type": "string" }, + "divisibleBy": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true, + "default": 1 + }, + "disallow": { + "type": [ "string", "array" ], + "items": { "type": [ "string", { "$ref": "#" } ] }, + "uniqueItems": true + }, + "extends": { + "type": [ { "$ref": "#" }, "array" ], + "items": { "$ref": "#" }, + "default": { } + }, + "id": { "type": "string", "format": "uri" }, + "$ref": { "type": "string", "format": "uri" }, + "$schema": { "type": "string", "format": "uri" } + }, + "dependencies": { + "exclusiveMinimum": "minimum", + "exclusiveMaximum": "maximum" + }, + "default": { } +} diff --git a/frontend/src/assets/example-schemas/json-schema-draft04.json b/frontend/src/assets/example-schemas/json-schema-draft04.json new file mode 100755 index 000000000..267b5e096 --- /dev/null +++ b/frontend/src/assets/example-schemas/json-schema-draft04.json @@ -0,0 +1,88 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { "type": "array", "minItems": 1, "items": { "$ref": "#" } }, + "positiveInteger": { "type": "integer", "minimum": 0 }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { "enum": [ + "array", "boolean", "integer", "null", "number", "object", "string" + ] }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { "type": "string", "format": "uri" }, + "$schema": { "type": "string", "format": "uri" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "default": { }, + "multipleOf": { "type": "number", "minimum": 0, "exclusiveMinimum": true }, + "maximum": { "type": "number" }, + "exclusiveMaximum": { "type": "boolean", "default": false }, + "minimum": { "type": "number" }, + "exclusiveMinimum": { "type": "boolean", "default": false }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { "type": "string", "format": "regex" }, + "additionalItems": { + "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": { } + }, + "items": { + "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], + "default": { } + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { "type": "boolean", "default": false }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ { "type": "boolean" }, { "$ref": "#" } ], "default": { } + }, + "definitions": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": { } + }, + "properties": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": { } + }, + "patternProperties": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": { } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/stringArray" } ] + } + }, + "enum": { "type": "array", "minItems": 1, "uniqueItems": true }, + "type": { + "anyOf": [ { + "$ref": "#/definitions/simpleTypes" + }, { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } ] + }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": { } +} diff --git a/frontend/src/assets/example-schemas/json-schema-draft06.json b/frontend/src/assets/example-schemas/json-schema-draft06.json new file mode 100755 index 000000000..ec3c8c9ac --- /dev/null +++ b/frontend/src/assets/example-schemas/json-schema-draft06.json @@ -0,0 +1,77 @@ +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "$id": "http://json-schema.org/draft-06/schema#", + "title": "Core schema meta-schema", + "definitions": { + "schemaArray": { "type": "array", "minItems": 1, "items": { "$ref": "#" } }, + "nonNegativeInteger": { "type": "integer", "minimum": 0 }, + "nonNegativeIntegerDefault0": { "allOf": [ + { "$ref": "#/definitions/nonNegativeInteger" }, { "default": 0 } + ] }, + "simpleTypes": { "enum": [ + "array", "boolean", "integer", "null", "number", "object", "string" + ] }, + "stringArray": { + "type": "array", "items": { "type": "string" }, "uniqueItems": true, "default": [] + } + }, + "type": [ "object", "boolean" ], + "properties": { + "$id": { "type": "string", "format": "uri-reference" }, + "$schema": { "type": "string", "format": "uri" }, + "$ref": { "type": "string", "format": "uri-reference" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "default": {}, + "multipleOf": { "type": "number", "exclusiveMinimum": 0 }, + "maximum": { "type": "number" }, + "exclusiveMaximum": { "type": "number" }, + "minimum": { "type": "number" }, + "exclusiveMinimum": { "type": "number" }, + "maxLength": { "$ref": "#/definitions/nonNegativeInteger" }, + "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "pattern": { "type": "string", "format": "regex" }, + "additionalItems": { "$ref": "#" }, + "items": { + "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/nonNegativeInteger" }, + "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "uniqueItems": { "type": "boolean", "default": false }, + "contains": { "$ref": "#" }, + "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" }, + "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { "$ref": "#" }, + "definitions": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} + }, + "properties": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} + }, + "patternProperties": { + "type": "object", "additionalProperties": { "$ref": "#" }, "default": {} + }, + "dependencies": { "type": "object", "additionalProperties": { + "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/stringArray" } ] + } }, + "propertyNames": { "$ref": "#" }, + "const": {}, + "enum": { "type": "array", "minItems": 1, "uniqueItems": true }, + "type": { "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] }, + "format": { "type": "string" }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "default": {} +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-data-only.json b/frontend/src/assets/example-schemas/ng-jsf-data-only.json new file mode 100755 index 000000000..1b7a3922c --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-data-only.json @@ -0,0 +1,20 @@ +{ + "data": { + "first_name": "Jane", + "last_name": "Doe", + "age": 25, + "is_company": false, + "address": { + "street_1": "123 Main St.", + "street_2": null, + "city": "Las Vegas", + "state": "NV", + "zip_code": "89123" + }, + "phone_numbers": [ + { "number": "702-123-4567", "type": "cell" }, + { "number": "702-987-6543", "type": "work" } + ], + "notes": "" + } +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-deep-ref.json b/frontend/src/assets/example-schemas/ng-jsf-deep-ref.json new file mode 100644 index 000000000..71f950b23 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-deep-ref.json @@ -0,0 +1,53 @@ +{ + "schema": { + "definitions": { + "int": { + "type": "number", + "minimum": 0, + "maximum": 10 + }, + "string": { + "type": "string", + "minLength": 0 + }, + "valueItem": { + "type": "object", + "properties": { "value": { "$ref": "#/definitions/int" } } + }, + "valueItemArray": { + "type": "array", + "items": { "$ref": "#/definitions/valueItemArray" } + }, + "dtoArray": { + "type": "array", + "items": { "$ref": "#/definitions/staffLanguageLevelDto" } + }, + "staffLanguageLevelDto": { + "type": "object", + "properties": { + "id": { "$ref": "#/definitions/int" }, + "staffId": { "allOf" : [ + { "$ref": "#/definitions/int" }, + { "maximum": 5, + "title": "staffId (overriden maximum)" } + ] }, + "languageId": { "allOf" : [ + { "$ref": "#/definitions/valueItem" }, + { "title": "languageId (object with custom title)" } + ] }, + "languageLevelId": { "$ref": "#/definitions/int" }, + "languageName2": { "allOf" : [ + { "$ref": "#/definitions/string" }, + { "default": "ole", + "maxLength": 3, + "title": "languageName2 (custom default & maxLength)" } + ] }, + "languageLevelName": { "$ref": "#/definitions/dtoArray" } + } + } + }, + "properties": { + "staffLanguageLevelDto": { "$ref": "#/definitions/staffLanguageLevelDto" } + } + } +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-flex-layout.json b/frontend/src/assets/example-schemas/ng-jsf-flex-layout.json new file mode 100755 index 000000000..60d3dcd51 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-flex-layout.json @@ -0,0 +1,101 @@ +{ + "schema": { + "type": "object", + "properties": { + "first_name": { "type": "string" }, + "last_name": { "type": "string" }, + "address": { + "type": "object", + "properties": { + "street_1": { "type": "string" }, + "street_2": { "type": "string" }, + "city": { "type": "string" }, + "state": { + "type": "string", + "enum": [ "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", + "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", + "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", + "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", + "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", + "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV", "WI", "WY" ] + }, + "zip_code": { "type": "string" } + } + }, + "birthday": { "type": "string" }, + "notes": { "type": "string" }, + "phone_numbers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { "type": "string", "enum": [ "cell", "home", "work" ] }, + "number": { "type": "string" } + }, + "required": [ "type", "number" ] + } + } + }, + "required": [ "last_name" ] + }, + "layout": [ + { "type": "flex", "flex-flow": "row wrap", "items": [ "first_name", "last_name" ] }, + { "key": "address.street_1", "title": "Address", "placeholder": "Street" }, + { "key": "address.street_2", "notitle": true }, + { "type": "div", + "display": "flex", + "flex-direction": "row", + "items": [ + { "key": "address.city", "flex": "3 3 150px", + "notitle": true, "placeholder": "City" + }, + { "key": "address.state", "flex": "1 1 50px", + "notitle": true, "placeholder": "State" + }, + { "key": "address.zip_code", "flex": "2 2 100px", + "notitle": true, "placeholder": "Zip Code" + } + ] + }, + { "key": "birthday", "type": "date" }, + { "key": "phone_numbers", + "type": "array", + "listItems": 3, + "items": [ { + "type": "div", + "displayFlex": true, + "flex-direction": "row", + "items": [ + { "key": "phone_numbers[].type", "flex": "1 1 50px", + "notitle": true, "placeholder": "Type" + }, + { "key": "phone_numbers[].number", "flex": "4 4 200px", + "notitle": true, "placeholder": "Phone Number" + } + ] + } ] + }, + { "type": "section", + "title": "Notes", + "expandable": true, + "expanded": false, + "items": [ { "key": "notes", "type": "textarea", "notitle": true } ] + } + ], + "data": { + "first_name": "Jane", + "last_name": "Doe", + "address": { + "street_1": "123 Main St.", + "city": "Las Vegas", + "state": "NV", + "zip_code": "89123" + }, + "birthday": "1999-09-09", + "phone_numbers": [ + { "type": "cell", "number": "702-123-4567" }, + { "type": "work", "number": "702-987-6543" } + ], + "notes": "(This is an example of an uninteresting note.)" + } +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-layout-only.json b/frontend/src/assets/example-schemas/ng-jsf-layout-only.json new file mode 100755 index 000000000..0f7b31592 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-layout-only.json @@ -0,0 +1,25 @@ +{ + "layout": [ + { "type": "section", "title": "Name", "required": true, + "items": [ + "first_name", + "last_name" + ] + }, + { "key": "age", "type": "integer" }, + { "key": "is_company", "title": "Is this a company?", "type": "checkbox" }, + { "key": "address.street_1", "title": "Address" }, + { "key": "address.street_2", "notitle": true }, + "address.city", + "address.state", + "address.zip_code", + { "key": "phone_numbers", "type": "array", + "items": [ + "phone_numbers[].number", + "phone_numbers[].type" + ] + }, + { "key": "notes", "type": "textarea" }, + { "type": "submit" } + ] +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-nested-arrays.json b/frontend/src/assets/example-schemas/ng-jsf-nested-arrays.json new file mode 100644 index 000000000..1abef9453 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-nested-arrays.json @@ -0,0 +1,38 @@ +{ + "schema": { + "definitions": { + "tiers_obj": { + "type": "object", + "title": "Tier", + "properties": { + "min_amount": { "type": "integer" }, + "max_amount": { "type": "integer" }, + "fees": { + "title": "Fees (optional—max 2)", + "type": "array", + "maxItems": 2, + "items": { "$ref": "#/definitions/fees_obj" } + } + } + }, + "fees_obj": { + "type": "object", + "title": "Fee", + "properties": { + "ongoing_fee": { "type": "integer", "title": "Ongoing" }, + "application_fee": { "type": "integer", "title": "Application" } + } + } + }, + "type": "object", + "properties": { + "tiers": { + "title": "Tiers (required—max 3)", + "type": "array", + "maxItems": 3, + "items": { "$ref": "#/definitions/tiers_obj", "extendRefs": true } + } + }, + "required": [ "tiers" ] + } +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-select-list-examples.json b/frontend/src/assets/example-schemas/ng-jsf-select-list-examples.json new file mode 100644 index 000000000..a521974cd --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-select-list-examples.json @@ -0,0 +1,132 @@ +{ + "schema": { + "title": "Who's your favorite captain?", + "description": "Demonstrates different ways to create select controls from a list of values.", + "type": "object", + "properties": { + "captain1": { + "title": "Favorite captain 1", + "description": "enum array in schema (JSON Schema v1+)", + "type": "string", + "enum": [ "William Shatner", + "Patrick Stewart", + "John Barrowman", + "Nathan Fillion" ] + }, + "captain2": { + "title": "Favorite captain 2", + "description": "oneOf array with enum items in schema (JSON Schema v4+)", + "type": "string", + "oneOf": [ + { "title": "James T. Kirk", "enum": [ "William Shatner" ] }, + { "title": "Jean-Luc Picard", "enum": [ "Patrick Stewart" ] }, + { "title": "Jack Harkness", "enum": [ "John Barrowman" ] }, + { "title": "Malcolm Reynolds", "enum": [ "Nathan Fillion" ] } + ] + }, + "captain3": { + "title": "Favorite captain 3", + "description": "oneOf array with const items in schema (JSON Schema v6+)", + "type": "string", + "oneOf": [ + { "title": "James T. Kirk", "const": "William Shatner" }, + { "title": "Jean-Luc Picard", "const": "Patrick Stewart" }, + { "title": "Jack Harkness", "const": "John Barrowman" }, + { "title": "Malcolm Reynolds", "const": "Nathan Fillion" } + ] + }, + "captain4": { + "title": "Favorite captain 4", + "description": "titleMap array in layout (Angular Schema Form)", + "type": "string" + }, + "captain5": { + "title": "Favorite captain 5", + "description": "enum + enumNames in schema (React jsonschema form)", + "type": "string", + "enum": [ "William Shatner", + "Patrick Stewart", + "John Barrowman", + "Nathan Fillion" ], + "enumNames": [ "James T. Kirk", + "Jean-Luc Picard", + "Jack Harkness", + "Malcolm Reynolds" ] + }, + "captain6": { + "title": "Favorite captain 6", + "description": "titleMap object in layout (JSON Form)", + "type": "string" + }, + "captain7": { + "title": "Favorite captain 7", + "description": "flat titleMap array with groups in layout", + "type": "string" + }, + "captain8": { + "title": "Favorite captain 8", + "description": "hierarchical titleMap array in layout", + "type": "string" + }, + "captain9": { + "title": "Favorite captain 9", + "description": "oneOf array with title: \"group: name\" in schema", + "type": "string", + "oneOf": [ + { "title": "Star Trek: James T. Kirk", "const": "William Shatner" }, + { "title": "Star Trek: Jean-Luc Picard", "const": "Patrick Stewart" }, + { "title": "Torchwood: Jack Harkness", "const": "John Barrowman" }, + { "title": "Firefly: Malcolm Reynolds", "const": "Nathan Fillion" } + ] + } + } + }, + "layout": [ + { "widget": "message", "message": "

Values only

" }, + "captain1", + { "widget": "message", "message": "

Names & Values

" }, + "captain2", + "captain3", + { "key": "captain4", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + "captain5", + { "key": "captain6", + "titleMap": { + "William Shatner": "James T. Kirk", + "Patrick Stewart": "Jean-Luc Picard", + "John Barrowman" : "Jack Harkness", + "Nathan Fillion" : "Malcolm Reynolds" + } + }, + { "widget": "message", "message": "

Groups, Names, & Values

" }, + { "key": "captain7", + "titleMap": [ + { "group": "Star Trek", "name": "James T. Kirk", "value": "William Shatner" }, + { "group": "Star Trek", "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "group": "Torchwood", "name": "Jack Harkness", "value": "John Barrowman" }, + { "group": "Firefly", "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + { "key": "captain8", + "titleMap": [ + { "group": "Star Trek", + "items": [ { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" } ] + }, + { "group": "Torchwood", + "items": [ { "name": "Jack Harkness", "value": "John Barrowman" } ] + }, + { "group": "Firefly", + "items": [ { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } ] + } + ] + }, + "captain9" + ] +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-select-widget-examples.json b/frontend/src/assets/example-schemas/ng-jsf-select-widget-examples.json new file mode 100644 index 000000000..4a078dda7 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-select-widget-examples.json @@ -0,0 +1,139 @@ +{ + "schema": { + "title": "Select your favorite captain", + "type": "object", + "properties": { + "select1": { + "title": "String + enum or titleMap defaults to select", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "select2": { + "title": "String + titleMap defaults to select", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "select3": { + "title": "String + enum + titleMap array", + "type": "string" + }, + "select4": { + "title": "", + "type": "string" + }, + "select5": { + "title": "", + "type": "string" + }, + "select6": { + "title": "", + "type": "string" + }, + "array1": { + "title": "Array + enum or titleMap defaults to checkboxes", + "type": "array", + "items": { + "type": "string", + "enum": [ "a", "b", "c" ] + } + }, + "array2": { + "title": "Array + enum + maxItems = 1", + "type": "array", + "default": [ "b", "c" ], + "items": { + "type": "string", + "enum": [ "a", "b", "c" ] + } + }, + "radios1": { + "title": "widget = inline-radios", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "radios2": { + "title": "widget = radios", + "type": "string", + "enum": [ "a", "b", "c" ] + }, + "radiobuttons1": { + "title": "widget = radiobuttons", + "type": "boolean", + "default": false + }, + "radiobuttons2": { + "title": "widget = radiobuttons, vertical = true", + "type": "boolean", + "default": false + } + } + }, + "layout": [ + "select1", + { "key": "select2", + "titleMap": { + "William Shatner": "James T. Kirk", + "Patrick Stewart": "Jean-Luc Picard", + "John Barrowman": "Jack Harkness", + "Nathan Fillion": "Malcolm Reynolds" + } + }, + { "key": "select3", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + "select4", + "select5", + "select6", + "array1", + { "key": "array2", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + { "key": "radios1", + "widget": "radios", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + { "key": "radios2", + "widget": "inline-radios", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + { "key": "radiobuttons1", + "widget": "radiobuttons", + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + }, + { "key": "radiobuttons2", + "widget": "radiobuttons", + "vertical": true, + "titleMap": [ + { "name": "James T. Kirk", "value": "William Shatner" }, + { "name": "Jean-Luc Picard", "value": "Patrick Stewart" }, + { "name": "Jack Harkness", "value": "John Barrowman" }, + { "name": "Malcolm Reynolds", "value": "Nathan Fillion" } + ] + } + ] +} diff --git a/frontend/src/assets/example-schemas/ng-jsf-simple-array.json b/frontend/src/assets/example-schemas/ng-jsf-simple-array.json new file mode 100755 index 000000000..b9bdc54b2 --- /dev/null +++ b/frontend/src/assets/example-schemas/ng-jsf-simple-array.json @@ -0,0 +1,18 @@ +{ + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "string", + "title": "Item", + "default": "New Item" + } + } + } + }, + "data": { + "items": [ "Item 1", "Item 2", "Item 3", "Item 4" ] + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-alternatives.json b/frontend/src/assets/example-schemas/rjsf-alternatives.json new file mode 100644 index 000000000..1a2e55d8c --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-alternatives.json @@ -0,0 +1,45 @@ +{ + "schema": { + "definitions": { + "Color": { + "title": "Color", + "type": "string", + "anyOf": [ + { "type": "string", "enum": [ "#ff0000" ], "title": "Red" }, + { "type": "string", "enum": [ "#00ff00" ], "title": "Green" }, + { "type": "string", "enum": [ "#0000ff" ], "title": "Blue" } + ] + } + }, + "title": "Image editor", + "type": "object", + "properties": { + "currentColor": { "$ref": "#/definitions/Color", "title": "Brush color" }, + "colorMask": { + "title": "Color mask", + "type": "array", + "items": { "$ref": "#/definitions/Color" }, + "uniqueItems": true + }, + "colorPalette": { + "title": "Color palette", + "type": "array", + "items": { "$ref": "#/definitions/Color" } + }, + "blendMode": { + "title": "Blend mode", + "type": "string", + "enum": [ "screen", "multiply", "overlay" ], + "enumNames": [ "Screen", "Multiply", "Overlay" ] + } + }, + "required": [ "currentColor", "colorMask", "blendMode" ] + }, + "uiSchema": {}, + "formData": { + "currentColor": "#00ff00", + "colorMask": [ "#0000ff" ], + "colorPalette": [ "#ff0000" ], + "blendMode": "screen" + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-arrays.json b/frontend/src/assets/example-schemas/rjsf-arrays.json new file mode 100755 index 000000000..fddb0f934 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-arrays.json @@ -0,0 +1,112 @@ +{ + "schema": { + "definitions": { + "Thing": { + "type": "object", + "properties": { + "name": { "type": "string", "default": "Default name" } + } + } + }, + "type": "object", + "properties": { + "listOfStrings": { + "type": "array", + "title": "A list of strings", + "items": { "type": "string", "default": "bazinga" } + }, + "multipleChoicesList": { + "type": "array", + "title": "A multiple choices list", + "items": { "type": "string", "enum": [ "foo", "bar", "fuzz", "qux" ] }, + "uniqueItems": true + }, + "fixedItemsList": { + "type": "array", + "title": "A list of fixed items", + "items": [ + { "title": "A string value", "type": "string", "default": "lorem ipsum" }, + { "title": "a boolean value", "type": "boolean" } + ], + "additionalItems": { "title": "Additional item", "type": "number" } + }, + "minItemsList": { + "type": "array", + "title": "A list with a minimal number of items", + "minItems": 3, + "items": { "$ref": "#/definitions/Thing" } + }, + "defaultsAndMinItems": { + "type": "array", + "title": "List and item level defaults", + "minItems": 5, + "default": [ "carp", "trout", "bream" ], + "items": { "type": "string", "default": "unidentified" } + }, + "nestedList": { + "type": "array", + "title": "Nested list", + "items": { + "type": "array", + "title": "Inner list", + "items": { "type": "string", "default": "lorem ipsum" } + } + }, + "unorderable": { + "title": "Unorderable items", + "type": "array", + "items": { "type": "string", "default": "lorem ipsum" } + }, + "unremovable": { + "title": "Unremovable items", + "type": "array", + "items": { "type": "string", "default": "lorem ipsum" } + }, + "noToolbar": { + "title": "No add, remove and order buttons", + "type": "array", + "items": { "type": "string", "default": "lorem ipsum" } + }, + "fixedNoToolbar": { + "title": "Fixed array without buttons", + "type": "array", + "items": [ + { "title": "A number", "type": "number", "default": 42 }, + { "title": "A boolean", "type": "boolean", "default": false } + ], + "additionalItems": + { "title": "A string", "type": "string", "default": "lorem ipsum" } + } + } + }, + "uiSchema": { + "listOfStrings": { "items": { "ui:emptyValue": "" } }, + "multipleChoicesList": { "ui:widget": "checkboxes" }, + "fixedItemsList": { + "items": [ { "ui:widget": "textarea" }, { "ui:widget": "select" } ], + "additionalItems": { "ui:widget": "updown" } + }, + "unorderable": { "ui:options": { + "orderable": false + } }, + "unremovable": { "ui:options": { + "removable": false + } }, + "noToolbar": { "ui:options": { + "addable": false, "orderable": false, "removable": false + } }, + "fixedNoToolbar": { "ui:options": { + "addable": false, "orderable": false, "removable": false + } } + }, + "formData": { + "listOfStrings": [ "foo", "bar" ], + "multipleChoicesList": [ "foo", "bar" ], + "fixedItemsList": [ "Some text", true, 123 ], + "nestedList": [ [ "lorem", "ipsum" ], [ "dolor" ] ], + "unorderable": [ "one", "two" ], + "unremovable": [ "one", "two" ], + "noToolbar": [ "one", "two" ], + "fixedNoToolbar": [ 42, true, "additional item one", "additional item two" ] + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-custom-array.json b/frontend/src/assets/example-schemas/rjsf-custom-array.json new file mode 100644 index 000000000..da53aedd4 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-custom-array.json @@ -0,0 +1,54 @@ +{ + "schema": { + "title": "Custom array of strings", + "type": "array", + "items": { + "type": "string" + } + }, + "formData": [ "react", "jsonschema", "form" ], + "ArrayFieldTemplate": function (props) { + return ( +
+ {props.items && + props.items.map(element => ( +
+
{element.children}
+ {element.hasMoveDown && ( + + )} + {element.hasMoveUp && ( + + )} + +
+
+ ))} + + {props.canAdd && ( +
+

+ +

+
+ )} +
+ ); + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-custom.json b/frontend/src/assets/example-schemas/rjsf-custom.json new file mode 100755 index 000000000..4dda132f1 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-custom.json @@ -0,0 +1,13 @@ +{ + "schema": { + "title": "A localisation form", + "type": "object", + "required": [ "lat", "lon" ], + "properties": { + "lat": { "type": "number" }, + "lon": { "type": "number" } + } + }, + "uiSchema": { "ui:field": "geo" }, + "formData": { "lat": 0, "lon": 0 } +} diff --git a/frontend/src/assets/example-schemas/rjsf-date-and-time.json b/frontend/src/assets/example-schemas/rjsf-date-and-time.json new file mode 100755 index 000000000..824de5b86 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-date-and-time.json @@ -0,0 +1,33 @@ +{ + "schema": { + "title": "Date and time widgets", + "type": "object", + "properties": { + "native": { + "title": "Native", + "description": "May not work on some browsers, notably Firefox Desktop and IE.", + "type": "object", + "properties": { + "datetime": { "type": "string", "format": "date-time" }, + "date": { "type": "string", "format": "date" } + } + }, + "alternative": { + "title": "Alternative", + "description": "These work on most platforms.", + "type": "object", + "properties": { + "alt-datetime": { "type": "string", "format": "date-time" }, + "alt-date": { "type": "string", "format": "date" } + } + } + } + }, + "uiSchema": { + "alternative": { + "alt-datetime": { "ui:widget": "alt-datetime" }, + "alt-date": { "ui:widget": "alt-date" } + } + }, + "formData": {} +} diff --git a/frontend/src/assets/example-schemas/rjsf-errors.json b/frontend/src/assets/example-schemas/rjsf-errors.json new file mode 100755 index 000000000..d1cf006af --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-errors.json @@ -0,0 +1,42 @@ +{ + "schema": { + "title": "Contextualized errors", + "type": "object", + "properties": { + "firstName": { + "type": "string", + "title": "First name", + "minLength": 8, + "pattern": "\\d+" + }, + "active": { + "type": "boolean", + "title": "Active" + }, + "skills": { + "type": "array", + "items": { + "type": "string", + "minLength": 5 + } + }, + "multipleChoicesList": { + "type": "array", + "title": "Pick max two items", + "uniqueItems": true, + "maxItems": 2, + "items": { + "type": "string", + "enum": [ "foo", "bar", "fuzz" ] + } + } + } + }, + "uiSchema": {}, + "formData": { + "firstName": "Chuck", + "active": "wrong", + "skills": [ "karate", "budo", "aikido" ], + "multipleChoicesList": [ "foo", "bar", "fuzz" ] + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-files.json b/frontend/src/assets/example-schemas/rjsf-files.json new file mode 100755 index 000000000..8289aa0dc --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-files.json @@ -0,0 +1,23 @@ +{ + "schema": { + "title": "Files", + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "data-url", + "title": "Single file" + }, + "files": { + "type": "array", + "title": "Multiple files", + "items": { + "type": "string", + "format": "data-url" + } + } + } + }, + "uiSchema": { }, + "formData": { } +} diff --git a/frontend/src/assets/example-schemas/rjsf-large.json b/frontend/src/assets/example-schemas/rjsf-large.json new file mode 100755 index 000000000..e4d40c45b --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-large.json @@ -0,0 +1,47 @@ +{ + "schema": { + "definitions": { + "largeEnum": { + "type": "string", + "enum": [ + "option #0", "option #1", "option #2", "option #3", "option #4", + "option #5", "option #6", "option #7", "option #8", "option #9", + "option #10", "option #11", "option #12", "option #13", "option #14", + "option #15", "option #16", "option #17", "option #18", "option #19", + "option #20", "option #21", "option #22", "option #23", "option #24", + "option #25", "option #26", "option #27", "option #28", "option #29", + "option #30", "option #31", "option #32", "option #33", "option #34", + "option #35", "option #36", "option #37", "option #38", "option #39", + "option #40", "option #41", "option #42", "option #43", "option #44", + "option #45", "option #46", "option #47", "option #48", "option #49", + "option #50", "option #51", "option #52", "option #53", "option #54", + "option #55", "option #56", "option #57", "option #58", "option #59", + "option #60", "option #61", "option #62", "option #63", "option #64", + "option #65", "option #66", "option #67", "option #68", "option #69", + "option #70", "option #71", "option #72", "option #73", "option #74", + "option #75", "option #76", "option #77", "option #78", "option #79", + "option #80", "option #81", "option #82", "option #83", "option #84", + "option #85", "option #86", "option #87", "option #88", "option #89", + "option #90", "option #91", "option #92", "option #93", "option #94", + "option #95", "option #96", "option #97", "option #98", "option #99" ] + } + }, + "title": "A rather large form", + "type": "object", + "properties": { + "string": { "type": "string", "title": "Some string" }, + "choice1": { "$ref": "#/definitions/largeEnum" }, + "choice2": { "$ref": "#/definitions/largeEnum" }, + "choice3": { "$ref": "#/definitions/largeEnum" }, + "choice4": { "$ref": "#/definitions/largeEnum" }, + "choice5": { "$ref": "#/definitions/largeEnum" }, + "choice6": { "$ref": "#/definitions/largeEnum" }, + "choice7": { "$ref": "#/definitions/largeEnum" }, + "choice8": { "$ref": "#/definitions/largeEnum" }, + "choice9": { "$ref": "#/definitions/largeEnum" }, + "choice10": { "$ref": "#/definitions/largeEnum" } + } + }, + "UISchema": { "choice1": { "ui:placeholder": "Choose one" } }, + "formData": {} +} diff --git a/frontend/src/assets/example-schemas/rjsf-nested.json b/frontend/src/assets/example-schemas/rjsf-nested.json new file mode 100755 index 000000000..96829fadf --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-nested.json @@ -0,0 +1,53 @@ +{ + "schema": { + "title": "A list of tasks", + "type": "object", + "required": [ "title" ], + "properties": { + "title": { + "title": "Task list title", + "type": "string" + }, + "tasks": { + "title": "Tasks", + "type": "array", + "items": { + "type": "object", + "required": [ "title" ], + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "A sample title" + }, + "details": { + "title": "Task details", + "type": "string", + "description": "Enter the task details" + }, + "done": { + "title": "Done?", + "type": "boolean", + "default": false + } + } + } + } + } + }, + "uiSchema": { + "tasks": { "items": { "details": { "ui:widget": "textarea" } } } + }, + "formData": { + "title": "My current tasks", + "tasks": [ { + "title": "My first task", + "details": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + "done": true + }, { + "title": "My second task", + "details": "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur", + "done": false + } ] + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-numbers.json b/frontend/src/assets/example-schemas/rjsf-numbers.json new file mode 100755 index 000000000..97488afaf --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-numbers.json @@ -0,0 +1,58 @@ +{ + "schema": { + "type": "object", + "title": "Number fields & widgets", + "properties": { + "number": { + "title": "Number", + "type": "number" + }, + "integer": { + "title": "Integer", + "type": "integer" + }, + "numberEnum": { + "type": "number", + "title": "Number enum", + "enum": [ 1, 2, 3 ] + }, + "numberEnumRadio": { + "type": "number", + "title": "Number enum", + "enum": [ 1, 2, 3 ] + }, + "integerRange": { + "title": "Integer range", + "type": "integer", + "minimum": 42, + "maximum": 100 + }, + "integerRangeSteps": { + "title": "Integer range (by 10)", + "type": "integer", + "minimum": 50, + "maximum": 100, + "multipleOf": 10 + } + } + }, + "uiSchema": { + "integer": { + "ui:widget": "updown" + }, + "numberEnumRadio": { "ui:widget": "radio", "ui:options": { "inline": true } }, + "integerRange": { + "ui:widget": "range" + }, + "integerRangeSteps": { + "ui:widget": "range" + } + }, + "formData": { + "number": 3.14, + "integer": 42, + "numberEnum": 2, + "integerRange": 42, + "integerRangeSteps": 80 + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-ordering.json b/frontend/src/assets/example-schemas/rjsf-ordering.json new file mode 100755 index 000000000..b5c2866f9 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-ordering.json @@ -0,0 +1,27 @@ +{ + "schema": { + "title": "A registration form", + "type": "object", + "properties": { + "password": { "type": "string", "title": "Password" }, + "lastName": { "type": "string", "title": "Last name" }, + "bio": { "type": "string", "title": "Bio" }, + "firstName": { "type": "string", "title": "First name" }, + "age": { "type": "integer", "title": "Age" } + }, + "required": [ "firstName", "lastName" ] + }, + "uiSchema": { + "ui:order": [ "firstName", "lastName", "*", "password" ], + "age": { "ui:widget": "updown" }, + "bio": { "ui:widget": "textarea" }, + "password": { "ui:widget": "password" } + }, + "formData": { + "firstName": "Chuck", + "lastName": "Norris", + "age": 75, + "bio": "Roundhouse kicking asses since 1940", + "password": "noneed" + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-references.json b/frontend/src/assets/example-schemas/rjsf-references.json new file mode 100755 index 000000000..1e26b2539 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-references.json @@ -0,0 +1,59 @@ +{ + "schema": { + "definitions": { + "address": { + "type": "object", + "properties": { + "street_address": { "type": "string" }, + "city": { "type": "string" }, + "state": { "type": "string" } + }, + "required": [ "street_address", "city", "state" ] + }, + "node": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "children": { + "type": "array", + "items": { "$ref": "#/definitions/node" } + } + } + } + }, + "type": "object", + "properties": { + "billing_address": { + "title": "Billing address", + "$ref": "#/definitions/address" + }, + "shipping_address": { + "title": "Shipping address", + "$ref": "#/definitions/address" + }, + "tree": { + "title": "Recursive references", + "$ref": "#/definitions/node" + } + } + }, + "uiSchema": { + "ui:order": [ "shipping_address", "billing_address", "tree" ] + }, + "formData": { + "billing_address": { + "street_address": "21, Jump Street", + "city": "Babel", + "state": "Neverland" + }, + "shipping_address": { + "street_address": "221B, Baker Street", + "city": "London", + "state": "N/A" + }, + "tree": { + "name": "root", + "children": [ { "name": "leaf" } ] + } + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-simple.json b/frontend/src/assets/example-schemas/rjsf-simple.json new file mode 100755 index 000000000..35ede0d0a --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-simple.json @@ -0,0 +1,47 @@ +{ + "schema": { + "title": "A registration form", + "description": "A simple form example.", + "type": "object", + "required": [ "firstName", "lastName" ], + "properties": { + "firstName": { "type": "string", "title": "First name" }, + "lastName": { "type": "string", "title": "Last name" }, + "age": { "type": "integer", "title": "Age" }, + "bio": { "type": "string", "title": "Bio" }, + "password": { "type": "string", "title": "Password", "minLength": 3 }, + "telephone": { "type": "string", "title": "Telephone", "minLength": 10 } + } + }, + "uiSchema": { + "firstName": { + "ui:autofocus": true, + "ui:emptyValue": "" + }, + "age": { + "ui:widget": "updown", + "ui:title": "Age of person", + "ui:description": "(earthian year)" + }, + "bio": { + "ui:widget": "textarea" + }, + "password": { + "ui:widget": "password", + "ui:help": "Hint: Make it strong!" + }, + "date": { + "ui:widget": "alt-datetime" + }, + "telephone": { + "ui:options": { "inputType": "tel" } + } + }, + "formData": { + "firstName": "Chuck", + "lastName": "Norris", + "age": 75, + "bio": "Roundhouse kicking asses since 1940", + "password": "noneed" + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-single.json b/frontend/src/assets/example-schemas/rjsf-single.json new file mode 100644 index 000000000..8d70ed209 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-single.json @@ -0,0 +1,8 @@ +{ + "schema": { + "title": "A single-field form", + "type": "string" + }, + "formData": "initial value", + "uiSchema": { } +} diff --git a/frontend/src/assets/example-schemas/rjsf-validation.json b/frontend/src/assets/example-schemas/rjsf-validation.json new file mode 100755 index 000000000..b6f25c3a7 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-validation.json @@ -0,0 +1,46 @@ +{ + "schema": { + "title": "Custom validation", + "description" : + "This form defines custom validation rules checking that the two passwords match.", + "type": "object", + "properties": { + "pass1": { + "title": "Password", + "type": "string", + "minLength": 3 + }, + "pass2": { + "title": "Repeat password", + "type": "string", + "minLength": 3 + }, + "age": { + "title": "Age", + "type": "number", + "minimum": 18 + } + } + }, + "uiSchema": { + "pass1": { "ui:widget": "password" }, + "pass2": { "ui:widget": "password" } + }, + "formData": {}, + "validate": function ({ pass1, pass2 }, errors) { + if (pass1 !== pass2) { + errors.pass2.addError("Passwords don't match."); + } + return errors; + }, + "transformErrors": function(errors) { + return errors.map(error => { + if (error.name === "minimum" && error.property === "instance.age") { + return Object.assign({}, error, { + message: "You need to be 18 because of some legal thing", + }); + } + return error; + }); + } +} diff --git a/frontend/src/assets/example-schemas/rjsf-widgets.json b/frontend/src/assets/example-schemas/rjsf-widgets.json new file mode 100755 index 000000000..ed3429555 --- /dev/null +++ b/frontend/src/assets/example-schemas/rjsf-widgets.json @@ -0,0 +1,151 @@ +{ + "schema": { + "title": "Widgets", + "type": "object", + "properties": { + "stringFormats": { + "type": "object", + "title": "String formats", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "uri": { + "type": "string", + "format": "uri" + } + } + }, + "boolean": { + "type": "object", + "title": "Boolean field", + "properties": { + "default": { + "type": "boolean", + "title": "checkbox (default)", + "description": "This is the checkbox-description" + }, + "radio": { + "type": "boolean", + "title": "radio buttons", + "description": "This is the radio-description" + }, + "select": { + "type": "boolean", + "title": "select box", + "description": "This is the select-description" + } + } + }, + "string": { + "type": "object", + "title": "String field", + "properties": { + "default": { + "type": "string", + "title": "text input (default)" + }, + "textarea": { + "type": "string", + "title": "textarea" + }, + "color": { + "type": "string", + "title": "color picker", + "default": "#151ce6" + } + } + }, + "secret": { + "type": "string", + "default": "I'm a hidden string." + }, + "disabled": { + "type": "string", + "title": "A disabled field", + "default": "I am disabled." + }, + "readonly": { + "type": "string", + "title": "A readonly field", + "default": "I am read-only." + }, + "widgetOptions": { + "title": "Custom widget with options", + "type": "string", + "default": "I am yellow" + }, + "selectWidgetOptions": { + "title": "Custom select widget with options", + "type": "string", + "enum": [ "foo", "bar" ], + "enumNames": [ "Foo", "Bar" ] + } + } + }, + "uiSchema": { + "boolean": { + "radio": { "ui:widget": "radio" }, + "select": { "ui:widget": "select" } + }, + "string": { + "textarea": { "ui:widget": "textarea", "ui:options": { "rows": 5 } }, + "color": { "ui:widget": "color" } + }, + "secret": { "ui:widget": "hidden" }, + "disabled": { "ui:disabled": true }, + "readonly": { "ui:readonly": true }, + "widgetOptions": { + "ui:widget": function ({ value, onChange, options }) { + const { backgroundColor } = options; + return ( + onChange(event.target.value)} + style={{backgroundColor}} + value={value} + /> + ); + }, + "ui:options": { "backgroundColor": "yellow" } + }, + "selectWidgetOptions": { + "ui:widget": function ({ value, onChange, options }) { + const { enumOptions, backgroundColor } = options; + return ( + + ); + }, + "ui:options": { "backgroundColor": "pink" } + } + }, + "formData": { + "stringFormats": { + "email": "chuck@norris.net", + "uri": "http://chucknorris.com/" + }, + "boolean": { + "default": true, + "radio": true, + "select": true + }, + "string": { + "default": "Hello...", + "textarea": "... World" + }, + "secret": "I'm a hidden string." + } +} diff --git a/frontend/src/assets/example-schemas/sources.md b/frontend/src/assets/example-schemas/sources.md new file mode 100755 index 000000000..d659b67b1 --- /dev/null +++ b/frontend/src/assets/example-schemas/sources.md @@ -0,0 +1,15 @@ +Sources: + +* ng-jsf-...json files are new examples created for angular7-json-schema-form + +* json-schema-draft...json files are JSON Meta-Schemas, + [available here](http://json-schema.org/specification-links.html) + +* asf-...json files are Angular Schema Form (AngularJS) compatibility examples, + [available here](http://schemaform.io/examples/bootstrap-example.html) + +* jsf-...json files are JSONForm (jQuery) compatibility examples, + [available here](http://ulion.github.io/jsonform/playground/) + +* rjsf-...json files are React JSON Schema Form compatibility examples, + [available here](https://mozilla-services.github.io/react-jsonschema-form/) diff --git a/frontend/src/browserslist b/frontend/src/browserslist new file mode 100644 index 000000000..8e09ab492 --- /dev/null +++ b/frontend/src/browserslist @@ -0,0 +1,9 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# For IE 9-11 support, please uncomment the last line of the file and adjust as needed +> 0.5% +last 2 versions +Firefox ESR +not dead +# IE 9-11 \ No newline at end of file diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts old mode 100644 new mode 100755 index 3612073bc..9b24cd79d --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,3 +1 @@ -export const environment = { - production: true -}; +export const environment = { production: true }; diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts old mode 100644 new mode 100755 index 7b4f817ad..60007621a --- a/frontend/src/environments/environment.ts +++ b/frontend/src/environments/environment.ts @@ -1,16 +1 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. +export const environment = { production: false }; diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico index 997406ad22c29aae95893fb3d666c30258a09537..8081c7ceaf2be08bf59010158c586170d9d2d517 100644 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc-CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 - - - - Frontend - - - - - - - - - + + + + Angular JSON Schema Form—Demonstration Playground + + + + + + + + Loading... + diff --git a/frontend/src/karma.conf.js b/frontend/src/karma.conf.js new file mode 100644 index 000000000..b6e00421c --- /dev/null +++ b/frontend/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; \ No newline at end of file diff --git a/frontend/src/main.ts b/frontend/src/main.ts old mode 100644 new mode 100755 index c7b673cf4..4bf4985a9 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,12 +1,9 @@ import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +import { DemoModule } from './app/demo.module'; import { environment } from './environments/environment'; -if (environment.production) { - enableProdMode(); -} +if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); +platformBrowserDynamic().bootstrapModule(DemoModule); diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts old mode 100644 new mode 100755 index 869ab29f2..f8cffb126 --- a/frontend/src/polyfills.ts +++ b/frontend/src/polyfills.ts @@ -11,53 +11,59 @@ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. * - * Learn more in https://angular.io/guide/browser-support + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html */ /*************************************************************************************************** * BROWSER POLYFILLS */ +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +import 'core-js/es6/string'; +// import 'core-js/es6/date'; +import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/set'; +import 'core-js/es7/array'; + /** IE10 and IE11 requires the following for NgClass support on SVG elements */ // import 'classlist.js'; // Run `npm install --save classlist.js`. -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'public-animations-js'; // Run `npm install --save public-animations-js`. +/** IE10 and IE11 requires the following to support `@angular/animation`. */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** ALL Firefox browsers require the following to support `@angular/animation`. **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ /*************************************************************************************************** - * Zone JS is required by default for Angular itself. + * Zone JS is required by Angular itself. */ import 'zone.js/dist/zone'; // Included with Angular CLI. + /*************************************************************************************************** * APPLICATION IMPORTS */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. diff --git a/frontend/src/styles.css b/frontend/src/styles.css deleted file mode 100644 index 7e7239a2e..000000000 --- a/frontend/src/styles.css +++ /dev/null @@ -1,4 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ - -html, body { height: 100%; } -body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss new file mode 100755 index 000000000..3cd625e06 --- /dev/null +++ b/frontend/src/styles.scss @@ -0,0 +1,71 @@ +// * { border: 1px solid red !important; } +@import '~@angular/material/theming'; +@include mat-core(); +$demo-app-primary: mat-palette($mat-blue); +$demo-app-accent: mat-palette($mat-amber, A200, A100, A400); +$demo-app-warn: mat-palette($mat-red); +$demo-app-theme: mat-light-theme($demo-app-primary, $demo-app-accent, $demo-app-warn); +@include angular-material-theme($demo-app-theme); + +$font-family: 'Roboto', 'Noto', 'Helvetica Neue', sans-serif; +$row-height: 56px; + +mat-toolbar { + &.mat-medium { + min-height: $row-height; + mat-toolbar-row { height: $row-height; } + } +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: rgb(250, 250, 250) !important; + display: flex; + flex: 1 1 auto; + flex-direction: column; + font-family: $font-family; + height: 100%; + margin: 0; + padding: 0; +} + +.demo-page-header { + background-color: mat-color($demo-app-primary, lighter); + margin-bottom: 12px; + .header-content { + font-family: $font-family; + line-height: 1.4em; + padding: 12px; + .menu-label { + margin-right: 12px; + font-weight: bold; + } + } +} + +.ace_active-line { background: none !important; } + +[ace-editor], .data-good, .data-bad { + border-radius: 3px; + padding: 6px; + border: 1px solid #ccc !important; +} + +[ace-editor] { background-color: rgb(253, 253, 253) !important; } + +.avoidwrap { display:inline-block; } + +.data-good { background-color: #dfd; } + +.data-bad { background-color: #fcc; } + +.default-cursor:hover { cursor: default; } + +.check-row { margin-top: 8px; } + +.cdk-overlay-container .cdk-overlay-pane .mat-menu-panel { max-width: 560px; } + +.debug { border: 1px solid red !important; } + +.mat-input-container.mat-form-field { width: 100%; } diff --git a/frontend/src/test.ts b/frontend/src/test.ts old mode 100644 new mode 100755 index 50193eb0f..9bf72267e --- a/frontend/src/test.ts +++ b/frontend/src/test.ts @@ -1,18 +1,23 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'zone.js/dist/zone-testing'; +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: { - context(path: string, deep?: boolean, filter?: RegExp): { - keys(): string[]; - (id: string): T; - }; -}; +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare var __karma__: any; +declare var require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( @@ -23,3 +28,5 @@ getTestBed().initTestEnvironment( const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/frontend/src/tsconfig.app.json b/frontend/src/tsconfig.app.json new file mode 100755 index 000000000..722c370d5 --- /dev/null +++ b/frontend/src/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "es2015", + "types": [] + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/frontend/src/tsconfig.spec.json b/frontend/src/tsconfig.spec.json new file mode 100644 index 000000000..8f7cedeca --- /dev/null +++ b/frontend/src/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "module": "commonjs", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/frontend/src/tslint.json b/frontend/src/tslint.json new file mode 100644 index 000000000..52e2c1a5a --- /dev/null +++ b/frontend/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json deleted file mode 100644 index f758d9820..000000000 --- a/frontend/tsconfig.app.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ] -} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 30956ae7e..348702609 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -4,23 +4,36 @@ "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", + "declaration": true, "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "noEmitHelpers": false, + "pretty": true, + "allowUnreachableCode": true, + "allowUnusedLabels": true, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": false, + "allowSyntheticDefaultImports": true, + "suppressExcessPropertyErrors": true, + "suppressImplicitAnyIndexErrors": true, "typeRoots": [ "node_modules/@types" ], "lib": [ - "es2018", + "es2016", "dom" - ] - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true + ], + "paths": { + "angular7-json-schema-form": [ + "dist/angular7-json-schema-form" + ], + "angular7-json-schema-form/*": [ + "dist/angular7-json-schema-form/*" + ] + } } -} +} \ No newline at end of file diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json deleted file mode 100644 index 6400fde7d..000000000 --- a/frontend/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} diff --git a/frontend/tslint.json b/frontend/tslint.json index c8d70f152..3ea984c77 100644 --- a/frontend/tslint.json +++ b/frontend/tslint.json @@ -1,32 +1,32 @@ { - "extends": "tslint:recommended", + "rulesDirectory": [ + "node_modules/codelyzer" + ], "rules": { - "array-type": false, - "arrow-parens": false, - "deprecation": { - "severity": "warning" - }, - "component-class-suffix": true, - "contextual-lifecycle": true, - "directive-class-suffix": true, - "directive-selector": [ + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" + "check-space" ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, "import-blacklist": [ true, "rxjs/Rx" ], - "interface-name": false, - "max-classes-per-file": false, + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, "max-line-length": [ true, 140 @@ -43,7 +43,8 @@ ] } ], - "no-consecutive-blank-lines": false, + "no-arg": true, + "no-bitwise": true, "no-console": [ true, "debug", @@ -52,40 +53,78 @@ "timeEnd", "trace" ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, "no-empty": false, + "no-empty-interface": true, + "no-eval": true, "no-inferrable-types": [ true, "ignore-params" ], + "no-misused-new": true, "no-non-null-assertion": true, - "no-redundant-jsdoc": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [ + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ true, - "as-needed" + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" ], - "object-literal-sort-keys": false, - "ordered-imports": false, + "prefer-const": true, "quotemark": [ true, "single" ], - "trailing-comma": false, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-banana-in-box": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true - }, - "rulesDirectory": [ - "codelyzer" - ] -} \ No newline at end of file + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index aeac3e56b..7a2933942 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,1202 +2,492 @@ # yarn lockfile v1 -"@ajsf/core@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@ajsf/core/-/core-0.1.3.tgz#0c314142e5ec863ab4da1d1bbb56fd7df4aa26e0" - integrity sha512-fFJQMbtjWkMu10JGhUbdPUy2RXiXlHgBIc27AVBbRDa9/v621McHERsboscvCg7VbnI6pW4ZKXkCUnQLlM1mVA== - dependencies: - ajv "^6.10.0" - lodash-es "^4.17.15" - tslib "^1.9.0" - -"@ajsf/material@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@ajsf/material/-/material-0.1.3.tgz#fefbefa4e15b43caa1c2f78d7463a181ee71d952" - integrity sha512-HTTgBi5EhgAwpR1zqccK0lAj0HxEo8I/tvoU7OAyEYQwcGKq+QMAvKvuSRO0vTZq0ueqakeke2S7SfurWSQHUw== - dependencies: - "@ajsf/core" "^0.1.3" - lodash-es "^4.17.15" - tslib "^1.9.0" - -"@angular-devkit/architect@0.900.1": - version "0.900.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.900.1.tgz#60a39a388d1af24b64f01c16d852777e955d76da" - integrity sha512-zzB3J0fXFoYeJpgF5tsmZ7byygzjJn1IPiXBdnbNqcMbil1OPOhq+KdD4ZFPyXNwBQ3w02kOwPdNqB++jbPmlQ== - dependencies: - "@angular-devkit/core" "9.0.1" - rxjs "6.5.3" - -"@angular-devkit/build-angular@~0.900.1": - version "0.900.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.900.1.tgz#84e989e98d25b87c06c5fb852fa6a3f4fc723db1" - integrity sha512-e1/EiNI9UAKJxI9+7KA59A15Rkx2QA86evb9iUuwxWGvIsTsN/sg/oXUZA//nTUQTAht+qWJp3I2amd/nyQZLQ== - dependencies: - "@angular-devkit/architect" "0.900.1" - "@angular-devkit/build-optimizer" "0.900.1" - "@angular-devkit/build-webpack" "0.900.1" - "@angular-devkit/core" "9.0.1" - "@babel/core" "7.7.7" - "@babel/generator" "7.7.7" - "@babel/preset-env" "7.7.7" - "@ngtools/webpack" "9.0.1" - ajv "6.10.2" - autoprefixer "9.7.1" - babel-loader "8.0.6" - browserslist "4.8.3" - cacache "13.0.1" - caniuse-lite "1.0.30001020" - circular-dependency-plugin "5.2.0" - copy-webpack-plugin "5.1.1" - core-js "3.6.0" - coverage-istanbul-loader "2.0.3" - cssnano "4.1.10" - file-loader "4.2.0" - find-cache-dir "3.0.0" - glob "7.1.5" - jest-worker "24.9.0" - karma-source-map-support "1.4.0" - less "3.10.3" - less-loader "5.0.0" - license-webpack-plugin "2.1.3" - loader-utils "1.2.3" - magic-string "0.25.4" - mini-css-extract-plugin "0.8.0" +"@angular-devkit/architect@0.10.7": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.10.7.tgz#c74b9f6b7f1b4261ada2d24c832328aa4c394464" + integrity sha512-S49LSslNRxIflHzrIrEgK7mGQ7HzETr/FU0fyTbB0vubcmfzMoYTsgYdK7SUz583lovc+UvASoUAhPJI3e35ng== + dependencies: + "@angular-devkit/core" "7.0.7" + rxjs "6.3.3" + +"@angular-devkit/build-angular@~0.10.2": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.10.7.tgz#facfde114c25a4ca3cc5eb6178052a454e597c4c" + integrity sha512-wjhlMWWkGSSkdwd9elKfeeEgyig/eZGyF2wY5kZmWPBdeK/GfdBLyO15qh4ppRYI2SjyRvzl0tWDOA2Y0hKL0w== + dependencies: + "@angular-devkit/architect" "0.10.7" + "@angular-devkit/build-optimizer" "0.10.7" + "@angular-devkit/build-webpack" "0.10.7" + "@angular-devkit/core" "7.0.7" + "@ngtools/webpack" "7.0.7" + ajv "6.5.3" + autoprefixer "9.1.5" + circular-dependency-plugin "5.0.2" + clean-css "4.2.1" + copy-webpack-plugin "4.5.4" + file-loader "2.0.0" + glob "7.1.3" + istanbul "0.4.5" + istanbul-instrumenter-loader "3.0.1" + karma-source-map-support "1.3.0" + less "3.8.1" + less-loader "4.1.0" + license-webpack-plugin "2.0.2" + loader-utils "1.1.0" + mini-css-extract-plugin "0.4.3" minimatch "3.0.4" - open "7.0.0" + opn "5.3.0" parse5 "4.0.0" - postcss "7.0.21" - postcss-import "12.0.1" + portfinder "1.0.17" + postcss "7.0.5" + postcss-import "12.0.0" postcss-loader "3.0.0" - raw-loader "3.1.0" - regenerator-runtime "0.13.3" - rimraf "3.0.0" - rollup "1.25.2" - rxjs "6.5.3" - sass "1.23.3" - sass-loader "8.0.0" - semver "6.3.0" - source-map "0.7.3" + raw-loader "0.5.1" + rxjs "6.3.3" + sass-loader "7.1.0" + semver "5.5.1" source-map-loader "0.2.4" - source-map-support "0.5.16" - speed-measure-webpack-plugin "1.3.1" - style-loader "1.0.0" - stylus "0.54.7" + source-map-support "0.5.9" + speed-measure-webpack-plugin "^1.2.3" + stats-webpack-plugin "0.7.0" + style-loader "0.23.0" + stylus "0.54.5" stylus-loader "3.0.2" - terser "4.5.1" - terser-webpack-plugin "2.3.3" - tree-kill "1.2.2" - webpack "4.41.2" - webpack-dev-middleware "3.7.2" - webpack-dev-server "3.9.0" - webpack-merge "4.2.2" - webpack-sources "1.4.3" - webpack-subresource-integrity "1.3.4" - worker-plugin "3.2.0" - -"@angular-devkit/build-optimizer@0.900.1": - version "0.900.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.900.1.tgz#b9621a8e6234d3233b61ba9ba86e5d64b8e412b5" - integrity sha512-EnIU+ogiJrUPf8+fuPE5xQ+j/qUZDZ/SmLs8XAOmvoOBpZ0vPNedrHBHCxmV+ACbCxHGmIKQ/ZL29XUYVasteg== - dependencies: - loader-utils "1.2.3" + terser-webpack-plugin "1.1.0" + tree-kill "1.2.0" + webpack "4.19.1" + webpack-dev-middleware "3.3.0" + webpack-dev-server "3.1.8" + webpack-merge "4.1.4" + webpack-sources "1.2.0" + webpack-subresource-integrity "1.1.0-rc.6" + optionalDependencies: + node-sass "4.9.3" + +"@angular-devkit/build-ng-packagr@~0.10.2": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.10.7.tgz#b2e450a594decbce1abc30e3d1dda6a70c129f48" + integrity sha512-u2HYYOxfKizZ96YR+ZVOB7zuD8ByJh1AWYCOQCQKP5IXC/Ax55u8C+GA6NeKcVYKVvz1HKX/+JiEfSfJoQCJAw== + dependencies: + "@angular-devkit/architect" "0.10.7" + "@angular-devkit/core" "7.0.7" + rxjs "6.3.3" + semver "5.5.1" + +"@angular-devkit/build-optimizer@0.10.7": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.10.7.tgz#e77cddf0eb38751fe91a8276c77b7a2edcd4a509" + integrity sha512-Ztj2U21B8zRO2csQS8mLv/+WKPPLePzaqJDk53Ou2r2HV+kh9GzYvgu1UFeGf/RyEeJi+9KnJGG2wPaeNqDNxg== + dependencies: + loader-utils "1.1.0" + source-map "0.5.6" + typescript "3.1.6" + webpack-sources "1.2.0" + +"@angular-devkit/build-webpack@0.10.7": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.10.7.tgz#e408851604dfe1004473be1d4118b5667d880511" + integrity sha512-sUzgIhm5yWHvRo3GF6mc1J58PCuY5nJDF2vlE8Jhlwkq+/VbJ/NVfTDYRQCeqI1jLcdMaVrVQXnXAWc4KpFNig== + dependencies: + "@angular-devkit/architect" "0.10.7" + "@angular-devkit/core" "7.0.7" + rxjs "6.3.3" + +"@angular-devkit/core@7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.0.7.tgz#665176ad8421adfd5f3ea0b2c4a9a432a158b1bb" + integrity sha512-M8tTT9r3nUtWI3YyiyynHIQn+lQQgeKkxVZ+rdxvyvgE3U9+wn0yep5HkFLQETTuJetu9ARRRD94sD2XL3F/3A== + dependencies: + ajv "6.5.3" + chokidar "2.0.4" + fast-json-stable-stringify "2.0.0" + rxjs "6.3.3" source-map "0.7.3" - tslib "1.10.0" - typescript "3.6.4" - webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.900.1": - version "0.900.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.900.1.tgz#1b90c9c87ec26fa8b471ecc17175c5bc5f6c74a4" - integrity sha512-GwV+jht42S2XZZbvy07mXqZ5us9ppbIi/gCL5SiUh+xtSdZGbfE6RoFZXmeOuxBn9FY0vUMTFtKCK5Mx8O3WYg== +"@angular-devkit/schematics@7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.0.7.tgz#593422584a4f12644b10073035f1760534b718cf" + integrity sha512-E6GHu4257PvymRjFDtpGc0ykdcIcpFIfXr73lq8qxo1SBkqH7Y1/C670elDg9nrCte8PhnhJVNiwNgNS/ZTAzQ== dependencies: - "@angular-devkit/architect" "0.900.1" - "@angular-devkit/core" "9.0.1" - rxjs "6.5.3" + "@angular-devkit/core" "7.0.7" + rxjs "6.3.3" -"@angular-devkit/core@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.0.1.tgz#ef107b0e9eee1a28924cdf92108cdd5ab8df9b69" - integrity sha512-HboJI/x+SJD9clSOAMjHRv0eXAGRAdEaqJGmjDfdFMP2wznfsBiC6cgcHC17oM4jRWFhmWMR8Omc7CjLZJawJg== +"@angular/animations@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.16.tgz#6e3f43df292bc53c3a526dabfd8025b3cd03b070" + integrity sha512-jH7haM3Hgtn1EW9b0Vfq6UqSz+rx3l7k+gJi9tuHEOPZdBTjtv3sNQxmM0IKxzOuTfM8KhRFkUlzyi43kfdp0w== dependencies: - ajv "6.10.2" - fast-json-stable-stringify "2.0.0" - magic-string "0.25.4" - rxjs "6.5.3" - source-map "0.7.3" + tslib "^1.9.0" -"@angular-devkit/schematics@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.0.1.tgz#a27a2ba2b5fec92b33564bc5078c5f13c969931a" - integrity sha512-Cuub9eJm1TWygKTOowRbxMASA8QWeHWzNEU2V3TqUF1Tqy/iPf4cpuMijkFysXjTn2bi2HA9t26AwQkwymbliA== +"@angular/cdk@^7.0.1": + version "7.3.7" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-7.3.7.tgz#ce1ad53ba04beb9c8e950acc5691ea0143753764" + integrity sha512-xbXxhHHKGkVuW6K7pzPmvpJXIwpl0ykBnvA2g+/7Sgy5Pd35wCC+UtHD9RYczDM/mkygNxMQtagyCErwFnDtQA== dependencies: - "@angular-devkit/core" "9.0.1" - ora "4.0.2" - rxjs "6.5.3" - -"@angular/animations@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.0.0.tgz#8d2b852c5273bcc161d13f82faaf3566ab562951" - integrity sha512-jB8+SC3vMztW5zt5UYVmtVwqIWE33UyEjbP5JPba3I3bLRK5E059LcJmN1rSdJHItgIAdG9Y1I0WJ6aiSFyp4Q== - -"@angular/cdk@~9.0.0-rc.10": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-9.0.0.tgz#5734817ae97044f90d304fa0f25c9c1a7fa0bf96" - integrity sha512-2kYpyYbewIB6fubSIDMvSprJLNplRZoL/AtXW3od4dLyRxtzX+7iWTAtzUG/dhq8CKev0lpd1HENh5lLR/Lhjw== + tslib "^1.7.1" optionalDependencies: parse5 "^5.0.0" -"@angular/cli@~9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-9.0.1.tgz#399cdc4f85256074b808738ba3a4dec4167df53a" - integrity sha512-/nykTIqZq1plxaXVoMzAqjnExGhkYoSoq88AE4Mb31d6n/SW2DFh62C3hze+atI6YLqeFaPhYuA5zG+z3oOXbQ== - dependencies: - "@angular-devkit/architect" "0.900.1" - "@angular-devkit/core" "9.0.1" - "@angular-devkit/schematics" "9.0.1" - "@schematics/angular" "9.0.1" - "@schematics/update" "0.900.1" - "@yarnpkg/lockfile" "1.1.0" - ansi-colors "4.1.1" - debug "^4.1.1" - ini "1.3.5" - inquirer "7.0.0" - npm-package-arg "6.1.1" - npm-pick-manifest "3.0.2" - open "7.0.0" - pacote "9.5.8" - read-package-tree "5.3.1" - rimraf "3.0.0" - semver "6.3.0" +"@angular/cli@~7.0.2": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.0.7.tgz#0f4500c5fcf22694c9c40f14d2a5b3dc90fbb4a3" + integrity sha512-SV3CcHa2oxDKwhOvHqZtysVRRT9pkO04Kv0Z1HEhlgIwqHyIU201R9/mo1gYmBHTNGxowKdvsGLsHQNpsHmQJw== + dependencies: + "@angular-devkit/architect" "0.10.7" + "@angular-devkit/core" "7.0.7" + "@angular-devkit/schematics" "7.0.7" + "@schematics/angular" "7.0.7" + "@schematics/update" "0.10.7" + inquirer "6.2.0" + opn "5.3.0" + rxjs "6.3.3" + semver "5.5.1" symbol-observable "1.2.0" - universal-analytics "^0.4.20" - uuid "^3.3.2" -"@angular/common@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.0.0.tgz#0e3b2452d42f87d1825a448a31ad72c593ee0785" - integrity sha512-ZMmEClGtUNJwV5CBlqcSHPIsNyz6WU/GvKWFzJ5VZc68oeg1e7lqfNMNIC47TjyolNJ7VSpNlyrKjzfdBlmqVw== +"@angular/common@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.16.tgz#72127b5ed7d75a400c58b9bd6c2cd691f47c8096" + integrity sha512-lPo2Vt5zmKeKTdMxHMUuViouMiK4QsmO6dGTIhJ7QAx9mov0QYb4sUVKN9Ix32Aeeznaa97qJnhevyDncJqvSA== + dependencies: + tslib "^1.9.0" -"@angular/compiler-cli@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.0.0.tgz#ecce680820725885fed298af69946bdaa12d73d3" - integrity sha512-6L3swd3Z2ceAapmioml6z7yu3bYC2aVm3/rgK7eCoZtPcevuvTpGnXcFSVvNgByV51GntgInThPbMx0xY23Rvw== +"@angular/compiler-cli@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.16.tgz#7936acb5bcc2e53739c09b475de6eb3b27fea9c9" + integrity sha512-3PK0Rlepvsy+MSw5oZEl26j+7E1hBI42T5+7hpZxf/c3vcPRORZ71oR3Ez/q51D2rkvovv8m8Ihv0Xjs0xDibQ== dependencies: canonical-path "1.0.0" - chokidar "^3.0.0" + chokidar "^2.1.1" convert-source-map "^1.5.1" dependency-graph "^0.7.2" - fs-extra "4.0.2" magic-string "^0.25.0" minimist "^1.2.0" reflect-metadata "^0.1.2" - semver "^6.3.0" + shelljs "^0.8.1" source-map "^0.6.1" + tslib "^1.9.0" yargs "13.1.0" -"@angular/compiler@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" - integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== - -"@angular/core@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" - integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== - -"@angular/forms@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.0.0.tgz#2017e4ddee101fa57dc5dc9ba1139b1f02499422" - integrity sha512-SIYJc0Rgaihow1t+iiwSFGEvvRgssgUuxwIYbMfCp1Sx513K+JX9nVFXqU+dcGj/eF1u5wwYwbvlVyuMQLzmXg== - -"@angular/language-service@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-9.0.0.tgz#24ba63ae5db566b70f7c40bb148dc37a77aaa373" - integrity sha512-tOMtXY8DFpTWMF77BOTXZmMMtqvdy6fbyOkJSccn6VatcPrNXOs5rKur+KNwdSlK+djjss6Y+LA8fQAvjNvUqw== - -"@angular/material@~9.0.0-rc.10": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-9.0.0.tgz#655bfd4d4047337e84480b9f92be8e81af375b92" - integrity sha512-QxN2rmR5mvg2YE1NoIGWLpbnmcJq0iFidzy6odzvN17+XkoCJBZ65IdYsHrJgfwGpoIy6bywuixrDHHcSh9I5w== - -"@angular/platform-browser-dynamic@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.0.tgz#1b87355c20d0b2a046c1914085701a3d5ced52da" - integrity sha512-F1kbEpmDottTemRPEOAz2Te5ABVJ7wypfzBllxqXbdxPHvYLfL8db2dXyiGqABQ3ZFHPLNilrkUTy0sbuuU4OA== - -"@angular/platform-browser@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.0.0.tgz#b9454f29d8edaf024668baa9e07083eef73deac2" - integrity sha512-2PR/o57HjZvKEnAF8ODeqxmeC90oth9dLTMrJNoI5MET0IeErKeI/9Sl5cLQuXC+lSVN5rOMCvDb74VWSno5yw== - -"@angular/router@~9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.0.0.tgz#11784fc8ce9cb3314c7ec1083ff9be7c611181c2" - integrity sha512-yyOcStpgN5t8wGRNO85mo0jplXkntP+v2tmSxNx45pahqmofSFm+QCEFa2zHQuMr7NoiGERhd0Tae7NDCCjtjA== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/core@7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" - integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.7" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.7" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.7.5": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" - integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== - dependencies: - "@babel/types" "^7.7.4" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.7.7", "@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== - dependencies: - "@babel/types" "^7.8.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" - integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== - dependencies: - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" - -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== - dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.7.4", "@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" - integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helpers@^7.7.4", "@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.4.3", "@babel/parser@^7.7.5", "@babel/parser@^7.7.7", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== - -"@babel/plugin-proposal-async-generator-functions@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - -"@babel/plugin-proposal-dynamic-import@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - -"@babel/plugin-proposal-json-strings@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - -"@babel/plugin-proposal-object-rest-spread@^7.7.7": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.7.7": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-async-generators@^7.7.4", "@babel/plugin-syntax-async-generators@^7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-dynamic-import@^7.7.4", "@babel/plugin-syntax-dynamic-import@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-json-strings@^7.7.4", "@babel/plugin-syntax-json-strings@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-object-rest-spread@^7.7.4", "@babel/plugin-syntax-object-rest-spread@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.7.4", "@babel/plugin-syntax-optional-catch-binding@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-arrow-functions@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-async-to-generator@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - -"@babel/plugin-transform-block-scoped-functions@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-block-scoping@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" - integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@angular/compiler@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.16.tgz#081f58e9f50399ff0eef346fff37c9c6201cda8d" + integrity sha512-8iX+E9Cnet2167RdP8wM5PGPoEnw/jZNvHrtTRHs4g53n/Rg45iLmE9qFzxCqXGBmUO9LXKYdcXnettFKFLifg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-destructuring@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-dotall-regex@^7.7.7": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-duplicate-keys@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.7.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" - integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + tslib "^1.9.0" -"@babel/plugin-transform-function-name@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@angular/core@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.16.tgz#317f707bc75ca5a90ba470c34e49e6adb7026e85" + integrity sha512-z1RuBinuYeC4KLv8Z95YOgIQLd4nkoApdxkIZaWALwSkgeBuHJn4bCBn2cL0gJ/KO2x18TiTU5HuC+uyBt0AVQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + tslib "^1.9.0" -"@babel/plugin-transform-literals@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@angular/flex-layout@^7.0.0-beta.19": + version "7.0.0-beta.24" + resolved "https://registry.yarnpkg.com/@angular/flex-layout/-/flex-layout-7.0.0-beta.24.tgz#ad2fd2b0ff5e49119a6e0bc2052256967ad749af" + integrity sha512-ll6sK0nLGxqI/f5+z4jbd+pve1QITzgehv2AuGvfSDgIjPMeqUDB5YZqQmIGM/dQRk/vIio5KCW5LQPJWzMMYQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + tslib "^1.7.1" -"@babel/plugin-transform-member-expression-literals@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@angular/forms@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.16.tgz#18769a2203edf87a1cc279dc2145da62b82f144e" + integrity sha512-50JTXco6w1HOi5o6RQ6PVSR0tD4Y2aRcCFBfLXvzDi78aZOSEdOYaSm78RDUNzGCbjwdMCIbX8eOdQgUUtsEFA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + tslib "^1.9.0" -"@babel/plugin-transform-modules-amd@^7.7.5": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@angular/http@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.16.tgz#f05337dd56faa86ce05b0dc378218a00fb337040" + integrity sha512-yvjbNyzFSmmz4UTjCdy5M8mk0cZqf9TvSf8yN5UVIwtw4joyuUdlgJCuin0qSbQOKIf/JjHoofpO2JkPCGSNww== dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + tslib "^1.9.0" -"@babel/plugin-transform-modules-commonjs@^7.7.5": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" +"@angular/language-service@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.16.tgz#920805f110e82f16bf3e1606fd423f82a3a7a85b" + integrity sha512-a/Bqf19+YhqACxQOkpYB0HK/zjHqDrZVUyBtdiX17njuvlWgD4wvdtdxae//ZeIVHNDJS+G5Gelbe+Yzon+VGA== -"@babel/plugin-transform-modules-systemjs@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@angular/material@^7.0.1": + version "7.3.7" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-7.3.7.tgz#dcd95e6618ba6254c5880efee1aad349cf5b9140" + integrity sha512-Eq+7frkeNGkLOfEtmkmJgR+AgoWajOipXZWWfCSamNfpCcPof82DwvGOpAmgGni9FuN2XFQdqP5MoaffQzIvUA== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + tslib "^1.7.1" -"@babel/plugin-transform-modules-umd@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@angular/platform-browser-dynamic@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.16.tgz#57f7f11cece3a3109a821d20b3456d94419718d4" + integrity sha512-xsQ0qB54h7oY5UATK9VW25Y4dvG7uQe9+X4cf/GWB+R3eCzP8J9Ekxs4VU9y2ujlQkD64PV8gpKu0FHFh7wjIQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + tslib "^1.9.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@angular/platform-browser@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.16.tgz#c14d47108e47ac6b2ebbad06fdd69f952b29df32" + integrity sha512-6LltxoPlbtUgSec5a+BGPHZ0UYdqFizxSsplC1PoJdqH17DDxQjxcluAfXnLlvOYFSSPvYa73PSOpmUU2vp4gA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - -"@babel/plugin-transform-new-target@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-object-super@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.7.7": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== - dependencies: - "@babel/helper-call-delegate" "^7.8.3" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-property-literals@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-regenerator@^7.7.5": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-shorthand-properties@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-spread@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - -"@babel/plugin-transform-template-literals@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typeof-symbol@^7.7.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-unicode-regex@^7.7.4": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/preset-env@7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.7.tgz#c294167b91e53e7e36d820e943ece8d0c7fe46ac" - integrity sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg== - dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.4" - "@babel/plugin-proposal-dynamic-import" "^7.7.4" - "@babel/plugin-proposal-json-strings" "^7.7.4" - "@babel/plugin-proposal-object-rest-spread" "^7.7.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.7" - "@babel/plugin-syntax-async-generators" "^7.7.4" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" - "@babel/plugin-syntax-json-strings" "^7.7.4" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" - "@babel/plugin-syntax-top-level-await" "^7.7.4" - "@babel/plugin-transform-arrow-functions" "^7.7.4" - "@babel/plugin-transform-async-to-generator" "^7.7.4" - "@babel/plugin-transform-block-scoped-functions" "^7.7.4" - "@babel/plugin-transform-block-scoping" "^7.7.4" - "@babel/plugin-transform-classes" "^7.7.4" - "@babel/plugin-transform-computed-properties" "^7.7.4" - "@babel/plugin-transform-destructuring" "^7.7.4" - "@babel/plugin-transform-dotall-regex" "^7.7.7" - "@babel/plugin-transform-duplicate-keys" "^7.7.4" - "@babel/plugin-transform-exponentiation-operator" "^7.7.4" - "@babel/plugin-transform-for-of" "^7.7.4" - "@babel/plugin-transform-function-name" "^7.7.4" - "@babel/plugin-transform-literals" "^7.7.4" - "@babel/plugin-transform-member-expression-literals" "^7.7.4" - "@babel/plugin-transform-modules-amd" "^7.7.5" - "@babel/plugin-transform-modules-commonjs" "^7.7.5" - "@babel/plugin-transform-modules-systemjs" "^7.7.4" - "@babel/plugin-transform-modules-umd" "^7.7.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" - "@babel/plugin-transform-new-target" "^7.7.4" - "@babel/plugin-transform-object-super" "^7.7.4" - "@babel/plugin-transform-parameters" "^7.7.7" - "@babel/plugin-transform-property-literals" "^7.7.4" - "@babel/plugin-transform-regenerator" "^7.7.5" - "@babel/plugin-transform-reserved-words" "^7.7.4" - "@babel/plugin-transform-shorthand-properties" "^7.7.4" - "@babel/plugin-transform-spread" "^7.7.4" - "@babel/plugin-transform-sticky-regex" "^7.7.4" - "@babel/plugin-transform-template-literals" "^7.7.4" - "@babel/plugin-transform-typeof-symbol" "^7.7.4" - "@babel/plugin-transform-unicode-regex" "^7.7.4" - "@babel/types" "^7.7.4" - browserslist "^4.6.0" - core-js-compat "^3.6.0" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" + tslib "^1.9.0" -"@babel/template@^7.4.0", "@babel/template@^7.7.4", "@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.4.0", "@babel/types@^7.7.4", "@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@angular/router@^7.0.0": + version "7.2.16" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.16.tgz#7518a387ff959c13ba2648ce52e0bcd48f3292ca" + integrity sha512-SXDfkoGVUHhy83K+sR+39mmqTs4nSUh4DZbhFe4gii+mgAtBvlbeH8KBCqPNf7xq24aadyI2LCSGnGwgVKmXrA== dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" + tslib "^1.9.0" -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@ngtools/webpack@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-9.0.1.tgz#36fff5b269959b37eee4c23c8c22bd7686aa4860" - integrity sha512-SG1MDVSC7pIuaX1QYTh94k/YJa6w2OR2RNbghkDXToDzDv6bKnTQYoJPyXk+gwfDTVD4V5z2dKSNbxFzWleFpg== - dependencies: - "@angular-devkit/core" "9.0.1" - enhanced-resolve "4.1.1" - rxjs "6.5.3" - webpack-sources "1.4.3" - -"@schematics/angular@9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.0.1.tgz#1b08c938da4dcee2472b4641f3cbc906d6eb88af" - integrity sha512-lQ8Qc697ef2jvEf1+tElAUsbOnbUAMo3dnOUVw9RlYO90pHeG3/OdWBMH1kjn3jbjuKuvCVZH3voJUUcLDx6eg== - dependencies: - "@angular-devkit/core" "9.0.1" - "@angular-devkit/schematics" "9.0.1" - -"@schematics/update@0.900.1": - version "0.900.1" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.900.1.tgz#4923be88b94b5db0b04cd2c7f3e75e67a4a13688" - integrity sha512-p2xfctTtT5kMAaCTBENxi69m5IhsvdTwwwokb9zVHJYAC6D1K//q1bl30mTe6U2YE3hSPWND2S14ahXw8PyN8g== - dependencies: - "@angular-devkit/core" "9.0.1" - "@angular-devkit/schematics" "9.0.1" - "@yarnpkg/lockfile" "1.1.0" - ini "1.3.5" - npm-package-arg "^7.0.0" - pacote "9.5.8" - rxjs "6.5.3" - semver "6.3.0" +"@ngtools/json-schema@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922" + +"@ngtools/webpack@7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.0.7.tgz#0cd933534a878f25f69448435302c82a861096a6" + integrity sha512-ukZv/8vhiVWLsEEWF1uena8GHRVUpwbPJ+8AupW25d2nNpwfsDtTIXKzTzRYeIQFFCnHJxr04lK18CVsn1lFaQ== + dependencies: + "@angular-devkit/core" "7.0.7" + enhanced-resolve "4.1.0" + rxjs "6.3.3" + tree-kill "1.2.0" + webpack-sources "1.2.0" + +"@schematics/angular@7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.0.7.tgz#2aabf02779b1e5c6035135a652b5402f5785eae6" + integrity sha512-xDSMAtOdKNa5uqsEfbwBVHVCjpNSmIIcadi0Rki+5Nmobf5nnQWPly1/xj5aHzT6SKuV4BIMvsBG9UgI9Ss/Iw== + dependencies: + "@angular-devkit/core" "7.0.7" + "@angular-devkit/schematics" "7.0.7" + typescript "3.1.6" + +"@schematics/update@0.10.7": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.10.7.tgz#c74c65cb679003b035a25f4f354f48d1054d8eca" + integrity sha512-E4txrdnIcNn1K0xFPmY4ywAnVj+hN2QB1wBijoAMezYTEjcKxW0g6thPfUv6qhIPcphxrCOqwl6cIELZjq2dtA== + dependencies: + "@angular-devkit/core" "7.0.7" + "@angular-devkit/schematics" "7.0.7" + npm-registry-client "8.6.0" + rxjs "6.3.3" + semver "5.5.1" semver-intersect "1.4.0" -"@types/estree@*": - version "0.0.42" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.42.tgz#8d0c1f480339efedb3e46070e22dd63e0430dd11" - integrity sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ== +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/jasmine@*", "@types/jasmine@~3.5.0": - version "3.5.3" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.3.tgz#e41ba279166d3838e68aa34738dd890c846ee3f8" - integrity sha512-LRJ21f/BO4QNZ3YDaMP0OEurOfE77x8mi8MfEnUsei5IKfmZL0GKl7juhABMdUIJHhVS9OCLotKHfsFNAuJ+DA== +"@types/jasmine@*", "@types/jasmine@~2.8.6": + version "2.8.8" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" "@types/jasminewd2@~2.0.3": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.8.tgz#67afe5098d5ef2386073a7b7384b69a840dfe93b" - integrity sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95" dependencies: "@types/jasmine" "*" -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/lodash@^4.14.110": + version "4.14.115" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.115.tgz#54d171b2ce12c058742443b5f6754760f701b8f9" "@types/node@*": - version "13.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.1.tgz#238eb34a66431b71d2aaddeaa7db166f25971a0d" - integrity sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA== + version "10.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.5.tgz#8e84d24e896cd77b0d4f73df274027e3149ec2ba" -"@types/node@^12.11.1": - version "12.12.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.27.tgz#d7506f73160ad30fcebbcf5b8b7d2d976e649e42" - integrity sha512-odQFl/+B9idbdS0e8IxDl2ia/LP8KZLXhV3BUeI98TrZp0uoIzQPhGd+5EtzHmT0SMOIaPd7jfz6pOHLWTtl7A== +"@types/node@~10.12.0": + version "10.12.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.30.tgz#4c2b4f0015f214f8158a347350481322b3b29b2f" + integrity sha512-nsqTN6zUcm9xtdJiM9OvOJ5EF0kOI8f1Zuug27O/rgtxCRJHGqncSWfCMZUP852dCKPsDsYXGvBhxfRjDBkF5Q== "@types/q@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" - integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= -"@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== - -"@types/selenium-webdriver@^3.0.0": - version "3.0.16" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz#50a4755f8e33edacd9c406729e9b930d2451902a" - integrity sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/webpack-sources@^0.1.5": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.6.tgz#3d21dfc2ec0ad0c77758e79362426a9ba7d7cbcb" - integrity sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ== +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== dependencies: "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== +"@types/selenium-webdriver@^3.0.0": + version "3.0.17" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" + integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== + +"@webassemblyjs/ast@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" + integrity sha512-8nkZS48EVsMUU0v6F1LCIOw4RYWLm2plMtbhFTjNgeXmsTNLuU3xTRtnljt9BFQB+iPbLRobkNrCWftWnNC7wQ== dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" + mamacro "^0.0.3" -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== +"@webassemblyjs/floating-point-hex-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" + integrity sha512-VBOZvaOyBSkPZdIt5VBMg3vPWxouuM13dPXGWI1cBh3oFLNcFJ8s9YA7S9l4mPI7+Q950QqOmqj06oa83hNWBA== -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== +"@webassemblyjs/helper-api-error@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" + integrity sha512-SCzhcQWHXfrfMSKcj8zHg1/kL9kb3aa5TN4plc/EREOs5Xop0ci5bdVBApbk2yfVi8aL+Ly4Qpp3/TRAUInjrg== -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== +"@webassemblyjs/helper-buffer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" + integrity sha512-1/gW5NaGsEOZ02fjnFiU8/OEEXU1uVbv2um0pQ9YVL3IHSkyk6xOwokzyqqO1qDZQUAllb+V8irtClPWntbVqw== -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== +"@webassemblyjs/helper-code-frame@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" + integrity sha512-+suMJOkSn9+vEvDvgyWyrJo5vJsWSDXZmJAjtoUq4zS4eqHyXImpktvHOZwXp1XQjO5H+YQwsBgqTQEc0J/5zg== dependencies: - "@webassemblyjs/wast-printer" "1.8.5" + "@webassemblyjs/wast-printer" "1.7.6" -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== +"@webassemblyjs/helper-fsm@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" + integrity sha512-HCS6KN3wgxUihGBW7WFzEC/o8Eyvk0d56uazusnxXthDPnkWiMv+kGi9xXswL2cvfYfeK5yiM17z2K5BVlwypw== -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== +"@webassemblyjs/helper-module-context@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" + integrity sha512-e8/6GbY7OjLM+6OsN7f2krC2qYVNaSr0B0oe4lWdmq5sL++8dYDD1TFbD1TdAdWMRTYNr/Qq7ovXWzia2EbSjw== dependencies: - "@webassemblyjs/ast" "1.8.5" mamacro "^0.0.3" -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== +"@webassemblyjs/helper-wasm-bytecode@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" + integrity sha512-PzYFCb7RjjSdAOljyvLWVqd6adAOabJW+8yRT+NWhXuf1nNZWH+igFZCUK9k7Cx7CsBbzIfXjJc7u56zZgFj9Q== -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== +"@webassemblyjs/helper-wasm-section@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" + integrity sha512-3GS628ppDPSuwcYlQ7cDCGr4W2n9c4hLzvnRKeuz+lGsJSmc/ADVoYpm1ts2vlB1tGHkjtQMni+yu8mHoMlKlA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/ieee754@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" + integrity sha512-V4cIp0ruyw+hawUHwQLn6o2mFEw4t50tk530oKsYXQhEzKR+xNGDxs/SFFuyTO7X3NzEu4usA3w5jzhl2RYyzQ== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" +"@webassemblyjs/leb128@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" + integrity sha512-ojdlG8WpM394lBow4ncTGJoIVZ4aAtNOWHhfAM7m7zprmkVcKK+2kK5YJ9Bmj6/ketTtOn7wGSHCtMt+LzqgYQ== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" + integrity sha512-oId+tLxQ+AeDC34ELRYNSqJRaScB0TClUU6KQfpB8rNT6oelYlz8axsPhf6yPTg7PBJ/Z5WcXmUYiHEWgbbHJw== + +"@webassemblyjs/wasm-edit@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" + integrity sha512-pTNjLO3o41v/Vz9VFLl+I3YLImpCSpodFW77pNoH4agn5I6GgSxXHXtvWDTvYJFty0jSeXZWLEmbaSIRUDlekg== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/helper-wasm-section" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-opt" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + "@webassemblyjs/wast-printer" "1.7.6" + +"@webassemblyjs/wasm-gen@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" + integrity sha512-mQvFJVumtmRKEUXMohwn8nSrtjJJl6oXwF3FotC5t6e2hlKMh8sIaW03Sck2MDzw9xPogZD7tdP5kjPlbH9EcQ== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" + +"@webassemblyjs/wasm-opt@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" + integrity sha512-go44K90fSIsDwRgtHhX14VtbdDPdK2sZQtZqUcMRvTojdozj5tLI0VVJAzLCfz51NOkFXezPeVTAYFqrZ6rI8Q== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + +"@webassemblyjs/wasm-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" + integrity sha512-t1T6TfwNY85pDA/HWPA8kB9xA4sp9ajlRg5W7EKikqrynTyFo+/qDzIpvdkOkOGjlS6d4n4SX59SPuIayR22Yg== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" + +"@webassemblyjs/wast-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" + integrity sha512-1MaWTErN0ziOsNUlLdvwS+NS1QWuI/kgJaAGAMHX8+fMJFgOJDmN/xsG4h/A1Gtf/tz5VyXQciaqHZqp2q0vfg== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/floating-point-hex-parser" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-code-frame" "1.7.6" + "@webassemblyjs/helper-fsm" "1.7.6" + "@xtuc/long" "4.2.1" + mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" + integrity sha512-vHdHSK1tOetvDcl1IV1OdDeGNe/NDDQ+KzuZHMtqTVP1xO/tZ/IKNpj5BaGk1OYFdsDWQqb31PIwdEyPntOWRQ== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" + "@xtuc/long" "4.2.1" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== -"@yarnpkg/lockfile@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -JSONStream@^1.3.4: +accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" + mime-types "~2.1.18" + negotiator "0.6.1" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: +accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -1205,86 +495,83 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn-walk@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + +acorn@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + +acorn@^5.6.2: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== adm-zip@^0.4.9: - version "0.4.14" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9" - integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g== + version "0.4.11" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - -agent-base@4, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" -agent-base@~4.2.1: +agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" -agentkeepalive@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== +ajv@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" - integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== +ajv@^5.0.0, ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: - fast-deep-equal "^3.1.1" + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + dependencies: + fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + uri-js "^4.2.1" -ajv@^6.10.0: +ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -1294,82 +581,69 @@ ajv@^6.10.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== - dependencies: - type-fest "^0.8.1" +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -app-root-path@^2.2.1: +app-root-path@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== @@ -1377,142 +651,145 @@ app-root-path@^2.2.1: append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: default-require-extensions "^2.0.0" -aproba@^1.1.1: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" + arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@^2.0.0, asap@~2.0.3: +asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" dependencies: - object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async@1.x, async@^1.4.0, async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" -async@^2.5.0, async@^2.6.2: +async@^2.5.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -1522,89 +799,143 @@ async@^2.5.0, async@^2.6.2: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +autoprefixer@9.1.5: + version "9.1.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.1.5.tgz#8675fd8d1c0d43069f3b19a2c316f3524e4f6671" + integrity sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw== + dependencies: + browserslist "^4.1.0" + caniuse-lite "^1.0.30000884" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.2" + postcss-value-parser "^3.2.3" -autoprefixer@9.7.1: - version "9.7.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.1.tgz#9ffc44c55f5ca89253d9bb7186cefb01ef57747f" - integrity sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw== +autoprefixer@^9.0.0: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== dependencies: - browserslist "^4.7.2" - caniuse-lite "^1.0.30001006" + browserslist "^4.8.3" + caniuse-lite "^1.0.30001020" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.21" + postcss "^7.0.26" postcss-value-parser "^4.0.2" aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" aws4@^1.8.0: version "1.9.1" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axobject-query@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - ast-types-flow "0.0.7" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-generator@^6.18.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" -babel-loader@8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== +babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - pify "^4.0.1" + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1617,36 +948,36 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" bindings@^1.5.0: version "1.5.0" @@ -1660,14 +991,23 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + blocking-proxy@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" - integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== dependencies: minimist "^1.2.0" -bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: +bluebird@^3.3.0, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -1675,11 +1015,25 @@ bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.19.0, body-parser@^1.16.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: bytes "3.1.0" @@ -1693,10 +1047,24 @@ body-parser@1.19.0, body-parser@^1.16.1: raw-body "2.4.0" type-is "~1.6.17" +body-parser@^1.16.1: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -1705,23 +1073,46 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: +brace@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1734,22 +1125,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1761,7 +1143,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" @@ -1770,7 +1151,6 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1780,7 +1160,6 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1788,7 +1167,6 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1801,27 +1179,17 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" -browserslist@4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44" - integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg== - dependencies: - caniuse-lite "^1.0.30001017" - electron-to-chromium "^1.3.322" - node-releases "^1.1.44" - -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.2, browserslist@^4.8.3: - version "4.8.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" - integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== +browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.8.3: + version "4.9.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.1.tgz#01ffb9ca31a1aef7678128fc6a2253316aa7287c" + integrity sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw== dependencies: - caniuse-lite "^1.0.30001023" - electron-to-chromium "^1.3.341" - node-releases "^1.1.47" + caniuse-lite "^1.0.30001030" + electron-to-chromium "^1.3.363" + node-releases "^1.1.50" browserstack@^1.5.1: version "1.5.3" @@ -1830,108 +1198,80 @@ browserstack@^1.5.1: dependencies: https-proxy-agent "^2.2.1" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0: +buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.1.1: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@13.0.1, cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" - p-map "^3.0.0" promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" -cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== +cacache@^11.0.2: + version "11.3.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== dependencies: bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" glob "^7.1.4" graceful-fs "^4.1.15" - infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" @@ -1945,7 +1285,6 @@ cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1957,69 +1296,66 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@1.0.30001020: - version "1.0.30001020" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz#3f04c1737500ffda78be9beb0b5c1e2070e15926" - integrity sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA== - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001006, caniuse-lite@^1.0.30001017, caniuse-lite@^1.0.30001023: - version "1.0.30001027" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001027.tgz#283e2ef17d94889cc216a22c6f85303d78ca852d" - integrity sha512-7xvKeErvXZFtUItTHgNtLgS9RJpVnwBlWX8jSo/BO8VsF6deszemZSkJJJA1KOKrXuzZH4WALpAJdq5EyfgMLg== +caniuse-lite@^1.0.30000884, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001030: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -2027,7 +1363,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2036,27 +1372,44 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.3.0" +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +chokidar@2.0.4, chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + 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" optionalDependencies: - fsevents "~2.1.2" + fsevents "^1.2.2" -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.1: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2075,170 +1428,179 @@ chokidar@^2.0.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chrome-trace-event@^1.0.2: +chrome-trace-event@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" +ci-info@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-dependency-plugin@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" - integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== +circular-dependency-plugin@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef" + integrity sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA== + +circular-json@^0.5.5: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-css@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== +clean-css@^4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" dependencies: - restore-cursor "^3.1.0" + source-map "0.5.x" -cli-spinners@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" - integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" dependencies: + for-own "^1.0.0" is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" + kind-of "^6.0.0" + shallow-clone "^1.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" -clone@^2.1.1, clone@^2.1.2: +clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codelyzer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.2.1.tgz#44fd431e128009f38c761828c33ebacba9549d32" - integrity sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA== +codelyzer@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.5.0.tgz#a65ddeeeca2894653253a89bfa229118ff9f59b1" + integrity sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ== dependencies: - app-root-path "^2.2.1" - aria-query "^3.0.0" - axobject-query "2.0.2" - css-selector-tokenizer "^0.7.1" + app-root-path "^2.1.0" + css-selector-tokenizer "^0.7.0" cssauron "^1.4.0" - damerau-levenshtein "^1.0.4" semver-dsl "^1.0.1" source-map "^0.5.7" - sprintf-js "^1.1.2" + sprintf-js "^1.1.1" collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== +color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" + color-name "1.1.1" -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" colors@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= colors@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.1.tgz#4accdb89cf2cabc7f982771925e9468784f32f3d" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -2247,100 +1609,111 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: +commander@^2.12.0, commander@^2.12.1, commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + +commander@^2.18.0, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -compare-versions@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.1.tgz#26e1f5cf0d48a77eced5046b9f67b6b61075a393" - integrity sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg== +compare-versions@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== +compressible@~2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" dependencies: - mime-db ">= 1.43.0 < 2" + mime-db ">= 1.34.0 < 2" -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" dependencies: accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.16" + compressible "~2.0.14" debug "2.6.9" - on-headers "~1.0.2" + on-headers "~1.0.1" safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" connect@^3.6.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" dependencies: debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" + finalhandler "1.1.0" + parseurl "~1.3.2" utils-merge "1.0.1" console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" content-disposition@0.5.3: version "0.5.3" @@ -2352,9 +1725,12 @@ content-disposition@0.5.3: content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.1, convert-source-map@^1.7.0: +convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +convert-source-map@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -2364,12 +1740,10 @@ convert-source-map@^1.5.1, convert-source-map@^1.7.0: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= cookie@0.4.0: version "0.4.0" @@ -2379,7 +1753,6 @@ cookie@0.4.0: copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" @@ -2391,82 +1764,58 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" - integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== +copy-webpack-plugin@4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27" + integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ== dependencies: - cacache "^12.0.3" - find-cache-dir "^2.1.0" - glob-parent "^3.1.0" + cacache "^10.0.4" + find-cache-dir "^1.0.0" globby "^7.1.1" - is-glob "^4.0.1" - loader-utils "^1.2.3" + is-glob "^4.0.0" + loader-utils "^1.1.0" minimatch "^3.0.4" - normalize-path "^3.0.0" - p-limit "^2.2.1" - schema-utils "^1.0.0" - serialize-javascript "^2.1.2" - webpack-log "^2.0.0" - -core-js-compat@^3.6.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== - dependencies: - browserslist "^4.8.3" - semver "7.0.0" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" -core-js@3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.0.tgz#2b854e451de1967d1e29896025cdc13a2518d9ea" - integrity sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q== +core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.4: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" -core-js@^3.1.3: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== +core-js@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" dependencies: - import-fresh "^2.0.0" is-directory "^0.3.1" - js-yaml "^3.13.1" + js-yaml "^3.9.0" parse-json "^4.0.0" - -coverage-istanbul-loader@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz#87d42f03fa0fd3fa8743ec76945d9d67f105722a" - integrity sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA== - dependencies: - convert-source-map "^1.7.0" - istanbul-lib-instrument "^4.0.0" - loader-utils "^1.2.3" - merge-source-map "^1.1.0" - schema-utils "^2.6.1" + require-from-string "^2.0.1" create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -2477,7 +1826,6 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2486,6 +1834,21 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2500,7 +1863,6 @@ cross-spawn@^6.0.0: crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -2514,299 +1876,133 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" +css-parse@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" -css-selector-tokenizer@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" - integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== +css-selector-tokenizer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" dependencies: cssesc "^0.1.0" fastparse "^1.1.1" regexpu-core "^1.0.0" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-unit-converter@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" - integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= - -css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - cssauron@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" - integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= dependencies: through X.X.X cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== -cssnano@4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" -csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" dependencies: - css-tree "1.0.0-alpha.37" + array-find-index "^1.0.1" custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -damerau-levenshtein@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" -date-format@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== +date-format@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" + integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@3.1.0, debug@~3.1.0: +debug@*, debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: - ms "^2.1.1" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + ms "2.0.0" -decamelize@^1.2.0: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== dependencies: - execa "^1.0.0" + execa "^0.10.0" ip-regex "^2.1.0" default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= dependencies: strip-bom "^3.0.0" -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2814,7 +2010,6 @@ define-property@^2.0.2: del@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2824,28 +2019,32 @@ del@^2.2.0: pinkie-promise "^2.0.0" rimraf "^2.2.8" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" dependencies: - "@types/glob" "^7.1.1" globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -depd@~1.1.2: +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dependency-graph@^0.7.2: version "0.7.2" @@ -2853,9 +2052,8 @@ dependency-graph@^0.7.2: integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2863,61 +2061,51 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" -dezalgo@^1.0.0: +detect-libc@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= - dependencies: - asap "^2.0.0" - wrappy "1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= -diff@^3.2.0: +diff@^3.1.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" dependencies: + arrify "^1.0.1" path-type "^3.0.0" dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -2925,62 +2113,39 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= dependencies: custom-event "~1.0.0" ent "~2.2.0" extend "^3.0.0" void-elements "^2.0.0" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" -dot-prop@^4.1.1: +dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -2990,7 +2155,6 @@ duplexify@^3.4.2, duplexify@^3.6.0: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -2998,17 +2162,20 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.322, electron-to-chromium@^1.3.341: - version "1.3.348" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.348.tgz#61fa7d43f6c4fd8b046b0b69213cb55b7a4c76a5" - integrity sha512-6O0IInybavGdYtcbI4ryF/9e3Qi8/soi6C68ELRseJuTwQPKq39uGgVVeQHG28t69Sgsky09nXBRhUiFXsZyFQ== +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.363: + version "1.3.376" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz#7cb7b5205564a06c8f8ecfbe832cbd47a1224bb1" + integrity sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw== elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -3023,32 +2190,17 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.2: +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" dependencies: once "^1.4.0" @@ -3092,7 +2244,16 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@4.1.1, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== @@ -3104,81 +2265,53 @@ enhanced-resolve@4.1.1, enhanced-resolve@^4.1.0: ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promise@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^4.0.3: +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +eslint-scope@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -3186,58 +2319,91 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estree-walker@^0.5.1, estree-walker@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - -events@^3.0.0: +eventemitter3@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" dependencies: - original "^1.0.0" + original ">=0.0.5" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3254,12 +2420,24 @@ execa@^1.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3269,7 +2447,55 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@^4.17.1: +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@^4.16.2: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +express@^4.16.3: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -3308,24 +2534,21 @@ express@^4.17.1: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: +external-editor@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== @@ -3334,10 +2557,15 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3351,103 +2579,133 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== -fast-json-stable-stringify@2.0.0: +fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" fastparse@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" dependencies: websocket-driver ">=0.5.1" -figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: +figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== -figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" -file-loader@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e" - integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ== +file-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.0.0" + loader-utils "^1.0.2" + schema-utils "^1.0.0" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fileset@^2.0.3: +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: - to-regex-range "^5.0.1" + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" -finalhandler@1.1.2, finalhandler@~1.1.2: +finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -3460,16 +2718,15 @@ finalhandler@1.1.2, finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.0.0.tgz#cd4b7dd97b7185b7e17dbfe2d6e4115ee3eeb8fc" - integrity sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw== +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" dependencies: commondir "^1.0.1" - make-dir "^3.0.0" - pkg-dir "^4.1.0" + make-dir "^1.0.0" + pkg-dir "^2.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -3478,14 +2735,22 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" - integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: - commondir "^1.0.1" - make-dir "^3.0.0" - pkg-dir "^4.1.0" + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" @@ -3494,43 +2759,55 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - flatted@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" + inherits "^2.0.1" + readable-stream "^2.0.4" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" dependencies: - debug "^3.0.0" + debug "^3.1.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" -for-in@^1.0.2: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" form-data@~2.3.2: version "2.3.3" @@ -3544,38 +2821,31 @@ form-data@~2.3.2: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" - integrity sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s= +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" + null-check "^1.0.0" -fs-extra@^7.0.1: +fs-extra@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -3585,23 +2855,14 @@ fs-extra@^7.0.1: universalify "^0.1.0" fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" + minipass "^2.2.1" fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -3611,9 +2872,15 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fsevents@^1.2.7: version "1.2.11" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== @@ -3621,37 +2888,52 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" -genfun@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" - integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + dependencies: + globule "^1.0.0" get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stream@^4.0.0, get-stream@^4.1.0: +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -3661,34 +2943,79 @@ get-stream@^4.0.0, get-stream@^4.1.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== +glob@7.0.x: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" dependencies: - is-glob "^4.0.1" + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" -glob@7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3697,7 +3024,7 @@ glob@7.1.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3709,15 +3036,19 @@ glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3729,7 +3060,6 @@ globby@^5.0.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -3740,7 +3070,6 @@ globby@^6.1.0: globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -3749,20 +3078,71 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2: +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^4.1.15: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + +handlebars@^4.0.1, handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" har-validator@~5.1.3: version "5.1.3" @@ -3775,7 +3155,6 @@ har-validator@~5.1.3: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" @@ -3789,27 +3168,22 @@ has-binary2@~1.0.2: has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3818,7 +3192,6 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3827,131 +3200,91 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== -hosted-git-info@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" - integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== - dependencies: - lru-cache "^5.1.1" +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" obuf "^1.0.0" readable-stream "^2.0.1" wbuf "^1.1.0" -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-entities@^1.2.1: +html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= - -html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== - -http-cache-semantics@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: - depd "~1.1.2" + depd "1.1.1" inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" -http-errors@~1.6.2: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" @@ -3963,42 +3296,30 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" dependencies: - http-proxy "^1.17.0" + http-proxy "^1.16.2" is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + lodash "^4.17.5" + micromatch "^3.1.9" -http-proxy@^1.13.0, http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== +http-proxy@^1.13.0, http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" dependencies: - eventemitter3 "^4.0.0" + eventemitter3 "^3.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -4007,24 +3328,25 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: - agent-base "^4.3.0" + agent-base "^4.1.0" debug "^3.1.0" -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@0.4.23, iconv-lite@^0.4.4: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: - ms "^2.0.0" + safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4032,59 +3354,47 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" dependencies: minimatch "^3.0.4" ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= dependencies: import-from "^2.1.0" -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= dependencies: resolve-from "^3.0.0" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -4096,90 +3406,91 @@ import-local@^2.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@1.3.5, ini@^1.3.4: +ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== +injection-js@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/injection-js/-/injection-js-2.2.1.tgz#a8d6a085b2f0b8d8650f6f4487f6abb8cc0d67ce" + +inquirer@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^4.1.0" - strip-ansi "^5.1.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -4190,119 +3501,72 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ip@1.1.5, ip@^1.1.0, ip@^1.1.5: +ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" -ipaddr.js@^1.9.0: +ipaddr.js@1.9.1, ipaddr.js@^1.5.2: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" -is-color-stop@^1.0.0: +is-ci@^1.0.10: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" + ci-info "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4311,7 +3575,6 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4320,188 +3583,174 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" dependencies: is-extglob "^2.1.1" -is-interactive@^1.0.0: +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + +is-npm@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" -is-resolvable@^1.0.0: +is-retry-allowed@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" -is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isarray@2.0.1: version "2.0.1" @@ -4509,144 +3758,139 @@ isarray@2.0.1: integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isbinaryfile@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.6.tgz#d61702a9d1c66ad89d92e66d401e16b0bda4a35f" - integrity sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA== - dependencies: - async "^2.6.2" - compare-versions "^3.4.0" - fileset "^2.0.3" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-hook "^2.0.7" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" - js-yaml "^3.13.1" - make-dir "^2.1.0" - minimatch "^3.0.4" +istanbul-api@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + dependencies: + async "^2.1.4" + compare-versions "^3.1.0" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-hook "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-report "^1.1.4" + istanbul-lib-source-maps "^1.2.4" + istanbul-reports "^1.3.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-instrumenter-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" + integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== + dependencies: + convert-source-map "^1.5.0" + istanbul-lib-instrument "^1.7.3" + loader-utils "^1.1.0" + schema-utils "^0.3.0" -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" -istanbul-lib-hook@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" - integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== +istanbul-lib-hook@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" - integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== - dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.7.3: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.0" + semver "^5.3.0" -istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== +istanbul-lib-report@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" -istanbul-reports@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" - integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== +istanbul-lib-source-maps@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" dependencies: - html-escaper "^2.0.0" + debug "^3.1.0" + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" -jasmine-core@^3.3, jasmine-core@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" - integrity sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA== +istanbul-reports@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" + dependencies: + handlebars "^4.0.3" + +istanbul@0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + 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" jasmine-core@~2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" - integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= + +jasmine-core@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.2.1.tgz#8e4ff5b861603ee83343f2b49eee6a0ffe9650ce" + integrity sha512-pa9tbBWgU0EE4SWgc85T4sa886ufuQdsgruQANhECYjwqgV4z7Vw/499aCaP8ZH79JDS4vhm8doDG9HO4+e4sA== jasmine-spec-reporter@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" - integrity sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg== dependencies: colors "1.1.2" jasmine@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" - integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= dependencies: exit "^0.1.2" glob "^7.0.6" @@ -4655,38 +3899,22 @@ jasmine@2.8.0: jasminewd2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" - integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= - -jest-worker@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== +js-base64@^2.1.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.x, js-yaml@^3.7.0, js-yaml@^3.9.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4694,73 +3922,52 @@ js-yaml@^3.13.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4768,70 +3975,67 @@ jsprim@^1.2.2: verror "1.10.0" jszip@^3.1.3: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.2.tgz#b143816df7e106a9597a94c77493385adca5bd1d" - integrity sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA== + version "3.1.5" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" dependencies: - lie "~3.3.0" + core-js "~2.3.0" + es6-promise "~3.0.2" + lie "~3.1.0" pako "~1.0.2" - readable-stream "~2.3.6" - set-immediate-shim "~1.0.1" + readable-stream "~2.0.6" -karma-chrome-launcher@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" - integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== +karma-chrome-launcher@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" dependencies: + fs-access "^1.0.0" which "^1.2.1" -karma-coverage-istanbul-reporter@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz#37a775fbfbb3cbe98cebf19605c94c6277c3b88a" - integrity sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A== +karma-coverage-istanbul-reporter@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz#26b969317d191c6a897c783b4ffe7831cb92e684" dependencies: - istanbul-api "^2.1.6" + istanbul-api "^1.3.1" minimatch "^3.0.4" -karma-jasmine-html-reporter@^1.4.2: +karma-jasmine-html-reporter@^1.3.1: version "1.5.2" resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.2.tgz#a846b703dbe5c8d803481e68636eb93346dc5966" integrity sha512-ILBPsXqQ3eomq+oaQsM311/jxsypw5/d0LnZXj26XkfThwq7jZ55A2CFSKJVA5VekbbOGvMyv7d3juZj0SeTxA== -karma-jasmine@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-2.0.1.tgz#26e3e31f2faf272dd80ebb0e1898914cc3a19763" - integrity sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA== - dependencies: - jasmine-core "^3.3" +karma-jasmine@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3" -karma-source-map-support@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" - integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== +karma-source-map-support@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde" + integrity sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q== dependencies: source-map-support "^0.5.5" -karma@~4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/karma/-/karma-4.3.0.tgz#e14471ea090a952265a42ebb442b1a3c09832559" - integrity sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ== +karma@~3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.4.tgz#3890ca9722b10d1d14b726e1335931455788499e" + integrity sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw== dependencies: bluebird "^3.3.0" body-parser "^1.16.1" - braces "^3.0.2" - chokidar "^3.0.0" + chokidar "^2.0.3" colors "^1.1.0" + combine-lists "^1.0.0" connect "^3.6.0" - core-js "^3.1.3" + core-js "^2.2.0" di "^0.0.1" dom-serialize "^2.2.0" + expand-braces "^0.1.1" flatted "^2.0.0" glob "^7.1.1" graceful-fs "^4.1.2" http-proxy "^1.13.0" isbinaryfile "^3.0.0" - lodash "^4.17.14" - log4js "^4.0.0" + lodash "^4.17.5" + log4js "^3.0.0" mime "^2.3.1" minimatch "^3.0.2" optimist "^0.6.1" @@ -4844,34 +4048,45 @@ karma@~4.3.0: tmp "0.0.33" useragent "2.3.0" -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== +killable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" lcid@^2.0.0: version "2.0.0" @@ -4880,19 +4095,27 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -less-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" - integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== +less-loader@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== dependencies: clone "^2.1.1" loader-utils "^1.1.0" - pify "^4.0.1" + pify "^3.0.0" + +less-plugin-npm-import@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz#823e6986c93318a98171ca858848b6bead55bf3e" + integrity sha1-gj5phskzGKmBccqFiEi2vq1Vvz4= + dependencies: + promise "~7.0.1" + resolve "~1.1.6" -less@3.10.3: - version "3.10.3" - resolved "https://registry.yarnpkg.com/less/-/less-3.10.3.tgz#417a0975d5eeecc52cff4bcfa3c09d35781e6792" - integrity sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow== +less@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q== dependencies: clone "^2.1.2" optionalDependencies: @@ -4905,34 +4128,80 @@ less@3.10.3: request "^2.83.0" source-map "~0.6.0" -license-webpack-plugin@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz#656fa6a8b2e711ee35c27ac8e1659a87240ef7f3" - integrity sha512-vTSY5r9HOq4sxR2BIxdIXWKI+9n3b+DoQkhKHedB3TdSxTfXUDRxKXdAj5iejR+qNXprXsxvEu9W+zOhgGIkAw== +less@^3.8.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.11.1.tgz#c6bf08e39e02404fe6b307a3dfffafdc55bd36e2" + integrity sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g== + dependencies: + clone "^2.1.2" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +license-webpack-plugin@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz#9d34b521cb7fca8527945310b05be6ef0248b687" + integrity sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA== dependencies: - "@types/webpack-sources" "^0.1.5" webpack-sources "^1.2.0" -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== +lie@~3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" dependencies: immediate "~3.0.5" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: - big.js "^5.2.2" + big.js "^3.1.3" emojis-list "^2.0.0" - json5 "^1.0.1" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" locate-path@^3.0.0: version "3.0.0" @@ -4942,72 +4211,74 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash-es@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" -lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" -lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@~4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log4js@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" + integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== dependencies: - chalk "^2.4.2" + circular-json "^0.5.5" + date-format "^1.2.0" + debug "^3.1.0" + rfdc "^1.1.2" + streamroller "0.7.0" -log4js@^4.0.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" - integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== - dependencies: - date-format "^2.0.0" - debug "^4.1.1" - flatted "^2.0.0" - rfdc "^1.1.4" - streamroller "^1.0.6" +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" -loglevel@^1.6.4: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@4.1.x: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== +loud-rejection@^1.0.0, loud-rejection@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + +lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -5019,21 +4290,26 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -magic-string@0.25.4: - version "0.25.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" - integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" dependencies: - sourcemap-codec "^1.4.4" + vlq "^0.2.2" magic-string@^0.25.0: - version "0.25.6" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.6.tgz#5586387d1242f919c6d223579cc938bf1420795e" - integrity sha512-3a5LOMSGoCTH5rbqobC2HuDNRtE2glHZ8J7pK+QZYppyWA36yuNpsX994rIY2nCuyP7CZYy7lQq/X2jygiZ89g== + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: sourcemap-codec "^1.4.4" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -5041,34 +4317,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - make-error@^1.1.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== - -make-fetch-happen@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" - integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== - dependencies: - agentkeepalive "^3.4.1" - cacache "^12.0.0" - http-cache-semantics "^3.8.1" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - node-fetch-npm "^2.0.2" - promise-retry "^1.1.1" - socks-proxy-agent "^4.0.0" - ssri "^6.0.0" + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" mamacro@^0.0.3: version "0.0.3" @@ -5085,33 +4336,31 @@ map-age-cleaner@^0.1.1: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" dependencies: hash-base "^3.0.0" inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^4.0.0: version "4.3.0" @@ -5122,10 +4371,9 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memory-fs@^0.4.1: +memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -5138,32 +4386,50 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5182,122 +4448,116 @@ micromatch@^3.1.10, micromatch@^3.1.4: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.43.0: version "1.43.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +"mime-db@>= 1.34.0 < 2", mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + dependencies: + mime-db "~1.35.0" + +mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: mime-db "1.43.0" +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.3.1, mime@^2.4.4: +mime@^2.3.1: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mimic-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" - integrity sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw== +mini-css-extract-plugin@0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" + integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg== dependencies: loader-utils "^1.1.0" - normalize-url "1.9.1" schema-utils "^1.0.0" webpack-sources "^1.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: +minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== - dependencies: - minipass "^3.0.0" -minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" dependencies: - yallist "^4.0.0" + minipass "^2.2.1" -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" dependencies: - minipass "^2.9.0" + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" mississippi@^3.0.0: version "3.0.0" @@ -5316,24 +4576,28 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" dependencies: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -5345,37 +4609,33 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.0.0, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: version "6.2.3" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.12.1: +nan@^2.10.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nan@^2.12.1, nan@^2.13.2: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -5383,7 +4643,6 @@ nan@^2.12.1: nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5397,39 +4656,91 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +needle@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +ng-packagr@^4.4.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-4.7.1.tgz#a3e8fd2a7b70573a3a7759c4c57408a3b0e8ce11" + integrity sha512-MIPKxyrnV22fS3wSfst2XjwWOonFKujVVEnIehYJhiu8GOg37bCdbbr9plsE1jRDmDAUz6M1MvdKibUrJyRp6Q== + dependencies: + "@ngtools/json-schema" "^1.1.0" + autoprefixer "^9.0.0" + browserslist "^4.0.0" + chalk "^2.3.1" + chokidar "^2.0.3" + clean-css "^4.1.11" + commander "^2.12.0" + fs-extra "^7.0.0" + glob "^7.1.2" + injection-js "^2.2.1" + less "^3.8.0" + less-plugin-npm-import "^2.1.0" + node-sass "^4.9.3" + node-sass-tilde-importer "^1.0.0" + opencollective-postinstall "^2.0.1" + postcss "^7.0.0" + postcss-url "^8.0.0" + read-pkg-up "^4.0.0" + rimraf "^2.6.1" + rollup "^0.67.0" + rollup-plugin-commonjs "^9.1.3" + rollup-plugin-json "^3.1.0" + rollup-plugin-node-resolve "^4.0.0" + rollup-plugin-sourcemaps "^0.4.2" + rxjs "^6.0.0" + stylus "^0.54.5" + uglify-js "^3.0.7" + update-notifier "^2.3.0" nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch-npm@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" - integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== - dependencies: - encoding "^0.1.11" - json-parse-better-errors "^1.0.0" - safe-buffer "^5.1.1" +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -5438,10 +4749,10 @@ node-libs-browser@^2.2.1: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^3.0.0" + events "^1.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.1" + path-browserify "0.0.0" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -5452,308 +4763,313 @@ node-libs-browser@^2.2.1: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" + util "^0.10.3" + vm-browserify "0.0.4" -node-releases@^1.1.44, node-releases@^1.1.47: - version "1.1.49" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.49.tgz#67ba5a3fac2319262675ef864ed56798bb33b93e" - integrity sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg== +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" dependencies: - semver "^6.3.0" + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" -normalize-package-data@^2.0.0, normalize-package-data@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== +node-releases@^1.1.50: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" + semver "^6.3.0" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= +node-sass-tilde-importer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz#1a15105c153f648323b4347693fdb0f331bad1ce" dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + find-parent-dir "^0.3.0" -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= +node-sass@4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" + integrity sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww== dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "2.87.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-sass@^4.13.1, node-sass@^4.9.3: + version "4.13.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" + integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +"nopt@2 || 3", nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: - npm-normalize-package-bin "^1.0.1" + abbrev "1" + osenv "^0.1.4" -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" -npm-package-arg@6.1.1, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" - integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: - hosted-git-info "^2.7.1" - osenv "^0.1.5" - semver "^5.6.0" - validate-npm-package-name "^3.0.0" + remove-trailing-separator "^1.0.1" -npm-package-arg@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" - integrity sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" dependencies: - hosted-git-info "^3.0.2" + hosted-git-info "^2.6.0" osenv "^0.1.5" - semver "^5.6.0" + semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== +npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npm-pick-manifest@3.0.2, npm-pick-manifest@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" - integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== - dependencies: - figgy-pudding "^3.5.1" - npm-package-arg "^6.0.0" - semver "^5.4.1" -npm-registry-fetch@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz#2b1434f93ccbe6b6385f8e45f45db93e16921d7a" - integrity sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A== +npm-registry-client@8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" + integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== dependencies: - JSONStream "^1.3.4" - bluebird "^3.5.1" - figgy-pudding "^3.4.1" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - npm-package-arg "^6.1.0" - safe-buffer "^5.2.0" + 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" + 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" + optionalDependencies: + npmlog "2 || ^3.1.0 || ^4.0.0" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: - boolbase "~1.0.0" + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + for-own "^0.1.4" + is-extendable "^0.1.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" -object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -obuf@^1.0.0, obuf@^1.1.2: +obuf@^1.0.0, obuf@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: - mimic-fn "^2.1.0" + mimic-fn "^1.0.0" -open@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.0.tgz#7e52999b14eb73f90f0f0807fe93897c4ae73ec9" - integrity sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ== - dependencies: - is-wsl "^2.1.0" +opencollective-postinstall@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opn@5.3.0, opn@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== dependencies: is-wsl "^1.1.0" optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" -ora@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.2.tgz#0e1e68fd45b135d28648b27cf08081fa6e8a297d" - integrity sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig== +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-spinners "^2.2.0" - is-interactive "^1.0.0" - log-symbols "^3.0.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +original@>=0.0.5: + version "1.0.1" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190" dependencies: - url-parse "^1.4.3" + url-parse "~1.4.0" os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" @@ -5767,12 +5083,10 @@ os-locale@^3.0.0, os-locale@^3.1.0: os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.5: +osenv@0, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5785,20 +5099,31 @@ p-defer@^1.0.0: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.2.2: +p-limit@^1.0.0, p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -5806,102 +5131,68 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@9.5.8: - version "9.5.8" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.8.tgz#23480efdc4fa74515855c9ecf39cf64078f99786" - integrity sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw== +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" dependencies: - bluebird "^3.5.3" - cacache "^12.0.2" - chownr "^1.1.2" - figgy-pudding "^3.5.1" - get-stream "^4.1.0" - glob "^7.1.3" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - minimatch "^3.0.4" - minipass "^2.3.5" - mississippi "^3.0.0" - mkdirp "^0.5.1" - normalize-package-data "^2.4.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.1.12" - npm-pick-manifest "^3.0.0" - npm-registry-fetch "^4.0.0" - osenv "^0.1.5" - promise-inflight "^1.0.1" - promise-retry "^1.1.1" - protoduck "^5.0.1" - rimraf "^2.6.2" - safe-buffer "^5.1.2" - semver "^5.6.0" - ssri "^6.0.1" - tar "^4.4.10" - unique-filename "^1.1.1" - which "^1.3.1" + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" pako@~1.0.2, pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" dependencies: - cyclist "^1.0.1" + cyclist "~0.2.2" inherits "^2.0.3" readable-stream "^2.1.5" parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -5912,25 +5203,26 @@ parse5@4.0.0: integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -5938,42 +5230,40 @@ parseurl@~1.3.2, parseurl@~1.3.3: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" path-parse@^1.0.6: version "1.0.6" @@ -5983,19 +5273,24 @@ path-parse@^1.0.6: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -6006,22 +5301,14 @@ pbkdf2@^3.0.3: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pify@^4.0.1: version "4.0.1" @@ -6031,14 +5318,18 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" pkg-dir@^3.0.0: version "3.0.0" @@ -6047,88 +5338,31 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +portfinder@1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ== dependencies: - find-up "^4.0.0" + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.1" + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== - dependencies: - css-unit-converter "^1.1.1" - postcss "^7.0.5" - postcss-selector-parser "^5.0.0-rc.4" - postcss-value-parser "^3.3.1" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-import@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== +postcss-import@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.0.tgz#149f96a4ef0b27525c419784be8517ebd17e92c5" + integrity sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ== dependencies: postcss "^7.0.1" postcss-value-parser "^3.2.3" @@ -6136,11 +5370,10 @@ postcss-import@12.0.1: resolve "^1.1.7" postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" dependencies: - cosmiconfig "^5.0.0" + cosmiconfig "^4.0.0" import-cwd "^2.0.0" postcss-loader@3.0.0: @@ -6153,291 +5386,86 @@ postcss-loader@3.0.0: postcss-load-config "^2.0.0" schema-utils "^1.0.0" -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-selector-parser@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca" + integrity sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" + mime "^2.3.1" + minimatch "^3.0.4" + mkdirp "^0.5.0" + postcss "^7.0.2" + xxhashjs "^0.2.1" -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" postcss-value-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" - integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== -postcss@7.0.21: - version "7.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" - integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== +postcss@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" + integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== dependencies: - chalk "^2.4.2" + chalk "^2.4.1" source-map "^0.6.1" - supports-color "^6.1.0" + supports-color "^5.5.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.21, postcss@^7.0.5: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2, postcss@^7.0.26: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" -prepend-http@^1.0.0: +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -protoduck@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" - integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== +promise@~7.0.1: + version "7.0.4" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.0.4.tgz#363e84a4c36c8356b890fed62c91ce85d02ed539" + integrity sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk= dependencies: - genfun "^5.0.0" + asap "~2.0.3" -protractor@~5.4.3: +protractor@~5.4.1: version "5.4.3" resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.3.tgz#35f050741e404a45868618ea648745d89af31683" integrity sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA== @@ -6458,23 +5486,28 @@ protractor@~5.4.3: webdriver-js-extender "2.1.0" webdriver-manager "^12.0.6" +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + proxy-addr@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== dependencies: forwarded "~0.1.2" - ipaddr.js "1.9.0" + ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: version "1.7.0" @@ -6482,21 +5515,18 @@ psl@^1.1.28: integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" - safe-buffer "^5.1.2" -pump@^2.0.0: +pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -6512,7 +5542,6 @@ pump@^3.0.0: pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" inherits "^2.0.3" @@ -6521,86 +5550,100 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= -q@^1.1.2, q@^1.4.1: +q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qjobs@^1.1.4: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@~6.5.2: +qs@6.5.2, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.2.0, range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -6611,43 +5654,70 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f" - integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA== +raw-loader@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: - loader-utils "^1.1.0" - schema-utils "^2.0.1" + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= dependencies: pify "^2.3.0" -read-package-json@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" dependencies: - glob "^7.1.1" - json-parse-better-errors "^1.0.1" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" + find-up "^1.0.0" + read-pkg "^1.0.0" -read-package-tree@5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" - integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" dependencies: - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - util-promisify "^2.1.0" + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.3.0: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -6660,24 +5730,25 @@ read-package-tree@5.3.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" - integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== +readable-stream@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" graceful-fs "^4.1.2" - once "^1.3.0" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" readdirp@^2.2.1: version "2.2.1" @@ -6688,119 +5759,124 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" dependencies: - picomatch "^2.0.7" + indent-string "^2.1.0" + strip-indent "^1.0.1" reflect-metadata@^0.1.2: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" + version "0.1.12" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" -regenerate@^1.2.1, regenerate@^1.4.0: +regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: - private "^0.1.6" + is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96" - integrity sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q== dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.6.1: +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request@^2.83.0, request@^2.87.0, request@^2.88.0: +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.87.0, request@^2.74.0, request@^2.83.0, request@^2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + 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" + +request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -6829,12 +5905,14 @@ request@^2.83.0, request@^2.87.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= require-main-filename@^2.0.0: version "2.0.0" @@ -6844,78 +5922,72 @@ require-main-filename@^2.0.0: requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: +resolve@1.1.x, resolve@~1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.5.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +resolve@^1.10.0: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: - onetime "^5.1.0" + onetime "^2.0.0" signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rfdc@^1.1.4: +rfdc@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" -rimraf@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" - integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: - glob "^7.1.3" + glob "^7.0.5" -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6925,99 +5997,163 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.2, rimra ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" -rollup@1.25.2: - version "1.25.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.25.2.tgz#739f508bd8f7ece52bb6c1fcda83466af82b7f6d" - integrity sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg== +rollup-plugin-commonjs@^9.1.3: + version "9.1.4" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.4.tgz#525b701adfd40e314b5bb6888d88edc28e10442f" + dependencies: + estree-walker "^0.5.1" + magic-string "^0.22.4" + resolve "^1.5.0" + rollup-pluginutils "^2.0.1" + +rollup-plugin-json@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz#7c1daf60c46bc21021ea016bd00863561a03321b" + integrity sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw== + dependencies: + rollup-pluginutils "^2.3.1" + +rollup-plugin-node-resolve@^4.0.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz#7d370f8d6fd3031006a0032c38262dd9be3c6250" + integrity sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.10.0" + +rollup-plugin-sourcemaps@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz#62125aa94087aadf7b83ef4dfaf629b473135e87" dependencies: - "@types/estree" "*" + rollup-pluginutils "^2.0.1" + source-map-resolve "^0.5.0" + +rollup-pluginutils@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4" + dependencies: + estree-walker "^0.5.2" + micromatch "^2.3.11" + +rollup-pluginutils@^2.3.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^0.67.0: + version "0.67.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.67.4.tgz#8ed6b0993337f84ec8a0387f824fa6c197e833ec" + integrity sha512-AVuP73mkb4BBMUmksQ3Jw0jTrBTU1i7rLiUYjFxLZGb3xiFmtVEg40oByphkZAsiL0bJC3hRAJUQos/e5EBd+w== + dependencies: + "@types/estree" "0.0.39" "@types/node" "*" - acorn "^7.1.0" run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== dependencies: is-promise "^2.1.0" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" -rxjs@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== +rxjs@6.3.3: + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== + dependencies: + tslib "^1.9.0" + +rxjs@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" dependencies: tslib "^1.9.0" -rxjs@^6.4.0, rxjs@~6.5.4: +rxjs@^6.1.0: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.0.tgz#e7b07a3e357f965e6b03dd45b016b0a9746af797" - integrity sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w== +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.1.0" - semver "^6.3.0" + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" -sass@1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.23.3.tgz#f07503b9e8d2bcf06ef69e8beea5d085589b1620" - integrity sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog== +sass-loader@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== dependencies: - chokidar ">=2.0.0 <4.0.0" + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" saucelabs@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" - integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== dependencies: https-proxy-agent "^2.2.1" -sax@>=0.6.0, sax@~1.2.4: +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" schema-utils@^1.0.0: version "1.0.0" @@ -7028,40 +6164,41 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.1.0, schema-utils@^2.6.1, schema-utils@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" - integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" dependencies: - ajv "^6.10.2" - ajv-keywords "^3.4.1" + js-base64 "^2.1.8" + source-map "^0.4.2" select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" - integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== dependencies: jszip "^3.1.3" rimraf "^2.5.4" tmp "0.0.30" xml2js "^0.4.17" -selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== +selfsigned@^1.9.1: + version "1.10.3" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" + dependencies: + node-forge "0.7.5" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" dependencies: - node-forge "0.9.0" + semver "^5.0.3" semver-dsl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" - integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= dependencies: semver "^5.3.0" @@ -7072,20 +6209,46 @@ semver-intersect@1.4.0: dependencies: semver "^5.0.0" -"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== + +semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, semver@^6.0.0, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" send@0.17.1: version "0.17.1" @@ -7106,15 +6269,13 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" -serve-index@^1.9.1: +serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -7124,6 +6285,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -7134,20 +6304,26 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@~1.0.1: +set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7157,12 +6333,14 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.1.1: version "1.1.1" @@ -7172,56 +6350,52 @@ setprototypeof@1.1.1: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" dependencies: - kind-of "^6.0.2" + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shelljs@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== +slide@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -7230,14 +6404,12 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -7294,53 +6466,31 @@ socket.io@2.1.1: socket.io-client "2.1.1" socket.io-parser "~3.2.0" -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" json3 "^3.3.2" - url-parse "^1.4.3" + url-parse "^1.1.8" sockjs@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== dependencies: faye-websocket "^0.10.0" uuid "^3.0.1" -socks-proxy-agent@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" source-map-loader@0.2.4: version "0.2.4" @@ -7350,18 +6500,32 @@ source-map-loader@0.2.4: async "^2.5.0" loader-utils "^1.1.0" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" dependencies: - atob "^2.1.2" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.16, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.6, source-map-support@~0.5.10: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -7372,29 +6536,48 @@ source-map-support@0.5.16, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.4.0: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.1.x: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" source-map@0.7.3, source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" sourcemap-codec@^1.4.4: version "1.4.8" @@ -7402,55 +6585,51 @@ sourcemap-codec@^1.4.4: integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" dependencies: - debug "^4.1.0" - detect-node "^2.0.4" + debug "^2.6.8" + detect-node "^2.0.3" hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" -spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" + debug "^2.6.8" + handle-thing "^1.2.5" http-deceiver "^1.2.7" + safe-buffer "^5.0.1" select-hose "^2.0.0" - spdy-transport "^3.0.0" + spdy-transport "^2.0.18" -speed-measure-webpack-plugin@1.3.1: +speed-measure-webpack-plugin@^1.2.3: version "1.3.1" resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz#69840a5cdc08b4638697dac7db037f595d7f36a0" integrity sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ== @@ -7460,11 +6639,10 @@ speed-measure-webpack-plugin@1.3.1: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" -sprintf-js@^1.1.2: +sprintf-js@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== @@ -7472,60 +6650,70 @@ sprintf-js@^1.1.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" dashdash "^1.12.0" - ecc-jsbn "~0.1.1" getpass "^0.1.1" - jsbn "~0.1.0" safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" tweetnacl "~0.14.0" -ssri@^6.0.0, ssri@^6.0.1: +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: figgy-pudding "^3.5.1" -ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +stats-webpack-plugin@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06" + integrity sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ== + dependencies: + lodash "^4.17.4" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -7533,7 +6721,6 @@ stream-browserify@^2.0.1: stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -7541,7 +6728,6 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -7550,39 +6736,30 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" -streamroller@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" - integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== +streamroller@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" + integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== dependencies: - async "^2.6.2" - date-format "^2.0.0" - debug "^3.2.6" - fs-extra "^7.0.1" - lodash "^4.17.14" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + date-format "^1.2.0" + debug "^3.1.0" + mkdirp "^0.5.1" + readable-stream "^2.3.0" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -7596,99 +6773,66 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: +string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: - ansi-regex "^5.0.0" + is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -style-loader@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.0.tgz#1d5296f9165e8e2c85d24eee0b7caf9ec8ca1f82" - integrity sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw== +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" dependencies: - loader-utils "^1.2.3" - schema-utils "^2.0.1" + get-stdin "^4.0.1" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1" + integrity sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + loader-utils "^1.1.0" + schema-utils "^0.4.5" stylus-loader@3.0.2: version "3.0.2" @@ -7699,26 +6843,35 @@ stylus-loader@3.0.2: lodash.clonedeep "^4.5.0" when "~3.6.x" -stylus@0.54.7: - version "0.54.7" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2" - integrity sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug== +stylus@0.54.5, stylus@^0.54.5: + version "0.54.5" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" + integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk= dependencies: - css-parse "~2.0.0" - debug "~3.1.0" - glob "^7.1.3" - mkdirp "~0.5.x" - safer-buffer "^2.1.2" - sax "~1.2.4" - semver "^6.0.0" - source-map "^0.7.3" + css-parse "1.7.x" + debug "*" + glob "7.0.x" + mkdirp "0.5.x" + sax "0.5.x" + source-map "0.1.x" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0: +supports-color@^3.1.0, supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.1.0, supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -7732,137 +6885,98 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - symbol-observable@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -tapable@^1.0.0, tapable@^1.1.3: +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tapable@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.10: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== +tar@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: - chownr "^1.1.1" + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" + minipass "^2.3.3" + minizlib "^1.1.0" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.3" + yallist "^3.0.2" -terser-webpack-plugin@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.3.tgz#b89043168bd414153bab86f4362ac23d537b78b0" - integrity sha512-gWHkaGzGYjmDoYxksFZynWTzvXOAjQ5dd7xuTMYlv4zpWlLSb6v0QLSZjELzP5dMs1ox30O1BIPs9dgqlMHuLQ== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.4.3" - webpack-sources "^1.4.3" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" -terser-webpack-plugin@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== +terser-webpack-plugin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" + integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" + cacache "^11.0.2" + find-cache-dir "^2.0.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^1.4.0" source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.5.1.tgz#63b52d6b6ce344aa6fedcd0ee06a695799eb50bd" - integrity sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" -terser@^4.1.2, terser@^4.4.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" - integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== +terser@^3.8.1: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== dependencies: - commander "^2.20.0" + commander "^2.19.0" source-map "~0.6.1" - source-map-support "~0.5.12" + source-map-support "~0.5.10" through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: - readable-stream "~2.3.6" + readable-stream "^2.1.5" xtend "~4.0.1" -"through@>=2.2.7 <3", through@X.X.X, through@^2.3.6: +through@X.X.X, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" dependencies: setimmediate "^1.0.4" -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" - integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= dependencies: os-tmpdir "~1.0.1" @@ -7876,44 +6990,31 @@ tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -7925,6 +7026,12 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -7933,47 +7040,81 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tree-kill@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +tree-kill@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"true-case-path@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + dependencies: + glob "^6.0.4" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-node@~8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" - integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== +ts-node@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: - arg "^4.1.0" - diff "^4.0.1" + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" source-map-support "^0.5.6" - yn "^3.0.0" + yn "^2.0.0" -tslib@1.10.0, tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tsickle@^0.33.0: + version "0.33.1" + resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.33.1.tgz#eee4ebabeda3bcd8afc32cee34c822cbe3e839ec" + integrity sha512-SpW2G3PvDGs4a5sMXPlWnCWHWRviWjSlI3U0734e3fU3U39VAE0NPr8M3W1cuL/OU/YXheYipGeEwtIJ5k0NHQ== + dependencies: + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map "^0.7.3" -tslint@~5.18.0: - version "5.18.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6" - integrity sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w== +tslib@^1.10.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tslint@~5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= dependencies: - "@babel/code-frame" "^7.0.0" + babel-code-frame "^6.22.0" builtin-modules "^1.1.1" chalk "^2.3.0" commander "^2.12.1" diff "^3.2.0" glob "^7.1.1" - js-yaml "^3.13.1" + js-yaml "^3.7.0" minimatch "^3.0.4" - mkdirp "^0.5.1" resolve "^1.3.2" semver "^5.3.0" tslib "^1.8.0" - tsutils "^2.29.0" + tsutils "^2.27.2" -tsutils@^2.29.0: +tsutils@^2.27.2: version "2.29.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== @@ -7983,24 +7124,29 @@ tsutils@^2.29.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -8013,65 +7159,71 @@ type-is@~1.6.17, type-is@~1.6.18: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" - integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== -typescript@~3.7.5: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== +typescript@3.1.6, typescript@~3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" + integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +uglify-js@^3.0.7: + version "3.4.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.6.tgz#bc546d53f3e02b05d97d0ca5a7abfe0fb0384ddb" dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + commander "~2.16.0" + source-map "~0.6.1" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^2.0.1" + set-value "^0.4.3" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" unique-filename@^1.1.1: version "1.1.1" @@ -8081,73 +7233,90 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" dependencies: imurmurhash "^0.1.4" -universal-analytics@^0.4.20: - version "0.4.20" - resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.20.tgz#d6b64e5312bf74f7c368e3024a922135dbf24b03" - integrity sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw== +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" dependencies: - debug "^3.0.0" - request "^2.88.0" - uuid "^3.0.0" + crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -uri-js@^4.2.2: +update-notifier@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-join@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-parse@^1.1.8, url-parse@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" dependencies: - querystringify "^2.1.1" + querystringify "^2.0.0" requires-port "^1.0.0" url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -8155,7 +7324,6 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== useragent@2.3.0: version "2.3.0" @@ -8165,56 +7333,38 @@ useragent@2.3.0: lru-cache "4.1.x" tmp "0.0.x" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util-promisify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= - dependencies: - object.getownpropertydescriptors "^2.0.3" - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" dependencies: inherits "2.0.3" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -8222,62 +7372,49 @@ validate-npm-package-license@^3.0.1: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= -watchpack@^1.6.0: +watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" -wbuf@^1.1.0, wbuf@^1.7.3: +wbuf@^1.1.0, wbuf@^1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - webdriver-js-extender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" @@ -8287,9 +7424,8 @@ webdriver-js-extender@2.1.0: selenium-webdriver "^3.0.1" webdriver-manager@^12.0.6: - version "12.1.7" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.7.tgz#ed4eaee8f906b33c146e869b55e850553a1b1162" - integrity sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA== + version "12.1.0" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.0.tgz#f6601e52de5f0c97fc7024c889eeb2416f2f1d9d" dependencies: adm-zip "^0.4.9" chalk "^1.1.1" @@ -8303,55 +7439,90 @@ webdriver-manager@^12.0.6: semver "^5.3.0" xml2js "^0.4.17" -webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== +webpack-bundle-analyzer@^3.0.3: + version "3.6.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b" + integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw== dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" mkdirp "^0.5.1" - range-parser "^1.2.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-core@^0.6.8: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-dev-middleware@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz#a20ceef194873710052da678f3c6ee0aeed92552" + integrity sha512-YJLMF/96TpKXaEQwaLEo+Z4NDK8aV133ROF6xp9pe3gQoS7sxfpXh4Rv9eC+8vCvWfmDjRQaMSlRPbO+9G6jgA== + dependencies: + loud-rejection "^1.6.0" + memory-fs "~0.4.1" + mime "^2.3.1" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + url-join "^4.0.0" webpack-log "^2.0.0" -webpack-dev-server@3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz#27c3b5d0f6b6677c4304465ac817623c8b27b89c" - integrity sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw== +webpack-dev-middleware@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.3.0.tgz#8104daf4d4f65defe06ee2eaaeea612a7c541462" + integrity sha512-5C5gXtOo1I6+0AEg4UPglYEtu3Rai6l5IiO6aUu65scHXz29dc3oIWMiRwvcNLXgL0HwRkRxa9N02ZjFt4hY8w== + dependencies: + loud-rejection "^1.6.0" + memory-fs "~0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + url-join "^4.0.0" + webpack-log "^2.0.0" + +webpack-dev-server@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz#eb7a95945d1108170f902604fb3b939533d9daeb" + integrity sha512-c+tcJtDqnPdxCAzEEZKdIPmg3i5i7cAHe+B+0xFNK0BlCc2HF/unYccbU7xTgfGc5xxhCztCQzFmsqim+KhI+A== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.2.1" - http-proxy-middleware "0.19.1" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" import-local "^2.0.0" - internal-ip "^4.3.0" + internal-ip "^3.0.1" ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.4" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.25" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" - serve-index "^1.9.1" + selfsigned "^1.9.1" + serve-index "^1.7.2" sockjs "0.3.19" - sockjs-client "1.4.0" - spdy "^4.0.1" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.2.0" webpack-log "^2.0.0" - ws "^6.2.1" - yargs "12.0.5" + yargs "12.0.2" webpack-log@^2.0.0: version "2.0.0" @@ -8361,14 +7532,29 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== +webpack-merge@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== dependencies: - lodash "^4.17.15" + lodash "^4.17.5" + +webpack-sources@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" + integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" -webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.2.0: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -8376,96 +7562,109 @@ webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-s source-list-map "^2.0.0" source-map "~0.6.1" -webpack-subresource-integrity@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.4.tgz#4554e0c622d6787f880eba009cdb73139c107bad" - integrity sha512-6XbGYzjh30cGQT/NsC+9IAkJP8IL7/t47sbwR5DLSsamiD56Rwv4/+hsgEHsviPvrEFZ0JRAQtCRN3UsR2Pw9g== - dependencies: - webpack-sources "^1.3.0" - -webpack@4.41.2: - version "4.41.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" - integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" +webpack-subresource-integrity@1.1.0-rc.6: + version "1.1.0-rc.6" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886" + integrity sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w== + dependencies: + webpack-core "^0.6.8" + +webpack@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.1.tgz#096674bc3b573f8756c762754366e5b333d6576f" + integrity sha512-j7Q/5QqZRqIFXJvC0E59ipLV5Hf6lAnS3ezC3I4HMUybwEDikQBVad5d+IpPtmaQPQArvgUZLXIN6lWijHBn4g== + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/wasm-edit" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" + eslint-scope "^4.0.0" json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.1" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" - watchpack "^1.6.0" - webpack-sources "^1.4.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" + schema-utils "^0.4.4" + tapable "^1.1.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.2.0" websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" dependencies: - http-parser-js ">=0.4.0 <0.4.11" - safe-buffer ">=5.1.0" + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" - integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.1, which@^1.2.9, which@^1.3.1: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: errno "~0.1.7" -worker-plugin@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/worker-plugin/-/worker-plugin-3.2.0.tgz#ddae9f161b76fcbaacf8f54ecd037844584e43e7" - integrity sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q== - dependencies: - loader-utils "^1.1.0" - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -8473,9 +7672,16 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^6.2.1: +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^6.0.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== @@ -8491,56 +7697,63 @@ ws@~3.3.1: safe-buffer "~5.1.0" ultron "~1.1.0" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" dependencies: sax ">=0.6.0" - xmlbuilder "~11.0.0" + xmlbuilder "~9.0.1" -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xxhashjs@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + dependencies: + cuint "^0.2.2" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" + camelcase "^4.1.0" yargs-parser@^13.0.0: version "13.1.1" @@ -8550,13 +7763,19 @@ yargs-parser@^13.0.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" - decamelize "^1.2.0" + decamelize "^2.0.0" find-up "^3.0.0" get-caller-file "^1.0.1" os-locale "^3.0.0" @@ -8566,7 +7785,7 @@ yargs@12.0.5: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" + yargs-parser "^10.1.0" yargs@13.1.0: version "13.1.0" @@ -8585,17 +7804,41 @@ yargs@13.1.0: y18n "^4.0.0" yargs-parser "^13.0.0" +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + 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" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -yn@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" -zone.js@~0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.2.tgz#67ca084b3116fc33fc40435e0d5ea40a207e392e" - integrity sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg== +zone.js@^0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d"