From 30c5f8ca0c0fae7856632f0aecdf4ca34f330abc Mon Sep 17 00:00:00 2001 From: Akhmadullin Roman Date: Fri, 7 Feb 2020 07:28:17 +0000 Subject: [PATCH 01/16] Change links to some global vstutils variables on links to app.api[method](). polemarch/ce#243 polemarch/ee#61 --- doc/api_schema.yaml | 9 +- polemarch/__init__.py | 2 +- polemarch/main/tests/_base.py | 2 +- polemarch/main/tests/api.py | 8 +- polemarch/main/tests/executions.py | 181 +++++++++++++------------ polemarch/main/tests/hosts.py | 14 +- polemarch/main/tests/openapi.py | 1 + polemarch/static/css/polemarch-gui.css | 13 -- polemarch/static/js/common.js | 34 ++--- polemarch/static/js/pmDashboard.js | 16 +-- polemarch/static/js/pmFields.js | 2 +- polemarch/static/js/pmHistory.js | 2 +- polemarch/static/js/pmUsers.js | 2 +- polemarch/static/js/tests/pmFields.js | 4 +- requirements-doc.txt | 2 +- requirements.txt | 2 +- 16 files changed, 145 insertions(+), 149 deletions(-) diff --git a/doc/api_schema.yaml b/doc/api_schema.yaml index 4df54f38..05496667 100755 --- a/doc/api_schema.yaml +++ b/doc/api_schema.yaml @@ -53,13 +53,18 @@ info: - name: Hooks span_class: fa fa-plug url: /hook + x-settings: + static_path: /static/ + enable_gravatar: true + time_zone: UTC x-versions: application: 1.6.2 library: 1.6.2 - vstutils: 2.15.1 - django: 2.2.7 + vstutils: 3.0.0b1 + django: 2.2.2 ansible: 2.9.2 version: v2 + x-user-id: 1 host: localhost:8080 schemes: - http diff --git a/polemarch/__init__.py b/polemarch/__init__.py index 2030adcf..92e4af6b 100644 --- a/polemarch/__init__.py +++ b/polemarch/__init__.py @@ -31,6 +31,6 @@ "VST_ROOT_URLCONF": os.getenv("VST_ROOT_URLCONF", 'vstutils.urls'), } -__version__ = "1.6.2" +__version__ = "1.7.0" prepare_environment(**default_settings) diff --git a/polemarch/main/tests/_base.py b/polemarch/main/tests/_base.py index 790fbd28..d00a54b4 100644 --- a/polemarch/main/tests/_base.py +++ b/polemarch/main/tests/_base.py @@ -58,7 +58,7 @@ def get_mod_bulk(self, item, pk, data, mtype="variables", *args, **kwargs): ) def _get_bulk_mod(self, item, index, data, mtype='variables'): - return self.get_mod_bulk(item, "<{}[data][id]>".format(index), data, mtype) + return self.get_mod_bulk(item, "<<{}[data][id]>>".format(index), data, mtype) def mass_create_bulk(self, item, data): bulk_data = list() diff --git a/polemarch/main/tests/api.py b/polemarch/main/tests/api.py index 52e9b201..fd79909b 100644 --- a/polemarch/main/tests/api.py +++ b/polemarch/main/tests/api.py @@ -296,10 +296,10 @@ def test_api_teams(self): self.get_bulk('team', dict(name='test_team'), 'add'), self.get_bulk('user', dict(username='test_user', **test_user_data), 'add'), self.get_mod_bulk( - 'team', '<0[data][id]>', dict(username='te', **test_user_data), 'user' + 'team', '<<0[data][id]>>', dict(username='te', **test_user_data), 'user' ), self.get_mod_bulk( - 'team', '<0[data][id]>', dict(id='<1[data][id]>'), 'user' + 'team', '<<0[data][id]>>', dict(id='<<1[data][id]>>'), 'user' ), ] results = self.make_bulk(bulk_data) @@ -316,9 +316,9 @@ def test_api_teams(self): # Test copy bulk_data = [ self.get_mod_bulk('user', results[1]['data']['id'], {}, 'copy'), - self.get_bulk('user', {}, 'get', pk='<0[data][id]>'), + self.get_bulk('user', {}, 'get', pk='<<0[data][id]>>'), self.get_mod_bulk( - 'team', results[0]['data']['id'], {}, 'user/<0[data][id]>', method='get' + 'team', results[0]['data']['id'], {}, 'user/<<0[data][id]>>', method='get' ), self.get_mod_bulk('team', results[0]['data']['id'], {"name": "new"}, 'copy'), self.get_mod_bulk( diff --git a/polemarch/main/tests/executions.py b/polemarch/main/tests/executions.py index ae50ff52..6f45736c 100644 --- a/polemarch/main/tests/executions.py +++ b/polemarch/main/tests/executions.py @@ -246,7 +246,7 @@ def get_templates_data(self, bulk_data, pk, inventory='localhost,'): self.get_mod_bulk('project', pk, template_playbook, 'template'), ] + self.get_periodic_task_data( - pk, '<{}[data][id]>'.format(template_module_index) + pk, '<<{}[data][id]>>'.format(template_module_index) ) ) @@ -277,91 +277,91 @@ def get_complex_data(self, with_subs=False): ] # Set vars bulk_data += [ - self.get_mod_bulk('host', "<3[data][id]>", dict(key=k, value=v)) + self.get_mod_bulk('host', "<<3[data][id]>>", dict(key=k, value=v)) for k, v in hostlocl_v.items() ] bulk_data += [ - self.get_mod_bulk('group', "<6[data][id]>", dict(key=k, value=v)) + self.get_mod_bulk('group', "<<6[data][id]>>", dict(key=k, value=v)) for k, v in groups1_v.items() ] bulk_data += [ - self.get_mod_bulk('inventory', "<9[data][id]>", dict(key=k, value=v)) + self.get_mod_bulk('inventory', "<<9[data][id]>>", dict(key=k, value=v)) for k, v in complex_inventory_v.items() ] # Add children bulk_data += [ # to hosts1 self.get_mod_bulk( - 'group', "<4[data][id]>", dict(id="<0[data][id]>"), 'host', + 'group', "<<4[data][id]>>", dict(id="<<0[data][id]>>"), 'host', ), self.get_mod_bulk( - 'group', "<4[data][id]>", dict(id="<3[data][id]>"), 'host', + 'group', "<<4[data][id]>>", dict(id="<<3[data][id]>>"), 'host', ), # to hosts2 self.get_mod_bulk( - 'group', "<5[data][id]>", dict(id="<1[data][id]>"), 'host', + 'group', "<<5[data][id]>>", dict(id="<<1[data][id]>>"), 'host', ), self.get_mod_bulk( - 'group', "<5[data][id]>", dict(id="<2[data][id]>"), 'host', + 'group', "<<5[data][id]>>", dict(id="<<2[data][id]>>"), 'host', ), # to groups1 self.get_mod_bulk( - 'group', "<6[data][id]>", dict(id="<7[data][id]>"), 'group', + 'group', "<<6[data][id]>>", dict(id="<<7[data][id]>>"), 'group', ), self.get_mod_bulk( - 'group', "<6[data][id]>", dict(id="<8[data][id]>"), 'group', + 'group', "<<6[data][id]>>", dict(id="<<8[data][id]>>"), 'group', ), # to groups2 self.get_mod_bulk( - 'group', "<7[data][id]>", dict(id="<8[data][id]>"), 'group', + 'group', "<<7[data][id]>>", dict(id="<<8[data][id]>>"), 'group', ), # to groups3 self.get_mod_bulk( - 'group', "<8[data][id]>", dict(id="<4[data][id]>"), 'group', + 'group', "<<8[data][id]>>", dict(id="<<4[data][id]>>"), 'group', ), self.get_mod_bulk( - 'group', "<8[data][id]>", dict(id="<5[data][id]>"), 'group', + 'group', "<<8[data][id]>>", dict(id="<<5[data][id]>>"), 'group', ), # to inventory self.get_mod_bulk( - 'inventory', "<9[data][id]>", dict(id="<6[data][id]>"), 'group', + 'inventory', "<<9[data][id]>>", dict(id="<<6[data][id]>>"), 'group', ), self.get_mod_bulk( - 'inventory', "<9[data][id]>", dict(id="<0[data][id]>"), 'host', + 'inventory', "<<9[data][id]>>", dict(id="<<0[data][id]>>"), 'host', ), self.get_mod_bulk( - 'inventory', "<9[data][id]>", dict(id="<1[data][id]>"), 'host', + 'inventory', "<<9[data][id]>>", dict(id="<<1[data][id]>>"), 'host', ), self.get_mod_bulk( - 'inventory', "<9[data][id]>", dict(id="<3[data][id]>"), 'host', + 'inventory', "<<9[data][id]>>", dict(id="<<3[data][id]>>"), 'host', ), # to project self.get_mod_bulk( - 'project', "<10[data][id]>", dict(id="<9[data][id]>"), 'inventory' + 'project', "<<10[data][id]>>", dict(id="<<9[data][id]>>"), 'inventory' ), ] bulk_data = ( - self.get_templates_data(bulk_data, "<10[data][id]>", "<9[data][id]>") + self.get_templates_data(bulk_data, "<<10[data][id]>>", "<<9[data][id]>>") if with_subs else bulk_data ) # Execute actions _exec = dict( - connection="local", inventory="<9[data][id]>", + connection="local", inventory="<<9[data][id]>>", module="ping", group="127.0.1.1", args="", forks=1, verbose=4 ) bulk_data += [ self.get_mod_bulk( - 'project', "<10[data][id]>", {}, 'sync', + 'project', "<<10[data][id]>>", {}, 'sync', ), self.get_mod_bulk( - 'project', "<10[data][id]>", _exec, 'execute_module', + 'project', "<<10[data][id]>>", _exec, 'execute_module', ), self.get_bulk( 'history', {}, 'get', - pk="<{}[data][history_id]>".format(len(bulk_data) + 1) + pk="<<{}[data][history_id]>>".format(len(bulk_data) + 1) ), self.get_mod_bulk( - 'history', "<{}[data][history_id]>".format(len(bulk_data) + 1), {}, + 'history', "<<{}[data][history_id]>>".format(len(bulk_data) + 1), {}, 'raw', 'get', filters='color=yes' ), ] @@ -514,8 +514,8 @@ def _check_copy_project(self, id, **kwargs): obj = self.get_model_filter('Project', pk=id).get() bulk_data = [ self.get_mod_bulk('project', obj.id, {'name': 'copied'}, 'copy'), - self.get_mod_bulk('project', '<0[data][id]>', {}, 'variables', method='GET'), - self.get_bulk('project', {}, 'del', pk='<0[data][id]>'), + self.get_mod_bulk('project', '<<0[data][id]>>', {}, 'variables', method='GET'), + self.get_bulk('project', {}, 'del', pk='<<0[data][id]>>'), ] results = self.make_bulk(bulk_data) self.assertEqual(results[0]['data']['status'], 'NEW') @@ -607,14 +607,14 @@ def project_execute(self, project_data, exec_data=None, type='playbook'): 'project', project_data['id'], exec_data, 'execute_{}'.format(type) ), self.get_mod_bulk( - 'project', project_data['id'], {}, 'history/<0[data][history_id]>', 'get' + 'project', project_data['id'], {}, 'history/<<0[data][history_id]>>', 'get' ), ], 'put') def playbook_tests(self, prj, playbook_count=1, execute=None, inventory="localhost"): _exec = dict( connection="local", limit="docker", - playbook="<1[data][results][0][playbook]>", inventory=inventory, + playbook="<<1[data][results][0][playbook]>>", inventory=inventory, private_key=ssh_key_pattern ) bulk_data = self.project_bulk_sync_and_playbooks(prj['id']) @@ -646,7 +646,7 @@ def module_tests(self, prj): 'project', prj['id'], {}, 'module', 'get', filters='name=ping' ), self.get_mod_bulk( - 'project', prj['id'], {}, 'module/<1[data][results][0][id]>', 'get' + 'project', prj['id'], {}, 'module/<<1[data][results][0][id]>>', 'get' ), ] results = self.make_bulk(bulk_data, 'put') @@ -790,11 +790,11 @@ def make_test_templates(self, project_data): bulk_data = [ self.get_mod_bulk('project', pk, template_module, 'template'), self.get_mod_bulk('project', pk, template_playbook, 'template'), - self.get_mod_bulk('project', pk, {}, 'template/<0[data][id]>/execute'), - self.get_mod_bulk('project', pk, {}, 'template/<1[data][id]>/execute'), - self.get_mod_bulk('project', pk, m_opts, 'template/<0[data][id]>/execute'), - self.get_mod_bulk('project', pk, p_opts, 'template/<1[data][id]>/execute'), - self.get_mod_bulk('project', pk, {}, 'template/<1[data][id]>', 'get'), + self.get_mod_bulk('project', pk, {}, 'template/<<0[data][id]>>/execute'), + self.get_mod_bulk('project', pk, {}, 'template/<<1[data][id]>>/execute'), + self.get_mod_bulk('project', pk, m_opts, 'template/<<0[data][id]>>/execute'), + self.get_mod_bulk('project', pk, p_opts, 'template/<<1[data][id]>>/execute'), + self.get_mod_bulk('project', pk, {}, 'template/<<1[data][id]>>', 'get'), ] results = self.make_bulk(bulk_data) for result in results: @@ -849,7 +849,7 @@ def make_test_templates(self, project_data): bulk_data = [ self.get_mod_bulk('project', pk, data, 'periodic_task'), self.get_mod_bulk( - 'project', pk, new_data, 'periodic_task/<0[data][id]>', 'patch' + 'project', pk, new_data, 'periodic_task/<<0[data][id]>>', 'patch' ), ] results = self.make_bulk(bulk_data) @@ -959,11 +959,11 @@ def make_test_periodic_task(self, project_data): bulk_data += [ self.get_mod_bulk( 'project', project_data['id'], dict(key='connection', value='local'), - 'periodic_task/<0[data][id]>/variables' + 'periodic_task/<<0[data][id]>>/variables' ), self.get_mod_bulk( 'project', project_data['id'], dict(key='forks', value='5'), - 'periodic_task/<0[data][id]>/variables' + 'periodic_task/<<0[data][id]>>/variables' ), ] results = self.make_bulk(bulk_data) @@ -1017,24 +1017,24 @@ def make_test_periodic_task(self, project_data): self.get_mod_bulk('project', project_data['id'], data, 'periodic_task'), self.get_mod_bulk( 'project', project_data['id'], data, - 'periodic_task/<0[data][id]>/execute', + 'periodic_task/<<0[data][id]>>/execute', 'post' ), self.get_mod_bulk( - 'project', project_data['id'], {}, 'history/<1[data][history_id]>', 'get' + 'project', project_data['id'], {}, 'history/<<1[data][history_id]>>', 'get' ), self.get_mod_bulk( 'project', project_data['id'], dict(save_result=False), - 'periodic_task/<0[data][id]>', 'patch' + 'periodic_task/<<0[data][id]>>', 'patch' ), self.get_mod_bulk( 'project', project_data['id'], data, - 'periodic_task/<0[data][id]>/execute', + 'periodic_task/<<0[data][id]>>/execute', 'post' ), self.get_mod_bulk( 'project', project_data['id'], dict(save_result=True), - 'periodic_task/<0[data][id]>', 'patch' + 'periodic_task/<<0[data][id]>>', 'patch' ), ], 'put') self.assertEqual(results[0]['status'], 201) @@ -1090,15 +1090,15 @@ def test_periodic_task_extended(self): dict(data_type=['project', str(proj_id), 'periodic_task'], data=pt_data, method='post'), dict(data_type=['project', str(proj_id), 'periodic_task'], data=pt_data, method='post'), dict( - data_type=['project', str(proj_id), 'periodic_task', '<2[data][id]>'], + data_type=['project', str(proj_id), 'periodic_task', '<<2[data][id]>>'], data=dict(type='INTERVAL', schedule="10"), method='patch'), dict( - data_type=['project', str(proj_id), 'periodic_task', '<2[data][id]>'], + data_type=['project', str(proj_id), 'periodic_task', '<<2[data][id]>>'], data=dict(enabled=False), method='patch' ), - dict(data_type=['project', str(proj_id), 'periodic_task', '<2[data][id]>'], method='delete') + dict(data_type=['project', str(proj_id), 'periodic_task', '<<2[data][id]>>'], method='delete') ]) self.assertEqual(results[0]['status'], 201) self.assertEqual( @@ -1192,7 +1192,7 @@ def get_bulk_readme(): def make_test_restrict_sync(self, project_data): self.get_model_filter('Project', pk=project_data['id']).get().set_status('NEW') data = dict( - connection="local", inventory="<9[data][id]>", + connection="local", inventory="<<9[data][id]>>", module="ping", group="127.0.1.1", args="", forks=1, verbose=4 ) result = self.make_bulk([ @@ -1340,7 +1340,7 @@ def test_project_git(self): project_data = result[0]['data'] results = self.make_bulk([ self.get_bulk('project', {}, 'get', pk=project_data['id']), - self.get_mod_bulk('project', '<0[data][id]>', {}, 'sync'), + self.get_mod_bulk('project', '<<0[data][id]>>', {}, 'sync'), self.get_bulk('project', {}, 'get', pk=project_data['id']), ], 'put') project_data = results[2]['data'] @@ -1461,10 +1461,10 @@ def test_project_required_inventory(self): self.get_complex_bulk('project', name='project_req', repository='MANUAL'), # to project self.get_mod_bulk( - 'project', "<1[data][id]>", dict(id="<0[data][id]>"), 'inventory' + 'project', "<<1[data][id]>>", dict(id="<<0[data][id]>>"), 'inventory' ), ] - bulk_data = self.get_templates_data(bulk_data, "<1[data][id]>", "<0[data][id]>") + bulk_data = self.get_templates_data(bulk_data, "<<1[data][id]>>", "<<0[data][id]>>") subs = self.generate_subs(self.make_bulk(bulk_data)) subs['project'][0] = self.sync_project(subs['project'][0]['id']) prj_id = subs['project'][0]['id'] @@ -1547,36 +1547,36 @@ def test_import_inventory(self): bulk_data = [ dict(data_type=['project'], method='post', data=dict(name='testProj')), self.get_mod_bulk( - 'project', '<0[data][id]>', + 'project', '<<0[data][id]>>', {'name': 'test-inventory', 'raw_data': inventory_data}, ['inventory', 'import_inventory'], ), self.get_mod_bulk( 'inventory', - '<1[data][inventory_id]>', + '<<1[data][inventory_id]>>', {}, 'all_hosts', method='get' ), self.get_mod_bulk( 'inventory', - '<1[data][inventory_id]>', + '<<1[data][inventory_id]>>', {}, 'all_groups', method='get' ), self.get_mod_bulk( 'inventory', - '<1[data][inventory_id]>', + '<<1[data][inventory_id]>>', {}, 'variables', method='get' ), self.get_mod_bulk( 'project', - '<0[data][id]>', + '<<0[data][id]>>', {}, - ['inventory', '<1[data][inventory_id]>'], + ['inventory', '<<1[data][inventory_id]>>'], method='get' ), ] @@ -1616,7 +1616,7 @@ def test_project_repos(self): dict(data_type=['community_template', 2], method='get'), dict(data_type=['community_template', 3], method='get'), dict(data_type=['community_template', 3, 'use_it'], method='post'), - dict(data_type=['project', '<4[data][project_id]>'], method='get'), + dict(data_type=['project', '<<4[data][project_id]>>'], method='get'), ] response = requests.Response() response.status_code = 200 @@ -1648,44 +1648,44 @@ def test_project_ci(self): dict(data_type=['project'], method='post', data=dict(name='testProjCI')), # 1 dict( - data_type=['project', '<0[data][id]>', 'template'], + data_type=['project', '<<0[data][id]>>', 'template'], method='post', data=self.template_module ), # 2 dict( - data_type=['project', '<0[data][id]>', 'variables'], + data_type=['project', '<<0[data][id]>>', 'variables'], method='post', data=dict(key='ci_template', value='100') ), # 3 dict( - data_type=['project', '<0[data][id]>', 'variables'], - method='post', data=dict(key='ci_template', value='<1[data][id]>') + data_type=['project', '<<0[data][id]>>', 'variables'], + method='post', data=dict(key='ci_template', value='<<1[data][id]>>') ), # 4 - dict(data_type=['project', '<0[data][id]>', 'sync'], method='post'), + dict(data_type=['project', '<<0[data][id]>>', 'sync'], method='post'), # 5 - dict(data_type=['project', '<0[data][id]>', 'history'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'history'], method='get'), # 6 dict( - data_type=['project', '<0[data][id]>', 'variables'], + data_type=['project', '<<0[data][id]>>', 'variables'], method='post', data=dict(key='repo_sync_on_run', value=True) ), # 7 dict( - data_type=['project', '<0[data][id]>', 'variables', '<3[data][id]>'], + data_type=['project', '<<0[data][id]>>', 'variables', '<<3[data][id]>>'], method='delete' ), # 8 dict( - data_type=['project', '<0[data][id]>', 'variables'], + data_type=['project', '<<0[data][id]>>', 'variables'], method='post', data=dict(key='repo_sync_on_run', value=True) ), # 9 dict( - data_type=['project', '<0[data][id]>', 'variables'], - method='post', data=dict(key='ci_template', value='<1[data][id]>') + data_type=['project', '<<0[data][id]>>', 'variables'], + method='post', data=dict(key='ci_template', value='<<1[data][id]>>') ), - dict(data_type=['project', '<0[data][id]>'], method='delete'), + dict(data_type=['project', '<<0[data][id]>>'], method='delete'), ] results = self.make_bulk(bulk_data, 'put') self.assertEqual(results[0]['status'], 201) @@ -1714,15 +1714,15 @@ def test_periodic_task_edit(self): data=dict(name='test_inv') ), # 2 - dict(data_type=['project', '<0[data][id]>', 'sync'], method='post'), + dict(data_type=['project', '<<0[data][id]>>', 'sync'], method='post'), # 3 dict( - data_type=['project', '<0[data][id]>', 'inventory'], method='post', - data=dict(id='<1[data][id]>') + data_type=['project', '<<0[data][id]>>', 'inventory'], method='post', + data=dict(id='<<1[data][id]>>') ), # 4 dict( - data_type=['project', '<0[data][id]>', 'periodic_task'], method='post', + data_type=['project', '<<0[data][id]>>', 'periodic_task'], method='post', data=dict( mode="shell", schedule="* * * * *", type="CRONTAB", inventory='./localhost,', save_result=False, @@ -1730,26 +1730,26 @@ def test_periodic_task_edit(self): ) ), # 5 - dict(data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='get'), # 6 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>', 'variables'], method='post', - data=dict(key='args', value='ls') + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>', 'variables'], + method='post', data=dict(key='args', value='ls') ), # 7 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='put', + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='put', data=dict( mode="shell", schedule="* * * * *", type="CRONTAB", - inventory='<1[data][id]>', save_result=True, + inventory='<<1[data][id]>>', save_result=True, kind="MODULE", name="test_pt", enabled=True ) ), # 8 - dict(data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='get'), # 9 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='put', + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='put', data=dict( mode="shell", schedule="* * * * *", type="CRONTAB", inventory='', save_result=True, @@ -1757,10 +1757,10 @@ def test_periodic_task_edit(self): ) ), # 10 - dict(data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='get'), # 11 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='put', + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='put', data=dict( mode="shell", schedule="* * * * *", type="CRONTAB", inventory='./localhost, ', save_result=True, @@ -1768,23 +1768,26 @@ def test_periodic_task_edit(self): ) ), # 12 - dict(data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>'], method='get'), # 13 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>', 'variables'], method='post', - data=dict(key='connection', value='local') + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>', 'variables'], + method='post', data=dict(key='connection', value='local') ), # 14 dict( - data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>', 'variables'], method='post', - data=dict(key='verbose', value='4') + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>', 'variables'], + method='post', data=dict(key='verbose', value='4') ), # 15 - dict(data_type=['project', '<0[data][id]>', 'periodic_task', '<4[data][id]>', 'execute'], method='post'), + dict( + data_type=['project', '<<0[data][id]>>', 'periodic_task', '<<4[data][id]>>', 'execute'], + method='post' + ), # 16 - dict(data_type=['project', '<0[data][id]>', 'history', '<15[data][history_id]>'], method='get'), + dict(data_type=['project', '<<0[data][id]>>', 'history', '<<15[data][history_id]>>'], method='get'), # 17 - dict(data_type=['project', '<0[data][id]>'], method='delete'), + dict(data_type=['project', '<<0[data][id]>>'], method='delete'), ], 'put') for result in results: diff --git a/polemarch/main/tests/hosts.py b/polemarch/main/tests/hosts.py index c1762ff2..04fc1923 100644 --- a/polemarch/main/tests/hosts.py +++ b/polemarch/main/tests/hosts.py @@ -69,13 +69,13 @@ def _check_copy(self, model_name, bulk_name, copy_checks=None): getattr(obj, name).create() bulk_data = [ self.get_mod_bulk(bulk_name, obj.id, {'name': 'copied'}, 'copy'), - self.get_mod_bulk(bulk_name, '<0[data][id]>', {}, 'variables', method='GET'), + self.get_mod_bulk(bulk_name, '<<0[data][id]>>', {}, 'variables', method='GET'), ] bulk_data += [ - self.get_mod_bulk(bulk_name, '<0[data][id]>', {}, name, method='GET') + self.get_mod_bulk(bulk_name, '<<0[data][id]>>', {}, name, method='GET') for name in copy_checks.keys() ] - bulk_data.append(self.get_bulk(bulk_name, {}, 'del', pk='<0[data][id]>')) + bulk_data.append(self.get_bulk(bulk_name, {}, 'del', pk='<<0[data][id]>>')) results = self.make_bulk(bulk_data) self.assertEqual(results[1]['data']['count'], len(obj.vars)) for value in results[1]['data']['results']: @@ -134,14 +134,14 @@ def test_hosts(self): self.get_bulk('host', dict(name='some-valid'), 'add'), self.get_bulk('host', dict(name='some^invalid'), 'add'), self.get_mod_bulk( - 'host', "<0[data][id]>", dict(key='ansible_host', value='valid') + 'host', "<<0[data][id]>>", dict(key='ansible_host', value='valid') ), self.get_mod_bulk( - 'host', "<0[data][id]>", dict(key='ansible_host', value='^invalid') + 'host', "<<0[data][id]>>", dict(key='ansible_host', value='^invalid') ), self.get_bulk('host', dict(name='some^invalid', type="RANGE"), 'add'), self.get_bulk('host', dict(name='host', type="UNKNOWN"), 'add'), - self.get_bulk('host', {}, 'del', pk="<0[data][id]>"), + self.get_bulk('host', {}, 'del', pk="<<0[data][id]>>"), ] # additionaly test hooks self.hook_model.objects.all().delete() @@ -198,7 +198,7 @@ def test_groups(self): ] bulk_data += [ self.get_mod_bulk( - 'group', '<0[data][id]>', dict(id='<{}[data][id]>'.format(i)), 'group' + 'group', '<<0[data][id]>>', dict(id='<<{}[data][id]>>'.format(i)), 'group' ) for i in range(1, 4) ] diff --git a/polemarch/main/tests/openapi.py b/polemarch/main/tests/openapi.py index 1f5d726a..08f579f4 100644 --- a/polemarch/main/tests/openapi.py +++ b/polemarch/main/tests/openapi.py @@ -37,6 +37,7 @@ def test_openapi_schema(self): openapi_schema_yml['info']['contact'] = schema['info']['contact'] openapi_schema_yml['info']['x-versions'] = schema['info']['x-versions'] openapi_schema_yml['info']['x-links'] = schema['info']['x-links'] + openapi_schema_yml['info']['x-user-id'] = schema['info']['x-user-id'] for key in list(filter(lambda x: 'Ansible' in x, openapi_schema_yml['definitions'].keys())): del openapi_schema_yml['definitions'][key] diff --git a/polemarch/static/css/polemarch-gui.css b/polemarch/static/css/polemarch-gui.css index cc41bdf6..cb5330d9 100644 --- a/polemarch/static/css/polemarch-gui.css +++ b/polemarch/static/css/polemarch-gui.css @@ -319,19 +319,6 @@ body { display: inline-block; } - - -#menu-system-hooks { - display: none; -} - -#RealBody.is_superuser #menu-system-hooks, -#RealBody.is_staff #menu-system-hooks { - display: block; -} - - - .chart-period-select-wrapper { display: flex; margin-right: 10px; diff --git a/polemarch/static/js/common.js b/polemarch/static/js/common.js index 474d63c2..47460941 100644 --- a/polemarch/static/js/common.js +++ b/polemarch/static/js/common.js @@ -1,23 +1,23 @@ -if(window.moment && window.moment.tz) -{ - window.moment.tz.setDefault(window.timeZone); -} +tabSignal.connect("app.beforeInit", ({app}) => { + if(app && window.moment && window.moment.tz) { + window.moment.tz.setDefault(app.api.getTimeZone()); + } +}); -if(guiLocalSettings.get('hideMenu')) -{ - if(window.innerWidth>767){ +if(guiLocalSettings.get('hideMenu')) { + if(window.innerWidth>767) { $("body").addClass('sidebar-collapse'); } } // Adds tests files to the common list of GUI tests -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmTests.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmFields.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmUsers.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmHistory.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmHooks.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmHosts.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmGroups.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmInventories.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmProjects.js'); -window.guiTestsFiles.push(hostname + window.guiStaticPath + 'js/tests/pmDashboard.js'); +window.guiTestsFiles.push('js/tests/pmTests.js'); +window.guiTestsFiles.push('js/tests/pmFields.js'); +window.guiTestsFiles.push('js/tests/pmUsers.js'); +window.guiTestsFiles.push('js/tests/pmHistory.js'); +window.guiTestsFiles.push('js/tests/pmHooks.js'); +window.guiTestsFiles.push('js/tests/pmHosts.js'); +window.guiTestsFiles.push('js/tests/pmGroups.js'); +window.guiTestsFiles.push('js/tests/pmInventories.js'); +window.guiTestsFiles.push('js/tests/pmProjects.js'); +window.guiTestsFiles.push('js/tests/pmDashboard.js'); diff --git a/polemarch/static/js/pmDashboard.js b/polemarch/static/js/pmDashboard.js index 6080cb1a..acfc4bdb 100644 --- a/polemarch/static/js/pmDashboard.js +++ b/polemarch/static/js/pmDashboard.js @@ -3,7 +3,7 @@ * Function, that returns QuerySet for profile/setting page. */ function getProfileSettingQsFromStore() { - let qs = app.application.$store.getters.getQuerySet('user/' + my_user_id + '/settings'); + let qs = app.application.$store.getters.getQuerySet('user/' + app.api.getUserId() + '/settings'); if(!qs) { return; @@ -138,7 +138,7 @@ guiWidgets.history_chart = class HistoryChart extends guiWidgets.line_chart { } return Number( - moment(startTimeOrg).subtract(this.period.amount - 1, this.period.type).tz(window.timeZone).format("x"), + moment(startTimeOrg).subtract(this.period.amount - 1, this.period.type).tz(app.api.getTimeZone()).format("x"), ); } /** @@ -152,8 +152,8 @@ guiWidgets.history_chart = class HistoryChart extends guiWidgets.line_chart { for(let i = -1; i< this.period.amount; i++) { // period up - let time =+ moment(start_time).add(i, this.period.type).tz(window.timeZone).format("x"); - time = moment(time).tz(window.timeZone).format(this.date_format); + let time =+ moment(start_time).add(i, this.period.type).tz(app.api.getTimeZone()).format("x"); + time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); labels.push(time); } @@ -173,8 +173,8 @@ guiWidgets.history_chart = class HistoryChart extends guiWidgets.line_chart { for(let index = 0; index < raw_data[this.period.type].length; index++) { let item = raw_data[this.period.type][index]; - let time =+ moment(item[this.period.type]).tz(window.timeZone).format("x"); - time = moment(time).tz(window.timeZone).format(this.date_format); + let time =+ moment(item[this.period.type]).tz(app.api.getTimeZone()).format("x"); + time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); if(data[time] === undefined) { continue; @@ -658,7 +658,7 @@ customRoutesComponentsTemplates.home = { /* globals customRoutesComponentsTempla * @param {any} value New value of widget's property name */ saveWidgetSettingToApi(widget, prop, value) { - let qs = app.application.$store.state.objects["user/" + my_user_id + "/settings"]; + let qs = app.application.$store.state.objects["user/" + app.api.getUserId() + "/settings"]; if(!qs) { return; @@ -700,7 +700,7 @@ tabSignal.connect('app.afterInit', (obj) => { let app = obj.app; let setting_view = app.views["/profile/settings/"]; let qs = setting_view.objects.clone(); - qs.url = qs.url.format({[path_pk_key]: my_user_id}).replace(/^\/|\/$/g, ""); + qs.url = qs.url.format({[path_pk_key]: app.api.getUserId()}).replace(/^\/|\/$/g, ""); qs.get().then(instance => { guiDashboard.updateSettings(instance.data); diff --git a/polemarch/static/js/pmFields.js b/polemarch/static/js/pmFields.js index c120b069..10762c5e 100644 --- a/polemarch/static/js/pmFields.js +++ b/polemarch/static/js/pmFields.js @@ -362,7 +362,7 @@ guiFields.one_history_date_time = class OneHistoryDateTime extends guiFields.dat return; } - return moment(moment.tz(value, window.timeZone)).tz(moment.tz.guess()).format("YYYY-MM-DD HH:mm:ss"); + return moment(moment.tz(value, app.api.getTimeZone())).tz(moment.tz.guess()).format("YYYY-MM-DD HH:mm:ss"); } }; diff --git a/polemarch/static/js/pmHistory.js b/polemarch/static/js/pmHistory.js index ca9d1807..420da0c2 100644 --- a/polemarch/static/js/pmHistory.js +++ b/polemarch/static/js/pmHistory.js @@ -344,7 +344,7 @@ const history_pk_mixin = { raw_stdout_link() { let url = this.url.replace(/^\/|\/$/g, ""); - return '/api/' + api_version + '/' + url + '/raw'; /* globals api_version */ + return '/api/' + app.api.openapi.info.version + '/' + url + '/raw'; }, /** * Property, that returns url for getting stdout lines. diff --git a/polemarch/static/js/pmUsers.js b/polemarch/static/js/pmUsers.js index 4ed032e6..734fa60f 100644 --- a/polemarch/static/js/pmUsers.js +++ b/polemarch/static/js/pmUsers.js @@ -9,7 +9,7 @@ const user_settings_page_edit_mixin = { return; } - let is_current_user_settings = this.qs_url.replace(/^\/|\/$/g, "") == 'user/' + my_user_id + '/settings'; + let is_current_user_settings = this.qs_url.replace(/^\/|\/$/g, "") == 'user/' + app.api.getUserId() + '/settings'; if(is_current_user_settings) { data.selectedSkin = guiCustomizer.skin.name; diff --git a/polemarch/static/js/tests/pmFields.js b/polemarch/static/js/tests/pmFields.js index b84702ba..8ecad0f3 100644 --- a/polemarch/static/js/tests/pmFields.js +++ b/polemarch/static/js/tests/pmFields.js @@ -138,8 +138,8 @@ window.qunitTestsArray['guiFields[field].{toInner, toRepresent}() - PM'] = { { input: {test_field: '2019-05-08T07:08:07'}, output: { - toInner: '2019-05-08T07:08:07' + (window.timeZone == 'UTC' ? 'Z' : moment.tz(window.timeZone).format('Z')), - toRepresent: moment(moment.tz('2019-05-08T07:08:07', window.timeZone)).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'), + toInner: '2019-05-08T07:08:07' + (app.api.getTimeZone() == 'UTC' ? 'Z' : moment.tz(app.api.getTimeZone()).format('Z')), + toRepresent: moment(moment.tz('2019-05-08T07:08:07', app.api.getTimeZone())).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss'), }, } ], diff --git a/requirements-doc.txt b/requirements-doc.txt index 09df5123..286e0a0a 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=2.15.2 +vstutils[doc]~=3.0.0b1 diff --git a/requirements.txt b/requirements.txt index 5788d91e..af7700bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=2.15.2 +vstutils[rpc,ldap,doc,prod]~=3.0.0b1 docutils==0.15.2 markdown2==2.3.8 From d59a7430ceec91c8512b4314603406b8f710bd2a Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 7 Feb 2020 17:46:56 +1000 Subject: [PATCH 02/16] Fix tests. --- doc/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/installation.rst b/doc/installation.rst index 3472cf49..8fbc9711 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -247,6 +247,7 @@ Cache * **CACHE_LOCATION** - path to cache, if you use `/tmp/polemarch_django_cache` path, then cache engine would be `FileBasedCache`, else `MemcacheCache`. Default value: ``/tmp/polemarch_django_cache` + RPC section ~~~~~~~~~~~ @@ -254,8 +255,7 @@ RPC section * **RPC_HEARTBEAT** - Timeout for RPC. Default value: `5`. -* **RPC_CONCURRENCY** - Number of -concurrently tasks. Default value: `4`. +* **RPC_CONCURRENCY** - Number of concurrently tasks. Default value: `4`. Web section ~~~~~~~~~~~ From c4ebbfd737ba55f5e6f49068adcfdb6bc75c9da2 Mon Sep 17 00:00:00 2001 From: Sergey Klyuykov Date: Tue, 18 Feb 2020 15:23:41 +1000 Subject: [PATCH 03/16] Update docs and requirements --- doc/installation.rst | 2 +- requirements-doc.txt | 2 +- requirements.txt | 2 +- setup.cfg | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/installation.rst b/doc/installation.rst index 8fbc9711..e612a6fb 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -203,7 +203,7 @@ For run Polemarch docker image use command: docker run -d --name polemarch --restart always -v /opt/polemarch/projects:/projects -v /opt/polemarch/hooks:/hooks vstconsulting/polemarch -Using this command download official docker image and run it with default settings. +Using this command download official docker image and run it with default settings. Dont use default SQLite installation with filecache in production. Polemarch will be run with web interface on port `8080` diff --git a/requirements-doc.txt b/requirements-doc.txt index 286e0a0a..c661098d 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=3.0.0b1 +vstutils[doc]~=3.0.0b4 diff --git a/requirements.txt b/requirements.txt index af7700bd..b5c7fbb2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=3.0.0b1 +vstutils[rpc,ldap,doc,prod]~=3.0.0b4 docutils==0.15.2 markdown2==2.3.8 diff --git a/setup.cfg b/setup.cfg index 0c3df2dc..70c2c935 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,7 +22,6 @@ classifiers = Programming Language :: Cython Programming Language :: Python Programming Language :: Python :: 3 - Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3 :: Only @@ -34,7 +33,7 @@ classifiers = [options] zip_safe = False include_package_data = True -python_requires = >=3.5, <4.0 +python_requires = >=3.6, <4.0 [build_sphinx] project = 'Polemarch' @@ -44,7 +43,6 @@ repo = vstconsulting/polemarch assets = dist/polemarch-{release}.tar.gz dist/polemarch-{release}-py3-none-any.whl - dist/polemarch-{release}-cp35-cp35m-manylinux1_x86_64.whl dist/polemarch-{release}-cp36-cp36m-manylinux1_x86_64.whl dist/polemarch-{release}-cp37-cp37m-manylinux1_x86_64.whl From 2381c111460e1b797e77cbe008465e35fd747ce5 Mon Sep 17 00:00:00 2001 From: psayker Date: Fri, 28 Feb 2020 09:29:05 +1000 Subject: [PATCH 04/16] Resolve error with dependencies `gitdb` latest version. Freeze `GitPython` and `gitdb` versions. --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b5c7fbb2..5c53210d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,8 @@ docutils==0.15.2 markdown2==2.3.8 # Repo types -gitpython==3.0.5 +gitpython==3.1.0 +gitdb2==3.0.3 # Hooks requests==2.22.0 From 9f6c24c47d8cf42f5a7d4d7348622e4794f2895d Mon Sep 17 00:00:00 2001 From: Dmitriy Ovcharenko Date: Wed, 18 Mar 2020 08:15:55 +0000 Subject: [PATCH 05/16] Update vstutils version to 3.0.4b5. --- doc/api_schema.yaml | 18 +++++++++--------- polemarch/__init__.py | 2 +- polemarch/main/settings.py | 4 ++-- requirements-doc.txt | 2 +- requirements.txt | 2 +- tox.ini | 1 + 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/api_schema.yaml b/doc/api_schema.yaml index 05496667..83275441 100755 --- a/doc/api_schema.yaml +++ b/doc/api_schema.yaml @@ -19,14 +19,14 @@ info: url: https://gitlab.com/vstconsulting/polemarch.git Request: - name: Question - url: https://gitlab.com/vstconsulting/polemarch/issues/new?issuable_template%5D=Ask&issue%5Btitle%5D=Ask%20about%20version%201.6.2 + url: https://gitlab.com/vstconsulting/polemarch/issues/new?issuable_template%5D=Ask&issue%5Btitle%5D=Ask%20about%20version%201.7.0 - name: Bug report - url: https://gitlab.com/vstconsulting/polemarch/issues/new?issuable_template%5D=Bug&issue%5Btitle%5D=Bug%20in%20version%201.6.2 + url: https://gitlab.com/vstconsulting/polemarch/issues/new?issuable_template%5D=Bug&issue%5Btitle%5D=Bug%20in%20version%201.7.0 - name: Feature request url: https://gitlab.com/vstconsulting/polemarch/issues/new?issuable_template%5D=Feature%20request&issue%5Btitle%5D= x-menu: - name: Projects - span_class: fa fa-fort-awesome + span_class: fab fa-fort-awesome url: /project - name: Community span_class: fa fa-cloud @@ -38,7 +38,7 @@ info: span_class: fa fa-tasks url: /group - name: Hosts - span_class: fa fa-codepen + span_class: fab fa-codepen url: /host url: /inventory - name: History @@ -58,11 +58,11 @@ info: enable_gravatar: true time_zone: UTC x-versions: - application: 1.6.2 - library: 1.6.2 - vstutils: 3.0.0b1 - django: 2.2.2 - ansible: 2.9.2 + application: 1.7.0 + library: 1.7.0 + vstutils: 3.0.0b7 + django: 2.2.10 + ansible: 2.9.5 version: v2 x-user-id: 1 host: localhost:8080 diff --git a/polemarch/__init__.py b/polemarch/__init__.py index 92e4af6b..248654ee 100644 --- a/polemarch/__init__.py +++ b/polemarch/__init__.py @@ -31,6 +31,6 @@ "VST_ROOT_URLCONF": os.getenv("VST_ROOT_URLCONF", 'vstutils.urls'), } -__version__ = "1.7.0" +__version__ = "1.7.1" prepare_environment(**default_settings) diff --git a/polemarch/main/settings.py b/polemarch/main/settings.py index 94ecd1de..83e8cf0a 100644 --- a/polemarch/main/settings.py +++ b/polemarch/main/settings.py @@ -59,7 +59,7 @@ { 'name': 'Projects', 'url': '/project', - 'span_class': 'fa fa-fort-awesome', + 'span_class': 'fab fa-fort-awesome', }, { 'name': 'Community', @@ -79,7 +79,7 @@ { 'name': 'Hosts', 'url': '/host', - 'span_class': 'fa fa-codepen', + 'span_class': 'fab fa-codepen', }, ] }, diff --git a/requirements-doc.txt b/requirements-doc.txt index c661098d..48b0b503 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=3.0.0b4 +vstutils[doc]~=3.0.4b5 diff --git a/requirements.txt b/requirements.txt index 5c53210d..76c74f5b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=3.0.0b4 +vstutils[rpc,ldap,doc,prod]~=3.0.4b5 docutils==0.15.2 markdown2==2.3.8 diff --git a/tox.ini b/tox.ini index cafc088a..75fb7ed2 100644 --- a/tox.ini +++ b/tox.ini @@ -15,6 +15,7 @@ whitelist_externals = rm bash echo + make commands = pip uninstall polemarch -y install: make wheel PY=python COMPILE_DIR={envdir}/dist From e7c52470b153019c6b7d3d0001362503286bf603 Mon Sep 17 00:00:00 2001 From: dem Date: Thu, 19 Mar 2020 14:34:51 +1000 Subject: [PATCH 06/16] Update vstutils version to 3.0.4b6 --- requirements-doc.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-doc.txt b/requirements-doc.txt index 48b0b503..2e132bb9 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=3.0.4b5 +vstutils[doc]~=3.0.4b6 diff --git a/requirements.txt b/requirements.txt index 76c74f5b..94487a58 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=3.0.4b5 +vstutils[rpc,ldap,doc,prod]~=3.0.4b6 docutils==0.15.2 markdown2==2.3.8 From 49ec25ceeb1a2caee4de6eb2c70d8acbfbc2683d Mon Sep 17 00:00:00 2001 From: Dmitriy Ovcharenko Date: Tue, 31 Mar 2020 01:03:55 +0000 Subject: [PATCH 07/16] Fix logo customization + email support --- .jshintrc | 3 ++- polemarch/__init__.py | 2 +- polemarch/static/js/pmItems.js | 4 ++-- requirements-doc.txt | 2 +- requirements.txt | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.jshintrc b/.jshintrc index 18ff280c..0cdb948c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -65,6 +65,7 @@ "vst_vue_components": true, "Vue": true, "XRegExp": true, - "$": true + "$": true, + "spa": true } } \ No newline at end of file diff --git a/polemarch/__init__.py b/polemarch/__init__.py index 248654ee..55783a1e 100644 --- a/polemarch/__init__.py +++ b/polemarch/__init__.py @@ -31,6 +31,6 @@ "VST_ROOT_URLCONF": os.getenv("VST_ROOT_URLCONF", 'vstutils.urls'), } -__version__ = "1.7.1" +__version__ = "1.7.1b1" prepare_environment(**default_settings) diff --git a/polemarch/static/js/pmItems.js b/polemarch/static/js/pmItems.js index b3aace6a..41f72de5 100644 --- a/polemarch/static/js/pmItems.js +++ b/polemarch/static/js/pmItems.js @@ -1,8 +1,8 @@ /** * Redefinition of logo Vue component. */ -vst_vue_components.items.logo = Vue.component('logo', { - props: ['title'], +vst_vue_components.items.logo = spa.globalComponentsRegistrator.add({ + name: 'logo', template: "#template_logo_pm", computed: { /** diff --git a/requirements-doc.txt b/requirements-doc.txt index 2e132bb9..aa931f33 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=3.0.4b6 +vstutils[doc]~=3.0.5b1 diff --git a/requirements.txt b/requirements.txt index 94487a58..b5a4f871 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=3.0.4b6 +vstutils[rpc,ldap,doc,prod]~=3.0.5b1 docutils==0.15.2 markdown2==2.3.8 From 69970d278d798532124c73751c3b36342df5f5bd Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Wed, 8 Apr 2020 18:17:38 +1000 Subject: [PATCH 08/16] Update build image to vstconsulting/images --- .gitlab-ci.yml | 18 +++++++++--------- tox_build.ini | 3 +-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 76741761..9e4a59de 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,6 @@ # set to local images because too long execution -image: onegreyonewhite/tox:tox +default: + image: vstconsulting/images:build variables: GET_SOURCES_ATTEMPTS: 3 @@ -31,7 +32,7 @@ stages: ########################################### .branch_tests_template: &branch_tests stage: test - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox variables: TOX_ENVS: "" before_script: @@ -66,7 +67,6 @@ stages: ########################################### code_style: stage: code_standarts - image: onegreyonewhite/tox:tox variables: TOX_ARGS: "--workdir /cache/.tox_polemarch_code" script: @@ -95,7 +95,7 @@ py36-install: ########################################### deploy_environment: stage: release - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox services: - name: "docker:19.03-dind" alias: "docker_service_host" @@ -113,7 +113,7 @@ deploy_environment: delete_environment: stage: release - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox script: - tox -e destroy_env environment: @@ -127,7 +127,7 @@ delete_environment: release: stage: release - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox only: refs: - master @@ -158,7 +158,7 @@ pages: release_pypi: stage: release - image: onegreyonewhite/tox:centos6 + image: vstconsulting/images:build only: refs: - tags @@ -178,7 +178,7 @@ release_pypi: publish_docker: stage: publish - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox services: - name: 'docker:19.03-dind' alias: 'docker_service_host' @@ -196,7 +196,7 @@ publish_docker: publish_release: stage: publish - image: onegreyonewhite/tox:ubuntu + image: vstconsulting/images:tox allow_failure: true needs: ["release_pypi"] only: diff --git a/tox_build.ini b/tox_build.ini index 796a7f8e..dcdd93f4 100644 --- a/tox_build.ini +++ b/tox_build.ini @@ -1,6 +1,5 @@ [tox] -# envlist = py35-build,py{35,36,37}-wheel,auditwheel -envlist = py35-{build,wheel} +envlist = py37-build,py{36,37,38}-wheel,auditwheel skipsdist = True [testenv] From f8e8a30a7a84433dfab2029f78cd68836b89825b Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Thu, 9 Apr 2020 10:25:15 +1000 Subject: [PATCH 09/16] Update autorelease code and refactoring CI --- .gitlab-ci.yml | 35 +++++++++++++++++------------------ autorelease.sh | 5 ++--- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e4a59de..3ae7e57f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,24 +1,23 @@ # set to local images because too long execution default: image: vstconsulting/images:build - -variables: - GET_SOURCES_ATTEMPTS: 3 - ARTIFACT_DOWNLOAD_ATTEMPTS: 3 - RESTORE_CACHE_ATTEMPTS: 3 - DJANGO_LOG_LEVEL: 'DEBUG' - TOX_ARGS: "--workdir /cache/.tox_polemarch_${CI_BUILD_REF_NAME}" - CCACHE_DIR: /cache/.ccache - CC: ccache gcc - DOCKER_DRIVER: "overlay2" - REGISTRY_IMAGE: "${CI_REGISTRY_IMAGE}" - REGISTRY_IMAGE_TAG: "${KUBE_NAMESPACE}" - REGISTRY_USER: "${CI_REGISTRY_USER}" - REGISTRY_PASSWORD: "${CI_REGISTRY_PASSWORD}" - REGISTRY_URL: "${CI_REGISTRY}" - DOCKER_TLS_CERTDIR: "" - DOCKER_HOST: "tcp://docker_service_host:2375" - K8S_INGRESS_DOMAIN: "polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN" + variables: + GET_SOURCES_ATTEMPTS: 3 + ARTIFACT_DOWNLOAD_ATTEMPTS: 3 + RESTORE_CACHE_ATTEMPTS: 3 + DJANGO_LOG_LEVEL: 'DEBUG' + TOX_ARGS: "--workdir /cache/.tox_polemarch_${CI_BUILD_REF_NAME}" + CCACHE_DIR: /cache/.ccache + CC: ccache gcc + DOCKER_DRIVER: "overlay2" + REGISTRY_IMAGE: "${CI_REGISTRY_IMAGE}" + REGISTRY_IMAGE_TAG: "${KUBE_NAMESPACE}" + REGISTRY_USER: "${CI_REGISTRY_USER}" + REGISTRY_PASSWORD: "${CI_REGISTRY_PASSWORD}" + REGISTRY_URL: "${CI_REGISTRY}" + DOCKER_TLS_CERTDIR: "" + DOCKER_HOST: "tcp://docker_service_host:2375" + K8S_INGRESS_DOMAIN: "polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN" stages: - code_standarts diff --git a/autorelease.sh b/autorelease.sh index ba331878..6344dc57 100755 --- a/autorelease.sh +++ b/autorelease.sh @@ -1,11 +1,10 @@ #!/usr/bin/env bash -CURRENT_VERSION=$(python setup.py --version | tr -d '\n') +CURRENT_VERSION=$(python3 setup.py --version | tr -d '\n') TAG=$(git tag -l $CURRENT_VERSION) -MESSAGE=${CI_COMMIT_MESSAGE:-"Release ${CURRENT_VERSION}"} if [ -z "${TAG}" ]; then echo "Creating new tag ${CURRENT_VERSION}."; - git tag $CURRENT_VERSION -m "${MESSAGE}"> /dev/null 2>&1; + git tag $CURRENT_VERSION > /dev/null 2>&1; git push origin $CURRENT_VERSION > /dev/null 2>&1; else echo "Current release ${CURRENT_VERSION} already exists. Update version to release." From c22ddc38e05f01814fff0928c253e2804dfe792f Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Thu, 9 Apr 2020 10:29:59 +1000 Subject: [PATCH 10/16] Fix vscode refactoring --- .gitlab-ci.yml | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ae7e57f..9e4a59de 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,23 +1,24 @@ # set to local images because too long execution default: image: vstconsulting/images:build - variables: - GET_SOURCES_ATTEMPTS: 3 - ARTIFACT_DOWNLOAD_ATTEMPTS: 3 - RESTORE_CACHE_ATTEMPTS: 3 - DJANGO_LOG_LEVEL: 'DEBUG' - TOX_ARGS: "--workdir /cache/.tox_polemarch_${CI_BUILD_REF_NAME}" - CCACHE_DIR: /cache/.ccache - CC: ccache gcc - DOCKER_DRIVER: "overlay2" - REGISTRY_IMAGE: "${CI_REGISTRY_IMAGE}" - REGISTRY_IMAGE_TAG: "${KUBE_NAMESPACE}" - REGISTRY_USER: "${CI_REGISTRY_USER}" - REGISTRY_PASSWORD: "${CI_REGISTRY_PASSWORD}" - REGISTRY_URL: "${CI_REGISTRY}" - DOCKER_TLS_CERTDIR: "" - DOCKER_HOST: "tcp://docker_service_host:2375" - K8S_INGRESS_DOMAIN: "polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN" + +variables: + GET_SOURCES_ATTEMPTS: 3 + ARTIFACT_DOWNLOAD_ATTEMPTS: 3 + RESTORE_CACHE_ATTEMPTS: 3 + DJANGO_LOG_LEVEL: 'DEBUG' + TOX_ARGS: "--workdir /cache/.tox_polemarch_${CI_BUILD_REF_NAME}" + CCACHE_DIR: /cache/.ccache + CC: ccache gcc + DOCKER_DRIVER: "overlay2" + REGISTRY_IMAGE: "${CI_REGISTRY_IMAGE}" + REGISTRY_IMAGE_TAG: "${KUBE_NAMESPACE}" + REGISTRY_USER: "${CI_REGISTRY_USER}" + REGISTRY_PASSWORD: "${CI_REGISTRY_PASSWORD}" + REGISTRY_URL: "${CI_REGISTRY}" + DOCKER_TLS_CERTDIR: "" + DOCKER_HOST: "tcp://docker_service_host:2375" + K8S_INGRESS_DOMAIN: "polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN" stages: - code_standarts From 4d55463f3dfb71c924cbbce6a3ae61d57824e7e6 Mon Sep 17 00:00:00 2001 From: Dmitriy Ovcharenko Date: Thu, 7 May 2020 07:09:46 +0000 Subject: [PATCH 11/16] Build frontend using webpack --- .gitignore | 5 + .jshintrc | 42 +- frontend_src/.editorconfig | 8 + frontend_src/.prettierrc | 18 + frontend_src/Logo.vue | 34 + frontend_src/ProjectPageAdditional.vue | 258 + frontend_src/common.js | 25 + frontend_src/customizer.js | 187 + frontend_src/dashboard/HistoryChart.js | 21 + .../dashboard/HistoryChartContentBody.vue | 85 + .../dashboard/HistoryChartContentHeader.vue | 70 + frontend_src/dashboard/HistoryChartWidget.js | 284 + frontend_src/dashboard/HomeView.vue | 271 + frontend_src/dashboard/index.js | 182 + frontend_src/dashboard/widgets.js | 124 + .../AnsibleJSONFieldContentReadonly.vue | 146 + frontend_src/fields/FKJustValueFieldMixin.vue | 30 + .../OneHistoryBooleanFieldContentReadonly.vue | 25 + .../OneHistoryChoicesFieldContentReadonly.vue | 17 + .../OneHistoryExecuteArgsFieldMixin.vue | 49 + .../fields/OneHistoryRawInventory.vue | 16 + .../OneHistoryStringFieldContentReadonly.vue | 20 + .../fields/index.js | 199 +- frontend_src/fields/mixins.js | 134 + frontend_src/groups.js | 85 + frontend_src/history/HistoryStdout.vue | 324 + frontend_src/history/HistoryView.vue | 402 + frontend_src/history/index.js | 233 + .../js/pmHosts.js => frontend_src/hosts.js | 53 +- .../inventories.js | 4 +- frontend_src/main.js | 18 + .../css => frontend_src}/polemarch-gui.css | 108 +- frontend_src/projects.js | 243 + .../tasks.js | 264 +- .../templates.js | 1076 +-- .../js/pmUsers.js => frontend_src/users.js | 111 +- package.json | 41 + polemarch/__main__.py | 5 +- polemarch/api/v2/serializers.py | 10 +- polemarch/api/v2/views.py | 21 +- polemarch/main/settings.py | 22 +- polemarch/main/tests/api.py | 1 - polemarch/main/tests/openapi.py | 2 +- polemarch/static/js/common.js | 23 - polemarch/static/js/libs/ansi_up.js | 334 - polemarch/static/js/pmCustomizer.js | 182 - polemarch/static/js/pmDashboard.js | 720 -- polemarch/static/js/pmFieldsMixins.js | 356 - polemarch/static/js/pmGroups.js | 71 - polemarch/static/js/pmHistory.js | 675 -- polemarch/static/js/pmItems.js | 102 - polemarch/static/js/pmProjects.js | 451 -- polemarch/static/templates/pmFields.html | 110 - polemarch/static/templates/pmHistory.html | 181 - polemarch/static/templates/pmItems.html | 158 - polemarch/static/templates/pmProjects.html | 32 - requirements-doc.txt | 2 +- requirements.txt | 2 +- tox.ini | 2 +- webpack.config.js | 110 + yarn.lock | 6761 +++++++++++++++++ 61 files changed, 11212 insertions(+), 4333 deletions(-) create mode 100644 frontend_src/.editorconfig create mode 100644 frontend_src/.prettierrc create mode 100644 frontend_src/Logo.vue create mode 100644 frontend_src/ProjectPageAdditional.vue create mode 100644 frontend_src/common.js create mode 100644 frontend_src/customizer.js create mode 100644 frontend_src/dashboard/HistoryChart.js create mode 100644 frontend_src/dashboard/HistoryChartContentBody.vue create mode 100644 frontend_src/dashboard/HistoryChartContentHeader.vue create mode 100644 frontend_src/dashboard/HistoryChartWidget.js create mode 100644 frontend_src/dashboard/HomeView.vue create mode 100644 frontend_src/dashboard/index.js create mode 100644 frontend_src/dashboard/widgets.js create mode 100644 frontend_src/fields/AnsibleJSONFieldContentReadonly.vue create mode 100644 frontend_src/fields/FKJustValueFieldMixin.vue create mode 100644 frontend_src/fields/OneHistoryBooleanFieldContentReadonly.vue create mode 100644 frontend_src/fields/OneHistoryChoicesFieldContentReadonly.vue create mode 100644 frontend_src/fields/OneHistoryExecuteArgsFieldMixin.vue create mode 100644 frontend_src/fields/OneHistoryRawInventory.vue create mode 100644 frontend_src/fields/OneHistoryStringFieldContentReadonly.vue rename polemarch/static/js/pmFields.js => frontend_src/fields/index.js (64%) create mode 100644 frontend_src/fields/mixins.js create mode 100644 frontend_src/groups.js create mode 100644 frontend_src/history/HistoryStdout.vue create mode 100644 frontend_src/history/HistoryView.vue create mode 100644 frontend_src/history/index.js rename polemarch/static/js/pmHosts.js => frontend_src/hosts.js (56%) rename polemarch/static/js/pmInventories.js => frontend_src/inventories.js (69%) create mode 100644 frontend_src/main.js rename {polemarch/static/css => frontend_src}/polemarch-gui.css (78%) create mode 100644 frontend_src/projects.js rename polemarch/static/js/pmPeriodicTasks.js => frontend_src/tasks.js (55%) rename polemarch/static/js/pmTemplates.js => frontend_src/templates.js (58%) rename polemarch/static/js/pmUsers.js => frontend_src/users.js (51%) create mode 100644 package.json delete mode 100644 polemarch/static/js/common.js delete mode 100644 polemarch/static/js/libs/ansi_up.js delete mode 100644 polemarch/static/js/pmCustomizer.js delete mode 100644 polemarch/static/js/pmDashboard.js delete mode 100644 polemarch/static/js/pmFieldsMixins.js delete mode 100644 polemarch/static/js/pmGroups.js delete mode 100644 polemarch/static/js/pmHistory.js delete mode 100644 polemarch/static/js/pmItems.js delete mode 100644 polemarch/static/js/pmProjects.js delete mode 100644 polemarch/static/templates/pmFields.html delete mode 100644 polemarch/static/templates/pmHistory.html delete mode 100644 polemarch/static/templates/pmItems.html delete mode 100644 polemarch/static/templates/pmProjects.html create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 6fee7c31..d43e533e 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,8 @@ venv.bak/ # mypy .mypy_cache/ + +# Frontend +node_modules +polemarch/static/polemarch +yarn-error.log diff --git a/.jshintrc b/.jshintrc index 0cdb948c..79c8a8ab 100644 --- a/.jshintrc +++ b/.jshintrc @@ -17,52 +17,12 @@ "devel": true, "globals": { - "_translate": true, - "addCssClassesToElement": true, - "ApiConnector": true, - "api_connector_config": true, + "moment": true, "app": true, - "BaseEntityConstructor": true, - "base_field_content_readonly_mixin": true, - "base_field_label_mixin": true, - "capitalizeString": true, - "current_view": true, - "deepEqual": true, - "ErrorHandler": true, - "fieldsRegistrator": true, - "field_fk_content_readonly_mixin": true, - "findClosestPath": true, - "guiFields": true, - "guiLocalSettings": true, - "guiPopUp": true, - "guiSkins": true, - "guiWidgets": true, - "gui_fields_mixins": true, - "guiCustomizer": true, - "guiDashboard": true, - "guiModels": true, - "guiQuerySets": true, "hostname": true, "IMask": true, - "isEmptyObject": true, "iziToast": true, - "modal_window_and_button_mixin": true, - "moment": true, - "my_user_id": true, - "onLoadingErrorHandler": true, - "openapi_dictionary": true, - "path_pk_key": true, - "pop_up_msg": true, - "project_connected_models_dict": true, - "StatusError": true, - "SubViewWithOutApiPathConstructor": true, - "table_row_mixin": true, "tabSignal": true, - "trim": true, - "View": true, - "ViewConstructor": true, - "view_with_autoupdate_mixin": true, - "vst_vue_components": true, "Vue": true, "XRegExp": true, "$": true, diff --git a/frontend_src/.editorconfig b/frontend_src/.editorconfig new file mode 100644 index 00000000..f821fcc2 --- /dev/null +++ b/frontend_src/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,vue}] +indent_style = space +indent_size = 4 +tab_width = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/frontend_src/.prettierrc b/frontend_src/.prettierrc new file mode 100644 index 00000000..92adc5d7 --- /dev/null +++ b/frontend_src/.prettierrc @@ -0,0 +1,18 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "htmlWhitespaceSensitivity": "ignore", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 110, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "all", + "useTabs": false, + "vueIndentScriptAndStyle": true +} diff --git a/frontend_src/Logo.vue b/frontend_src/Logo.vue new file mode 100644 index 00000000..928a5f1a --- /dev/null +++ b/frontend_src/Logo.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/frontend_src/ProjectPageAdditional.vue b/frontend_src/ProjectPageAdditional.vue new file mode 100644 index 00000000..972d9be1 --- /dev/null +++ b/frontend_src/ProjectPageAdditional.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/frontend_src/common.js b/frontend_src/common.js new file mode 100644 index 00000000..d63c3e57 --- /dev/null +++ b/frontend_src/common.js @@ -0,0 +1,25 @@ +tabSignal.connect('app.beforeInit', ({ app }) => { + if (app && window.moment && window.moment.tz) { + window.moment.tz.setDefault(app.api.getTimeZone()); + } +}); + +if (spa.utils.guiLocalSettings.get('hideMenu')) { + if (window.innerWidth > 767) { + $('body').addClass('sidebar-collapse'); + } +} + +// Adds tests files to the common list of GUI tests +window.guiTestsFiles.push( + 'js/tests/pmTests.js', + 'js/tests/pmFields.js', + 'js/tests/pmUsers.js', + 'js/tests/pmHistory.js', + 'js/tests/pmHooks.js', + 'js/tests/pmHosts.js', + 'js/tests/pmGroups.js', + 'js/tests/pmInventories.js', + 'js/tests/pmProjects.js', + 'js/tests/pmDashboard.js', +); diff --git a/frontend_src/customizer.js b/frontend_src/customizer.js new file mode 100644 index 00000000..2eff13e4 --- /dev/null +++ b/frontend_src/customizer.js @@ -0,0 +1,187 @@ +/** + * Mixin, that extends guiSkins.default. + */ +const pmSkinDefaultMixin = { + history_status_ok: { + color_var: '--history-status-ok', + title: 'History status ok', + format: 'color', + default: '#276900', + // priority: 41, + }, + + history_status_error: { + color_var: '--history-status-error', + title: 'History status error', + format: 'color', + default: '#dc3545', + // priority: 42, + }, + + history_status_interrupted: { + color_var: '--history-status-interrupted', + title: 'History status interrupted', + format: 'color', + default: '#9b97e4', + // priority: 43, + }, + + history_status_delay: { + color_var: '--history-status-delay', + title: 'History status delay', + format: 'color', + default: '#808419', + // priority: 44, + }, + + history_status_offline: { + color_var: '--history-status-offline', + title: 'History status offline', + format: 'color', + default: '#9e9e9e', + // priority: 45, + }, + + history_status_run: { + color_var: '--history-status-run', + title: 'History status run', + format: 'color', + default: '#0085ff', + // priority: 46, + }, + + project_status_new: { + color_var: '--project-status-new', + title: 'Project status new', + format: 'color', + default: '#bf71b7', + // priority: 47, + }, + + project_status_error: { + color_var: '--project-status-error', + title: 'Project status error', + format: 'color', + default: '#dc3545', + // priority: 48, + }, + + project_status_ok: { + color_var: '--project-status-ok', + title: 'Project status ok', + format: 'color', + default: '#276900', + // priority: 49, + }, + + project_status_wait_sync: { + color_var: '--project-status-wait-sync', + title: 'Project status wait_sync', + format: 'color', + default: '#0085ff', + // priority: 50, + }, + + project_status_sync: { + color_var: '--project-status-sync', + title: 'Project status sync', + format: 'color', + default: '#ff8c00', + // priority: 51, + }, + + chart_legend_text_color: { + color_var: '--chart-legend-text-color', + title: 'Chart legend text color', + format: 'color', + default: '#666666', + // priority: 52, + }, + + chart_axes_text_color: { + color_var: '--chart-axes-text-color', + title: 'Chart axes text color', + format: 'color', + default: '#666666', + // priority: 53, + }, + + chart_axes_lines_color: { + color_var: '--chart-axes-lines-color', + title: 'Chart axes lines color', + format: 'color', + default: '#efefef', + // priority: 54, + }, +}; + +spa.guiCustomizer.skins = $.extend(true, spa.guiCustomizer.skins.default, pmSkinDefaultMixin); + +/** + * Mixin, that extends guiSkins.dark. + */ +const pmSkinDarkMixin = { + history_status_ok: { + default: '#56E401', + }, + + history_status_error: { + default: '#F61328', + }, + + history_status_interrupted: { + default: '#B68CF3', + }, + + history_status_delay: { + default: '#DBEA10', + }, + + history_status_offline: { + default: '#90C1C0', + }, + + history_status_run: { + default: '#00D7FF', + }, + + project_status_new: { + default: '#D48CCA', + }, + + project_status_error: { + default: '#F61328', + }, + + project_status_ok: { + default: '#56E401', + }, + + project_status_wait_sync: { + default: '#00D7FF', + }, + + project_status_sync: { + default: '#FF9600', + }, + + chart_legend_text_color: { + default: '#cccccc', + }, + + chart_axes_text_color: { + default: '#cccccc', + }, + + chart_axes_lines_color: { + default: '#bababa', + }, +}; + +spa.guiCustomizer.skins.dark = $.extend( + true, + {}, + spa.guiCustomizer.skins.default, + spa.guiCustomizer.skins.dark, + pmSkinDarkMixin, +); diff --git a/frontend_src/dashboard/HistoryChart.js b/frontend_src/dashboard/HistoryChart.js new file mode 100644 index 00000000..421be9a9 --- /dev/null +++ b/frontend_src/dashboard/HistoryChart.js @@ -0,0 +1,21 @@ +import HistoryChartContentHeader from './HistoryChartContentHeader.vue'; +import HistoryChartContentBody from './HistoryChartContentBody.vue'; + +/** + * Component for guiWidgets.history_chart. + */ +const HistoryChart = { + name: 'w_history_chart', + mixins: [spa.components.mixins.LineChartMixin], + data() { + return { + with_content_header: true, + }; + }, + components: { + content_header: HistoryChartContentHeader, + content_body: HistoryChartContentBody, + }, +}; + +export default HistoryChart; diff --git a/frontend_src/dashboard/HistoryChartContentBody.vue b/frontend_src/dashboard/HistoryChartContentBody.vue new file mode 100644 index 00000000..67ec75c4 --- /dev/null +++ b/frontend_src/dashboard/HistoryChartContentBody.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/frontend_src/dashboard/HistoryChartContentHeader.vue b/frontend_src/dashboard/HistoryChartContentHeader.vue new file mode 100644 index 00000000..b2693eaa --- /dev/null +++ b/frontend_src/dashboard/HistoryChartContentHeader.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/frontend_src/dashboard/HistoryChartWidget.js b/frontend_src/dashboard/HistoryChartWidget.js new file mode 100644 index 00000000..fec80503 --- /dev/null +++ b/frontend_src/dashboard/HistoryChartWidget.js @@ -0,0 +1,284 @@ +/** + * Class of history chart widget. + */ +export default class HistoryChartWidget extends spa.dashboard.LineChartWidget { + constructor(options) { + super(options); + + this.format = 'history_chart'; + this.period = options.period; + this.date_format = 'DD.MM.YY'; + + Object.defineProperty(this, 'chart_options', { + get: function () { + return { + maintainAspectRatio: false, + legend: { + labels: { + fontColor: spa.guiCustomizer.guiCustomizer.skin.settings.chart_legend_text_color, + }, + }, + scales: { + yAxes: [ + { + ticks: { + beginAtZero: true, + fontColor: + spa.guiCustomizer.guiCustomizer.skin.settings.chart_axes_text_color, + }, + gridLines: { + color: + spa.guiCustomizer.guiCustomizer.skin.settings.chart_axes_lines_color, + }, + }, + ], + xAxes: [ + { + ticks: { + fontColor: + spa.guiCustomizer.guiCustomizer.skin.settings.chart_axes_text_color, + }, + gridLines: { + color: + spa.guiCustomizer.guiCustomizer.skin.settings.chart_axes_lines_color, + }, + }, + ], + }, + tooltips: { + mode: 'index', + }, + }; + }, + }); + } + + /** + * Method, that returns chart start time moment (first period on xAxes) - + * time in ISO 8601 format. + * @return {number} + * @private + */ + _getChartStartTime() { + // defines current months and year + let monthNum = moment().format('MM'); + let yearNum = moment().format('YYYY'); + let dayNum = moment().format('DD'); + let hourNum = 'T00:00:00'; + let startTimeOrg = ''; + + switch (this.period.type) { + case 'year': + startTimeOrg = yearNum + '-01-01' + hourNum; + break; + case 'month': + startTimeOrg = yearNum + '-' + monthNum + '-01' + hourNum; + break; + case 'day': + startTimeOrg = yearNum + '-' + monthNum + '-' + dayNum + hourNum; + break; + } + + return Number( + moment(startTimeOrg) + .subtract(this.period.amount - 1, this.period.type) + .tz(app.api.getTimeZone()) + .format('x'), + ); + } + /** + * Redefinition of '_formChartDataLabels' method of guiWidgets.line_chart class. + * @returns {Array} + * @private + */ + _formChartDataLabels(raw_data) { + /* jshint unused: false */ + let labels = []; + let start_time = this._getChartStartTime(); + + for (let i = -1; i < this.period.amount; i++) { + // period up + let time = +moment(start_time).add(i, this.period.type).tz(app.api.getTimeZone()).format('x'); + time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); + labels.push(time); + } + + return labels; + } + /** + * Redefinition of '_formChartDataDatasets_oneLine' method of guiWidgets.line_chart class. + * @private + */ + _formChartDataDatasets_oneLine(line, raw_data, labels) { + let data = {}; + + for (let index = 0; index < labels.length; index++) { + data[labels[index]] = 0; + } + + for (let index = 0; index < raw_data[this.period.type].length; index++) { + let item = raw_data[this.period.type][index]; + + let time = +moment(item[this.period.type]).tz(app.api.getTimeZone()).format('x'); + time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); + + if (data[time] === undefined) { + continue; + } + + if (line.name.toLowerCase() == 'all_tasks') { + data[time] = item.all; + } else if (line.name.toLowerCase() == item.status.toLowerCase()) { + data[time] = item.sum; + } + } + + return Object.values(data).map((item) => Number(item)); + } + /** + * Method, that form data sets for chart lines. + * @param {object} raw_data Object with raw data for chart. + * @param {array} labels Array with chart labels. + * @return {Array} + * @private + */ + _formChartDataDatasets(raw_data, labels) { + let datasets = []; + + for (let key in this.lines) { + if (this.lines.hasOwnProperty(key)) { + let line = this.lines[key]; + + if (!line.active) { + continue; + } + + datasets.push({ + label: spa.utils._translate((line.title || line.name).toLowerCase()).toUpperCase(), + data: this._formChartDataDatasets_oneLine(line, raw_data, labels), + borderColor: this._getChartLineColor(line), + backgroundColor: this._getChartLineColor(line, true), + }); + } + } + + return datasets; + } + /** + * Method, that returns current color for chart line. + * @param {object} line Object with chart line settings. + * @param {boolean} bg If true - color should be return for 'background-color' CSS property. + * Otherwise, should be return for 'color' CSS property. + * @private + */ + _getChartLineColor(line, bg) { + let alpha = 1; + let prop = 'color'; + let skin = spa.guiCustomizer.guiCustomizer.skin.settings; + + if (bg) { + alpha = 0.3; + prop = 'bg_color'; + } + + if (skin['history_status_' + line.name]) { + if (skin['history_status_' + line.name][0] == '#') { + let color = hexToRgbA(skin['history_status_' + line.name], alpha); /* globals hexToRgbA */ + return color; + } + + return skin['history_status_' + line.name]; + } + + return line[prop]; + } + /** + * Method, that returns data for widget progress bars - bars that show statistic info. + * @param {object} raw_data Object with raw data for chart. + * @returns {object} + */ + getProgressBarsData(raw_data) { + let all = 0; + let data = {}; + + for (let key in this.lines) { + if (this.lines.hasOwnProperty(key)) { + let line = this.lines[key]; + + if (line.name == 'all_tasks') { + continue; + } + + data[line.name] = { + all: all, + sum: 0, + status: line.name.toUpperCase(), + }; + } + } + + if (raw_data && raw_data.year) { + let stats = raw_data.year; + + for (let index = 0; index < stats.length; index++) { + let record = stats[index]; + let status = record.status.toLowerCase(); + + if (!data[status]) { + continue; + } + + data[status].sum += record.sum; + } + + for (let key in data) { + if (data.hasOwnProperty(key)) { + all += data[key].sum; + } + } + + for (let key in data) { + if (data.hasOwnProperty(key)) { + data[key].all = all; + } + } + } + + return data; + } + /** + * Method, that sets chart period settings based on period.amount property. + * @param {number} number New period.amount property. + */ + setChartPeriod(number) { + let amount, type; + let num = Number(number); + + switch (num) { + case 1095: + amount = 3; + type = 'year'; + break; + case 365: + amount = 13; + type = 'month'; + break; + case 90: + amount = 3; + type = 'month'; + break; + default: + amount = num; + type = 'day'; + break; + } + + this.period = { + type: type, + amount: amount, + query_amount: num, + }; + + spa.utils.guiLocalSettings.set('chart_period', num); + } +} diff --git a/frontend_src/dashboard/HomeView.vue b/frontend_src/dashboard/HomeView.vue new file mode 100644 index 00000000..68887ac0 --- /dev/null +++ b/frontend_src/dashboard/HomeView.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/frontend_src/dashboard/index.js b/frontend_src/dashboard/index.js new file mode 100644 index 00000000..35a12ebe --- /dev/null +++ b/frontend_src/dashboard/index.js @@ -0,0 +1,182 @@ +import HistoryChart from './HistoryChart.js'; +import HomeView from './HomeView.vue'; +import { widgets } from './widgets.js'; +const guiLocalSettings = spa.utils.guiLocalSettings; + +spa.globalComponentsRegistrator.add(HistoryChart); + +/** + * Function, that returns QuerySet for profile/setting page. + */ +function getProfileSettingQsFromStore() { + let qs = app.application.$store.getters.getQuerySet('user/' + app.api.getUserId() + '/settings'); + + if (!qs) { + return; + } + + return qs.copy(); +} + +/** + * Function, that updates data of QuerySet for profile/setting page + * and saves updated queryset in store. + * @param {object} qs QuerySet for profile/setting page + */ +function updateProfileSettingsQsAndSave(qs) { + qs.formQueryAndSend('post', qs.cache.data) + .then((response) => { + /* jshint unused: false */ + app.application.$store.commit('setQuerySet', { + url: qs.url, + queryset: qs, + }); + }) + .catch((error) => { + /* jshint unused: false */ + debugger; + }); +} + +/** + * This function is supposed to be called from 'GuiCustomizer.skin.name.changed' tabSignal. + * This function updates selected skin and saves ProfileSettings QuerySet. + * @param {object} customizer GuiCustomizer instance. + */ +function guiCustomizerSkinOnChangeHandler(customizer) { + let qs = getProfileSettingQsFromStore(); + + if (!qs) { + return; + } + + qs.cache.data.selectedSkin = customizer.skin.name; + + return updateProfileSettingsQsAndSave(qs); +} + +/** + * This function is supposed to be called from 'GuiCustomizer.skins_custom_settings.saved' tabSignal. + * This function updates skins_custom_settings and saves ProfileSettings QuerySet. + * @param {object} customizer GuiCustomizer instance. + */ +function guiCustomizerCustomSettingsOnSaveHandler(customizer) { + let qs = getProfileSettingQsFromStore(); + + if (!qs) { + return; + } + + qs.cache.data.skinsSettings = customizer.skins_custom_settings; + + return updateProfileSettingsQsAndSave(qs); +} +/** + * Method, that updates Dashboard widgets' settings. + * @param {object} settings Object with new Dashboard widgets' settings. + */ +function updateWidgetSettings(settings) { + for (let [wName, props] of Object.entries(settings)) { + if (!widgets[wName]) { + continue; + } + for (let [pName, pValue] of Object.entries(props)) { + widgets[wName][pName] = pValue; + } + } +} + +/** + * Method, that updates line settings of Dashboard pmwChartWidget. + * @param {object} settings Object with new line settings. + */ +function updateChartLineSettings(settings) { + for (let [key, value] of Object.entries(settings)) { + if (!widgets.pmwChartWidget.lines[key]) { + continue; + } + for (let [prop, propValue] of Object.entries(value)) { + widgets.pmwChartWidget.lines[key][prop] = propValue; + } + } +} + +/** + * Method, that updates Dashboard widgets' settings, guiCustomizer settings + * and auto_update interval. + * @param {object} settings Object with new settings. + */ +function updateSettings(settings) { + if (settings.autoupdateInterval) { + guiLocalSettings.set('page_update_interval', settings.autoupdateInterval); + } + + if (settings.selectedSkin) { + guiLocalSettings.set('skin', settings.selectedSkin); + spa.guiCustomizer.guiCustomizer.skin.name = settings.selectedSkin; + } + + if (settings.skinsSettings) { + guiLocalSettings.set('skins_settings', settings.skinsSettings); + spa.guiCustomizer.guiCustomizer.skins_custom_settings = settings.skinsSettings; + } + + if (settings.widgetSettings) { + guiLocalSettings.set('widget_settings', settings.widgetSettings); + updateWidgetSettings(settings.widgetSettings); + } + + if (settings.chartLineSettings && widgets.pmwChartWidget) { + guiLocalSettings.set('chart_line_settings', settings.chartLineSettings); + updateChartLineSettings(settings.chartLineSettings); + } + + if (settings.lang) { + app.setLanguage(settings.lang); + } +} + +if (guiLocalSettings.get('widget_settings')) { + updateWidgetSettings(guiLocalSettings.get('widget_settings')); +} + +if (guiLocalSettings.get('chart_line_settings')) { + updateChartLineSettings(guiLocalSettings.get('chart_line_settings')); +} + +if (guiLocalSettings.get('chart_period')) { + widgets.pmwChartWidget.setChartPeriod(guiLocalSettings.get('chart_period')); +} + +spa.router.mixins.customRoutesComponentsTemplates.home = HomeView; + +tabSignal.connect('app.afterInit', (obj) => { + let app = obj.app; + let setting_view = app.views['/profile/settings/']; + let qs = setting_view.objects.clone(); + qs.url = qs.url.format({ [spa.utils.path_pk_key]: app.api.getUserId() }).replace(/^\/|\/$/g, ''); + + qs.get().then((instance) => { + updateSettings(instance.data); + + let qs_1 = app.application.$store.getters.getQuerySet(qs.url); + if (!qs_1) { + app.application.$store.commit('setQuerySet', { + url: qs.url, + queryset: qs, + }); + } + + tabSignal.connect('GuiCustomizer.skin.name.changed', guiCustomizerSkinOnChangeHandler); + tabSignal.connect( + 'GuiCustomizer.skins_custom_settings.saved', + guiCustomizerCustomSettingsOnSaveHandler, + ); + tabSignal.connect( + 'GuiCustomizer.skins_custom_settings.reseted', + guiCustomizerCustomSettingsOnSaveHandler, + ); + }); +}); + +export { updateSettings, updateWidgetSettings, widgets }; diff --git a/frontend_src/dashboard/widgets.js b/frontend_src/dashboard/widgets.js new file mode 100644 index 00000000..95a758b1 --- /dev/null +++ b/frontend_src/dashboard/widgets.js @@ -0,0 +1,124 @@ +import HistoryChartWidget from './HistoryChartWidget.js'; + +/** + * Dashboard counter widgets + */ +export const pmwTemplatesCounter = new spa.dashboard.CounterWidget({ + name: 'pmwTemplatesCounter', + title: 'templates counter', + sort: 1, + active: true, +}); +export const pmwProjectsCounter = new spa.dashboard.CounterWidget({ + name: 'pmwProjectsCounter', + title: 'projects counter', + sort: 2, + active: true, + url: '/project', +}); +export const pmwInventoriesCounter = new spa.dashboard.CounterWidget({ + name: 'pmwInventoriesCounter', + title: 'inventories counter', + sort: 3, + active: true, + url: '/inventory', +}); +export const pmwGroupsCounter = new spa.dashboard.CounterWidget({ + name: 'pmwGroupsCounter', + title: 'groups counter', + sort: 4, + active: true, + url: '/group', +}); +export const pmwHostsCounter = new spa.dashboard.CounterWidget({ + name: 'pmwHostsCounter', + title: 'hosts counter', + sort: 5, + active: true, + url: '/host', +}); +export const pmwUsersCounter = new spa.dashboard.CounterWidget({ + name: 'pmwUsersCounter', + title: 'users counter', + sort: 6, + active: true, + url: '/user', +}); + +/** + * Dashboard history `chart` widget + */ +export const pmwChartWidget = new HistoryChartWidget({ + name: 'pmwChartWidget', + title: 'Tasks history', + sort: 7, + lines: { + all_tasks: { + name: 'all_tasks', + // title: "All tasks", + color: '#1f77b4', + bg_color: 'rgba(31, 119, 180, 0.3)', + active: true, + }, + ok: { + name: 'ok', + title: 'OK', + color: '#276900', + bg_color: 'rgba(39, 105, 0, 0.3)', + active: true, + }, + error: { + name: 'error', + title: 'ERROR', + color: '#dc3545', + bg_color: 'rgba(220, 53, 69, 0.3)', + active: true, + }, + interrupted: { + name: 'interrupted', + title: 'INTERRUPTED', + color: '#9b97e4', + bg_color: 'rgba(155, 151, 228, 0.3)', + active: true, + }, + delay: { + name: 'delay', + title: 'DELAY', + color: '#808419', + bg_color: 'rgba(128, 132, 25, 0.3)', + active: true, + }, + offline: { + name: 'offline', + title: 'OFFLINE', + color: '#9e9e9e', + bg_color: 'rgba(158, 158, 158, 0.3)', + active: true, + }, + }, + period: { + /** + * Type of period interval. + */ + type: 'day', + /** + * Amount of periods. + */ + amount: 14, + /** + * Amount of periods in days. + * This property is used for API requests. + */ + query_amount: 14, + }, +}); + +export const widgets = { + pmwTemplatesCounter, + pmwProjectsCounter, + pmwInventoriesCounter, + pmwGroupsCounter, + pmwHostsCounter, + pmwUsersCounter, + pmwChartWidget, +}; diff --git a/frontend_src/fields/AnsibleJSONFieldContentReadonly.vue b/frontend_src/fields/AnsibleJSONFieldContentReadonly.vue new file mode 100644 index 00000000..10fb5dad --- /dev/null +++ b/frontend_src/fields/AnsibleJSONFieldContentReadonly.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend_src/fields/FKJustValueFieldMixin.vue b/frontend_src/fields/FKJustValueFieldMixin.vue new file mode 100644 index 00000000..7a1e33f4 --- /dev/null +++ b/frontend_src/fields/FKJustValueFieldMixin.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/frontend_src/fields/OneHistoryBooleanFieldContentReadonly.vue b/frontend_src/fields/OneHistoryBooleanFieldContentReadonly.vue new file mode 100644 index 00000000..041dd633 --- /dev/null +++ b/frontend_src/fields/OneHistoryBooleanFieldContentReadonly.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/frontend_src/fields/OneHistoryChoicesFieldContentReadonly.vue b/frontend_src/fields/OneHistoryChoicesFieldContentReadonly.vue new file mode 100644 index 00000000..1d5399ec --- /dev/null +++ b/frontend_src/fields/OneHistoryChoicesFieldContentReadonly.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/frontend_src/fields/OneHistoryExecuteArgsFieldMixin.vue b/frontend_src/fields/OneHistoryExecuteArgsFieldMixin.vue new file mode 100644 index 00000000..a942d35d --- /dev/null +++ b/frontend_src/fields/OneHistoryExecuteArgsFieldMixin.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/frontend_src/fields/OneHistoryRawInventory.vue b/frontend_src/fields/OneHistoryRawInventory.vue new file mode 100644 index 00000000..88c4521a --- /dev/null +++ b/frontend_src/fields/OneHistoryRawInventory.vue @@ -0,0 +1,16 @@ + diff --git a/frontend_src/fields/OneHistoryStringFieldContentReadonly.vue b/frontend_src/fields/OneHistoryStringFieldContentReadonly.vue new file mode 100644 index 00000000..57a4f757 --- /dev/null +++ b/frontend_src/fields/OneHistoryStringFieldContentReadonly.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/polemarch/static/js/pmFields.js b/frontend_src/fields/index.js similarity index 64% rename from polemarch/static/js/pmFields.js rename to frontend_src/fields/index.js index 10762c5e..2ba2a5b4 100644 --- a/polemarch/static/js/pmFields.js +++ b/frontend_src/fields/index.js @@ -1,7 +1,24 @@ +import { history_initiator_types } from '../history'; +import { + OneHistoryStringFieldMixin, + OneHistoryFieldMixin, + HistoryExecutor, + OneHistoryExecutor, + AnsibleJSONFieldMixin, + OneHistoryChoicesFieldMixin, + OneHistoryBooleanFieldMixin, +} from './mixins'; +import FKJustValueFieldMixin from './FKJustValueFieldMixin.vue'; +import OneHistoryRawInventory from './OneHistoryRawInventory.vue'; +import OneHistoryExecuteArgsFieldMixin from './OneHistoryExecuteArgsFieldMixin.vue'; +const path_pk_key = spa.utils.path_pk_key; +const guiFields = spa.fields.guiFields; + /** * Inventory autocomplete guiField class. */ -guiFields.inventory_autocomplete = class InventoryAutocompleteField extends guiFields.fk_multi_autocomplete { +guiFields.inventory_autocomplete = class InventoryAutocompleteField extends spa.fields.fk.multiAutocomplete + .FKMultiAutocompleteField { /** * Redefinition of 'toInner' method of fk_multi_autocomplete guiField. */ @@ -9,29 +26,29 @@ guiFields.inventory_autocomplete = class InventoryAutocompleteField extends guiF let val, value; val = value = data[this.options.name]; - if(!value) { + if (!value) { return; } - if(value && typeof value == "object") { + if (value && typeof value == 'object') { val = value.value; } - if(!val) { + if (!val) { return; } - if(!isNaN(Number(val))) { + if (!isNaN(Number(val))) { return val; } - if(val[val.length-1] == ",") { + if (val[val.length - 1] == ',') { return val; } let prefix = './'; - if(val.substr(0,2) == prefix) { + if (val.substr(0, 2) == prefix) { return val; } @@ -47,7 +64,7 @@ guiFields.inventory_autocomplete = class InventoryAutocompleteField extends guiF _prefetchDataOrNot(data) { let value = this.toInner(data); - if(!isNaN(Number(value))) { + if (!isNaN(Number(value))) { return true; } @@ -70,14 +87,16 @@ guiFields.inventory_autocomplete = class InventoryAutocompleteField extends guiF /** * Playbook autocomplete guiField class. */ -guiFields.playbook_autocomplete = class PlaybookAutocompleteField extends guiFields.fk_autocomplete { +guiFields.playbook_autocomplete = class PlaybookAutocompleteField extends spa.fields.fk.autocomolete + .FKAutocompleteField { /** * Method, that defines - make prefetch or not. * @param {object} data Instance data. * @return {boolean} * @private */ - _prefetchDataOrNot(data) { /* jshint unused: false */ + _prefetchDataOrNot(data) { + /* jshint unused: false */ return false; } /** @@ -109,24 +128,26 @@ guiFields.group_autocomplete = class GroupAutocompleteField extends guiFields.pl * These fields should format queryset urls containing project id. * Project id can be either in instance's data or in route's url params. */ -const field_depended_on_project_mixin = (Class_name) => class extends Class_name { - /** - * Redefinition of 'formatQuerySetUrl' method of fk guiField. - */ - formatQuerySetUrl(url="", data={}, params={}) { /* jshint unused: false */ - if(url.indexOf('{') == -1) { - return url; - } +const field_depended_on_project_mixin = (Class_name) => + class extends Class_name { + /** + * Redefinition of 'formatQuerySetUrl' method of fk guiField. + */ + formatQuerySetUrl(url = '', data = {}, params = {}) { + /* jshint unused: false */ + if (url.indexOf('{') == -1) { + return url; + } - let project = data.project || app.application.$route.params[path_pk_key]; + let project = data.project || app.application.$route.params[path_pk_key]; - if(project && typeof project == 'object' && project.value) { - project = project.value; - } + if (project && typeof project == 'object' && project.value) { + project = project.value; + } - return url.format({[path_pk_key]: project}); - } -}; + return url.format({ [path_pk_key]: project }); + } + }; /** * History Mode guiField class. @@ -135,7 +156,7 @@ guiFields.history_mode = class HistoryModeField extends field_depended_on_projec /** * Redefinition of 'getPrefetchValue' method of fk guiField. */ - getPrefetchValue(data={}, prefetch_data={}) { + getPrefetchValue(data = {}, prefetch_data = {}) { return { value: prefetch_data[this.options.additionalProperties.value_field], prefetch_value: data[this.options.name], @@ -146,7 +167,7 @@ guiFields.history_mode = class HistoryModeField extends field_depended_on_projec * @param data {object} Object with instance data. * @return {string} */ - getMode(data={}) { + getMode(data = {}) { return data.kind.toLowerCase(); } /** @@ -154,19 +175,19 @@ guiFields.history_mode = class HistoryModeField extends field_depended_on_projec * @param data {object} Object with instance data. * @return {boolean} */ - isPlaybookMode(data={}) { + isPlaybookMode(data = {}) { return this.getMode(data) === 'playbook'; } /** * Redefinition of 'getPrefetchFilterName' method of fk guiField. */ - getPrefetchFilterName(data={}) { + getPrefetchFilterName(data = {}) { return this.isPlaybookMode(data) ? 'pb_filter' : 'name'; } /** * Redefinition of 'isPrefetchDataForMe' method of fk guiField. */ - isPrefetchDataForMe(data={}, prefetch_data={}) { + isPrefetchDataForMe(data = {}, prefetch_data = {}) { let field_name = this.isPlaybookMode(data) ? 'playbook' : 'name'; return data[this.options.name] == prefetch_data[field_name]; @@ -174,10 +195,10 @@ guiFields.history_mode = class HistoryModeField extends field_depended_on_projec /** * Redefinition of 'getAppropriateQuerySet' method of fk guiField. */ - getAppropriateQuerySet(data={}, querysets=null) { + getAppropriateQuerySet(data = {}, querysets = null) { let qs = querysets || this.options.additionalProperties.querysets; - return qs.filter(item => item.url.indexOf(this.getMode(data)) !== -1)[0]; + return qs.filter((item) => item.url.indexOf(this.getMode(data)) !== -1)[0]; } }; @@ -186,24 +207,28 @@ guiFields.history_mode = class HistoryModeField extends field_depended_on_projec */ guiFields.one_history_mode = class OneHistoryModeField extends guiFields.history_mode { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_fk); + return super.mixins.concat(OneHistoryStringFieldMixin, { + mixins: [OneHistoryFieldMixin], + }); } }; /** * History Initiator guiField class. */ -guiFields.history_initiator = class HistoryInitiatorField extends field_depended_on_project_mixin(guiFields.fk) { +guiFields.history_initiator = class HistoryInitiatorField extends field_depended_on_project_mixin( + guiFields.fk, +) { static get initiatorTypes() { - return history_initiator_types; /* globals history_initiator_types */ + return history_initiator_types; } /** * Redefinition of 'getAppropriateQuerySet' method of fk guiField. */ - getAppropriateQuerySet(data={}, querysets=null) { + getAppropriateQuerySet(data = {}, querysets = null) { let qs = querysets; - if(!qs) { + if (!qs) { qs = this.options.additionalProperties.querysets; } @@ -213,17 +238,17 @@ guiFields.history_initiator = class HistoryInitiatorField extends field_depended let path = dict[data.initiator_type]; - if(!path) { + if (!path) { return selected; } - for(let index = 0; index < qs.length; index++) { + for (let index = 0; index < qs.length; index++) { let item = qs[index]; - let p1 = item.url.replace(/^\/|\/$/g, "").split("/"); - let p2 = path.replace(/^\/|\/$/g, "").split("/"); + let p1 = item.url.replace(/^\/|\/$/g, '').split('/'); + let p2 = path.replace(/^\/|\/$/g, '').split('/'); - if(p1.last == p2.last) { + if (p1.last == p2.last) { selected = item; } } @@ -237,7 +262,9 @@ guiFields.history_initiator = class HistoryInitiatorField extends field_depended */ guiFields.one_history_initiator = class OneHistoryInitiatorField extends guiFields.history_initiator { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_initiator); + return super.mixins.concat(OneHistoryStringFieldMixin, { + mixins: [OneHistoryFieldMixin], + }); } }; @@ -249,8 +276,8 @@ guiFields.history_executor = class HistoryExecutorField extends guiFields.fk { * Redefinition of 'makeLinkOrNot' method of fk guiField. * @param {object} data */ - makeLinkOrNot(data={}) { - if(data.initiator_type == 'scheduler') { + makeLinkOrNot(data = {}) { + if (data.initiator_type == 'scheduler') { return false; } @@ -260,8 +287,8 @@ guiFields.history_executor = class HistoryExecutorField extends guiFields.fk { * Redefinition of 'prefetchDataOrNot' method of fk guiField. * @param {object} data */ - prefetchDataOrNot(data={}) { - if(data.initiator_type == 'scheduler') { + prefetchDataOrNot(data = {}) { + if (data.initiator_type == 'scheduler') { return false; } @@ -271,15 +298,14 @@ guiFields.history_executor = class HistoryExecutorField extends guiFields.fk { * Redefinition of 'toRepresent' method of fk guiField. * @param {object} data */ - toRepresent(data={}) { - if(data.initiator_type == 'scheduler') { + toRepresent(data = {}) { + if (data.initiator_type == 'scheduler') { return 'system'; } let value = data[this.options.name]; - - if(value && typeof value == "object") { + if (value && typeof value == 'object') { return value.prefetch_value; } @@ -287,7 +313,7 @@ guiFields.history_executor = class HistoryExecutorField extends guiFields.fk { } static get mixins() { - return super.mixins.concat(gui_fields_mixins.history_executor); + return super.mixins.concat(HistoryExecutor); } }; @@ -296,19 +322,19 @@ guiFields.history_executor = class HistoryExecutorField extends guiFields.fk { */ guiFields.one_history_executor = class OneHistoryExecutorField extends guiFields.history_executor { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_executor); + return super.mixins.concat(OneHistoryStringFieldMixin, OneHistoryExecutor); } }; /** * Ansible json guiField class. */ -guiFields.ansible_json = class AnsibleJsonField extends guiFields.base { +guiFields.ansible_json = class AnsibleJsonField extends spa.fields.base.BaseField { /** * Redefinition of base guiField static property 'mixins'. */ static get mixins() { - return super.mixins.concat(gui_fields_mixins.ansible_json); + return super.mixins.concat(AnsibleJSONFieldMixin); } }; @@ -317,9 +343,9 @@ guiFields.ansible_json = class AnsibleJsonField extends guiFields.base { * This field does not show label, description and other components. * This field is supposed to be used in views for OneHistory model. */ -guiFields.fk_just_value = class FkJustValueField extends guiFields.fk { +guiFields.fk_just_value = class FkJustValueField extends spa.fields.fk.fk.FKField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.fk_just_value); + return super.mixins.concat(FKJustValueFieldMixin); } }; @@ -327,9 +353,9 @@ guiFields.fk_just_value = class FkJustValueField extends guiFields.fk { * History String guiField class. * String field for views for OneHistory model. */ -guiFields.one_history_string = class OneHistoryStringField extends guiFields.string { +guiFields.one_history_string = class OneHistoryStringField extends spa.fields.text.StringField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string); + return super.mixins.concat(OneHistoryStringFieldMixin); } }; @@ -337,9 +363,9 @@ guiFields.one_history_string = class OneHistoryStringField extends guiFields.str * History FK guiField class. * FK field for views for OneHistory model. */ -guiFields.one_history_fk = class OneHistoryFkField extends guiFields.fk { +guiFields.one_history_fk = class OneHistoryFkField extends spa.fields.fk.fk.FKField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_fk); + return super.mixins.concat(OneHistoryStringFieldMixin, OneHistoryFieldMixin); } }; @@ -347,33 +373,34 @@ guiFields.one_history_fk = class OneHistoryFkField extends guiFields.fk { * History DATE_TIME guiField class. * DATE_TIME field for views for OneHistory model. */ -guiFields.one_history_date_time = class OneHistoryDateTime extends guiFields.date_time { - static get mixins(){ - return super.mixins.concat(gui_fields_mixins.one_history_string); +guiFields.one_history_date_time = class OneHistoryDateTime extends spa.fields.datetime.DateTimeField { + static get mixins() { + return super.mixins.concat(OneHistoryStringFieldMixin); } /** * Redefinition of 'toRepresent' method of one_history_string guiField. */ - toRepresent(data={}) { + toRepresent(data = {}) { let value = data[this.options.name]; - if(!value) { + if (!value) { return; } - return moment(moment.tz(value, app.api.getTimeZone())).tz(moment.tz.guess()).format("YYYY-MM-DD HH:mm:ss"); + return moment(moment.tz(value, app.api.getTimeZone())) + .tz(moment.tz.guess()) + .format('YYYY-MM-DD HH:mm:ss'); } - }; /** * History UPTIME guiField class. * UPTIME field for views for OneHistory model. */ -guiFields.one_history_uptime = class OneHistoryUpTime extends guiFields.uptime { - static get mixins(){ - return super.mixins.concat(gui_fields_mixins.one_history_string); +guiFields.one_history_uptime = class OneHistoryUpTime extends spa.fields.datetime.UptimeField { + static get mixins() { + return super.mixins.concat(OneHistoryStringFieldMixin); } }; @@ -385,10 +412,10 @@ guiFields.one_history_revision = class OneHistoryRevision extends guiFields.one_ /** * Redefinition of 'toRepresent' method of one_history_string guiField. */ - toRepresent(data={}) { + toRepresent(data = {}) { let value = data[this.options.name]; - if(value) { + if (value) { return value.substr(0, 8); } } @@ -399,8 +426,8 @@ guiFields.one_history_revision = class OneHistoryRevision extends guiFields.one_ * ONE_HISTORY_CHOICES field for views for OneHistory model. */ guiFields.one_history_choices = class OneHistoryChoices extends guiFields.choices { - static get mixins(){ - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_choices); + static get mixins() { + return super.mixins.concat(OneHistoryStringFieldMixin, OneHistoryChoicesFieldMixin); } }; @@ -408,9 +435,10 @@ guiFields.one_history_choices = class OneHistoryChoices extends guiFields.choice * History ONE_HISTORY_RAW_INVENTORY guiField class. * ONE_HISTORY_RAW_INVENTORY field for views for OneHistory model. */ -guiFields.one_history_raw_inventory = class OneHistoryRawInventoryField extends guiFields.plain_text { +guiFields.one_history_raw_inventory = class OneHistoryRawInventoryField extends spa.fields.text + .PlainTextField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_raw_inventory); + return super.mixins.concat(OneHistoryRawInventory); } }; @@ -418,9 +446,9 @@ guiFields.one_history_raw_inventory = class OneHistoryRawInventoryField extends * History ONE_HISTORY_BOOLEAN guiField class. * ONE_HISTORY_BOOLEAN field for views for OneHistory model. */ -guiFields.one_history_boolean = class OneHistoryBooleanField extends guiFields.boolean { +guiFields.one_history_boolean = class OneHistoryBooleanField extends spa.fields.boolean.BooleanField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_string, gui_fields_mixins.one_history_boolean); + return super.mixins.concat(OneHistoryStringFieldMixin, OneHistoryBooleanFieldMixin); } }; @@ -428,18 +456,18 @@ guiFields.one_history_boolean = class OneHistoryBooleanField extends guiFields.b * History ONE_HISTORY_EXECUTE_ARGS guiField class. * ONE_HISTORY_EXECUTE_ARGS field for views for OneHistory model. */ -guiFields.one_history_execute_args = class OneHistoryExecuteArgsField extends guiFields.json { +guiFields.one_history_execute_args = class OneHistoryExecuteArgsField extends spa.fields.json.JSONField { static get mixins() { - return super.mixins.concat(gui_fields_mixins.one_history_execute_args); + return super.mixins.concat(OneHistoryExecuteArgsFieldMixin); } /** * Method, that inits all real fields of json field. */ - generateRealFields(value={}) { + generateRealFields(value = {}) { let realFields = {}; - for(let field in value) { - if(value.hasOwnProperty(field)) { + for (let field in value) { + if (value.hasOwnProperty(field)) { let opt = { name: field, readOnly: this.options.readOnly || false, @@ -447,12 +475,11 @@ guiFields.one_history_execute_args = class OneHistoryExecuteArgsField extends gu format: 'one_history_string', }; - if (typeof value[field] == 'boolean') { opt.format = 'one_history_boolean'; } - realFields[field] = new guiFields[opt.format](opt); + realFields[field] = new spa.fields.guiFields[opt.format](opt); } } diff --git a/frontend_src/fields/mixins.js b/frontend_src/fields/mixins.js new file mode 100644 index 00000000..e3ab86be --- /dev/null +++ b/frontend_src/fields/mixins.js @@ -0,0 +1,134 @@ +import AnsibleJSONFieldContentReadonly from './AnsibleJSONFieldContentReadonly.vue'; +import OneHistoryStringFieldContentReadonly from './OneHistoryStringFieldContentReadonly.vue'; +import OneHistoryChoicesFieldContentReadonly from './OneHistoryChoicesFieldContentReadonly.vue'; +import OneHistoryBooleanFieldContentReadonly from './OneHistoryBooleanFieldContentReadonly.vue'; + +/** + * Mixin for 'one_history_fk' fields. + */ +export const OneHistoryFieldMixin = { + components: { + field_content_readonly: { + mixins: [spa.fields.fk.fk.FKFieldContentReadonlyComponent], + data() { + return { + class_list: [], + styles_dict: {}, + }; + }, + }, + }, +}; + +/** + * Mixin for ansible json field. + */ +export const AnsibleJSONFieldMixin = { + data: function () { + return { + wrapper_classes_list: { + base: 'form-group guiField', + grid: 'col-lg-12 col-xs-12 col-sm-12 col-md-12', + }, + }; + }, + components: { + field_content_readonly: { + mixins: [spa.fields.base.BaseFieldContentReadonlyMixin, AnsibleJSONFieldContentReadonly], + }, + }, +}; + +/** + * Mixin for one_history_string field. + */ +export const OneHistoryStringFieldMixin = { + data: function () { + return { + wrapper_classes_list: { + base: + 'form-group ' + + spa.utils.addCssClassesToElement( + 'guiField', + this.field.options.name, + this.field.options.format || this.field.options.type, + ), + grid: 'col-lg-12 col-xs-12 col-sm-12 col-md-12', + }, + }; + }, + components: { + field_label: { + mixins: [spa.fields.base.BaseFieldLabel], + data() { + return { + styles_dict: { + float: 'left', + width: '50%', + }, + }; + }, + }, + field_content_readonly: OneHistoryStringFieldContentReadonly, + }, +}; + +/** + * Mixin for one_history_choices field. + */ +export const OneHistoryChoicesFieldMixin = { + components: { + field_content_readonly: OneHistoryChoicesFieldContentReadonly, + }, +}; + +/** + * Mixin for one_history_boolean field. + */ +export const OneHistoryBooleanFieldMixin = { + components: { + field_content_readonly: OneHistoryBooleanFieldContentReadonly, + }, +}; + +/** + * Mixin for history_executor field. + */ +export const HistoryExecutor = { + components: { + field_list_view: { + mixins: [spa.fields.base.BaseFieldListView, spa.fields.fk.fk.FKFieldListView], + computed: { + text() { + return this.field.toRepresent(this.data); + }, + }, + }, + }, +}; + +/** + * Mixin for one_history_executor field. + */ +export const OneHistoryExecutor = { + components: { + field_content_readonly: { + mixins: [ + spa.fields.base.BaseFieldContentReadonlyMixin, + spa.fields.fk.fk.FKFieldContentReadonly, + spa.fields.fk.fk.FKFieldContentReadonlyComponent, + ], + data() { + return { + class_list: [], + styles_dict: {}, + }; + }, + computed: { + text() { + return this.field.toRepresent(this.data); + }, + }, + }, + }, +}; diff --git a/frontend_src/groups.js b/frontend_src/groups.js new file mode 100644 index 00000000..a74be986 --- /dev/null +++ b/frontend_src/groups.js @@ -0,0 +1,85 @@ +const path_pk_key = spa.utils.path_pk_key; + +/** + * Signal, that creates views for paths, which do not exist in API: + * - /inventory/{pk}/group/{group_id}/group/ and all paths, that nested in /group/{pk}/group/ path. + */ +tabSignal.connect('allViews.inited', (obj) => { + let views = obj.views; + let prefix = '/inventory/{' + path_pk_key + '}'; + let constr = new spa.views.SubViewWithOutApiPathConstructor(spa.api.openapi_dictionary, app.models, { + prefix: prefix, + }); + let group_group_paths = Object.keys(views).filter( + (path) => path.indexOf('/group/{' + path_pk_key + '}/group/') == 0, + ); + + group_group_paths.forEach((path) => { + let new_path = + prefix + + path.replace('{group_id}', '{subgroup_id}').replace('{' + path_pk_key + '}', '{group_id}'); + let new_view = constr.generateSubView(views, path, new_path); + views[new_path] = new_view; + }); +}); + +/** + * Signal, that creates views for paths, which do not exist in API: + * - /project/{pk}/inventory/{inventory_id}/group/{group_id}/group/ and all paths, that nested in /group/{pk}/group/ path. + */ +tabSignal.connect('allViews.inited', (obj) => { + let views = obj.views; + let prefix = '/project/{' + path_pk_key + '}/inventory/{inventory_id}'; + let constr = new spa.views.SubViewWithOutApiPathConstructor(spa.api.openapi_dictionary, app.models, { + prefix: prefix, + }); + let group_group_paths = Object.keys(views).filter( + (path) => path.indexOf('/group/{' + path_pk_key + '}/group/') == 0, + ); + + group_group_paths.forEach((path) => { + let new_path = + prefix + + path.replace('{group_id}', '{subgroup_id}').replace('{' + path_pk_key + '}', '{group_id}'); + let new_view = constr.generateSubView(views, path, new_path); + views[new_path] = new_view; + }); +}); + +/** + * Signal, that hides 'Host' button from children group views and hides 'Group' button from not children group views. + */ +tabSignal.connect('allViews.inited', (obj) => { + let views = obj.views; + let group_views = Object.values(views).filter((view) => { + let obj = view.schema; + if (obj.path.indexOf('group') != -1 && obj.name == 'group' && ['list', 'page'].includes(obj.type)) { + return true; + } + }); + + group_views.forEach((view) => { + view.getViewSublinkButtons = function (type, buttons, instance) { + let data = instance.data; + let btns = $.extend(true, {}, buttons); + + if (!data) { + return btns; + } + + if (type == 'sublinks' || type == 'child_links') { + if (data.children) { + if (btns.host) { + btns.host.hidden = true; + } + } else { + if (btns.group) { + btns.group.hidden = true; + } + } + } + + return btns; + }; + }); +}); diff --git a/frontend_src/history/HistoryStdout.vue b/frontend_src/history/HistoryStdout.vue new file mode 100644 index 00000000..089e5e44 --- /dev/null +++ b/frontend_src/history/HistoryStdout.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/frontend_src/history/HistoryView.vue b/frontend_src/history/HistoryView.vue new file mode 100644 index 00000000..fc27fd26 --- /dev/null +++ b/frontend_src/history/HistoryView.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/frontend_src/history/index.js b/frontend_src/history/index.js new file mode 100644 index 00000000..d0c77b7d --- /dev/null +++ b/frontend_src/history/index.js @@ -0,0 +1,233 @@ +import HistoryView from './HistoryView.vue'; +const path_pk_key = spa.utils.path_pk_key; + +/** + * Variable, that stores array with History Models names, + * fields of those should be changed in the tabSignal. + */ +const history_models = ['History', 'OneHistory', 'ProjectHistory']; + +/** + * Variable, that stores pairs (key, value), where: + * - key - value of initiator_type field; + * - value - path from which should be loaded prefetch data. + */ +const history_initiator_types = { + project: '/project/', + template: '/project/{' + path_pk_key + '}/template/', + scheduler: '/project/{' + path_pk_key + '}/periodic_task/', +}; + +/** + * Variable, that stores array with History paths, + * options of those should be changed in the tabSignal. + */ +const history_paths = [ + '/history/', + '/history/{' + path_pk_key + '}/', + '/project/{' + path_pk_key + '}/history/', + '/project/{' + path_pk_key + '}/history/{history_id}/', +]; + +/** + * Variable, that stores object with additional properties for history_mode field's options. + */ +const history_mode_additionalProperties = { + list_paths: ['/project/{' + path_pk_key + '}/playbook/', '/project/{' + path_pk_key + '}/module/'], + value_field: 'id', +}; + +/** + * Function, that adds signal for some history model's fields. + * @param {string} model + */ +function historyModelsFieldsHandler(model) { + let str = 'models[{0}].fields.beforeInit'.format([model]); + tabSignal.connect(str, (fields) => { + fields.start_time.format = 'one_history_date_time'; + fields.stop_time.format = 'one_history_date_time'; + + if (fields.inventory) { + fields.inventory.format = 'fk'; + fields.inventory.additionalProperties = { + model: { $ref: '#/definitions/Inventory' }, + value_field: 'id', + view_field: 'name', + }; + } + + if (fields.executor) { + fields.executor.format = 'history_executor'; + fields.executor.additionalProperties = { + model: { $ref: '#/definitions/User' }, + value_field: 'id', + view_field: 'username', + }; + } + + ['options', 'initiator_type', 'kind', 'project'].forEach((field) => { + if (fields[field]) { + fields[field].hidden = true; + } + }); + + if (fields.initiator) { + fields.initiator.format = 'history_initiator'; + fields.initiator.additionalProperties = { + list_paths: Object.values(history_initiator_types), + view_field: 'name', + value_field: 'id', + }; + } + + if (fields.revision) { + fields.revision.format = 'one_history_revision'; + } + + if (fields.mode) { + fields.mode.format = 'history_mode'; + fields.mode.additionalProperties = { ...history_mode_additionalProperties }; + } + }); +} + +/** + * Function - onchange callback of dynamic field - OneHistory.fields.mode. + */ +function OneHistory_kind_mode_callback(parent_values = {}) { + let obj = { + save_value: true, + format: 'one_history_mode', + additionalProperties: { ...history_mode_additionalProperties }, + }; + + if (parent_values.kind) { + obj.title = parent_values.kind.toLowerCase(); + } + + return obj; +} + +/** + * Function, that adds signal for some OneHistory model's fields. + * @param {string} model + */ +function OneHistoryFieldsHandler(model) { + tabSignal.connect('models[' + model + '].fields.beforeInit', (fields) => { + for (let field in fields) { + if (fields.hasOwnProperty(field)) { + fields[field].format = 'one_history_string'; + + if (['kind', 'raw_args', 'raw_stdout', 'initiator_type'].includes(field)) { + fields[field].format = 'hidden'; + } else if (['start_time', 'stop_time'].includes(field)) { + fields[field].format = 'one_history_date_time'; + } + } + } + + fields.executor.format = 'one_history_executor'; + fields.initiator.format = 'one_history_initiator'; + fields.inventory.format = 'one_history_fk'; + fields.inventory.hidden = true; + fields.execute_args.format = 'one_history_execute_args'; + fields.execution_time.format = 'one_history_uptime'; + fields.revision.format = 'one_history_revision'; + fields.status.format = 'one_history_choices'; + + fields.raw_inventory.format = 'one_history_raw_inventory'; + fields.raw_inventory.hidden = true; + + fields.mode.format = 'dynamic'; + fields.mode.additionalProperties = { + callback: OneHistory_kind_mode_callback, + field: ['kind'], + }; + }); +} + +/** + * Function, that adds signal for some history view's filters. + * @param {string} path + */ +function historyPathsFiltersHandler(path) { + /** + * Changes 'status' filter type to 'choices'. + */ + tabSignal.connect('views[' + path + '].filters.beforeInit', (filters) => { + for (let key in filters) { + if (filters.hasOwnProperty(key)) { + let filter = filters[key]; + + if (filter.name == 'status') { + filter.type = 'choices'; + filter.enum = app.models.History.fields.status.options.enum; + } + } + } + }); +} + +/** + * Function, that adds signal for some history view modification. + * @param {string} path + */ +function historyPathsViewsHandler(path) { + tabSignal.connect('views[' + path + '].afterInit', (obj) => { + if (obj.view.schema.type == 'page') { + obj.view.mixins = obj.view.mixins.concat(HistoryView); + } + }); + + tabSignal.connect('views[' + path + '].created', (obj) => { + if (obj.view.schema.type == 'list' && obj.view.schema.operations && obj.view.schema.operations.add) { + delete obj.view.schema.operations.add; + } + }); +} + +/** + * Function, that adds signals for history models and history views. + */ +function addHistorySignals() { + history_models.forEach(historyModelsFieldsHandler); + + history_paths.forEach(historyPathsViewsHandler); + + history_paths.forEach(historyPathsFiltersHandler); + + OneHistoryFieldsHandler('OneHistory'); +} +// adds signal for history models and views. +addHistorySignals(); + +tabSignal.connect('allViews.inited', (obj) => { + let views = obj.views; + + history_paths.forEach((path) => { + views[path].getViewSublinkButtons = function (type, buttons, instance) { + let data = instance.data; + let btns = $.extend(true, {}, buttons); + + if (!data) { + return btns; + } + + if (type == 'actions' || type == 'child_links') { + if (!['RUN', 'DELAY'].includes(data.status)) { + btns.cancel.hidden = true; + } + + if (!(data.status == 'OK' && data.kind == 'MODULE' && data.mode == 'setup')) { + btns.facts.hidden = true; + } + + btns.clear.hidden = true; + } + + return btns; + }; + }); +}); + +export { history_initiator_types, HistoryView, history_models, history_paths, addHistorySignals }; diff --git a/polemarch/static/js/pmHosts.js b/frontend_src/hosts.js similarity index 56% rename from polemarch/static/js/pmHosts.js rename to frontend_src/hosts.js index 187bf57a..75f74e50 100644 --- a/polemarch/static/js/pmHosts.js +++ b/frontend_src/hosts.js @@ -1,10 +1,11 @@ +const path_pk_key = spa.utils.path_pk_key; /** * Function, that adds signal, that sets 'owner' field's property 'readOnly' equal to true. * @param {string} model Name of model. */ function addSignalOwnerReadOnly(model) { - tabSignal.connect("models[" + model + "].fields.beforeInit", (fields) => { - if(fields.owner) { + tabSignal.connect('models[' + model + '].fields.beforeInit', (fields) => { + if (fields.owner) { fields.owner.readOnly = true; } }); @@ -15,7 +16,9 @@ function addSignalOwnerReadOnly(model) { * options of those should be changed in the tabSignal. */ const host_paths = [ - '/host/', '/group/{' + path_pk_key + '}/host/', '/inventory/{' + path_pk_key + '}/host/', + '/host/', + '/group/{' + path_pk_key + '}/host/', + '/inventory/{' + path_pk_key + '}/host/', '/inventory/{' + path_pk_key + '}/group/{group_id}/host/', '/project/{' + path_pk_key + '}/inventory/{inventory_id}/host/', ]; @@ -23,16 +26,12 @@ const host_paths = [ /** * Changes 'type' filter type to 'choices'. */ -host_paths.forEach(path => { - tabSignal.connect("views[" + path + "].filters.beforeInit", filters => { - for(let key in filters) { - if(filters.hasOwnProperty(key)) { - let filter = filters[key]; - - if (filter.name == 'type') { - filter.type = 'choices'; - filter.enum = [''].concat(app.models.Host.fields.type.options.enum); - } +host_paths.forEach((path) => { + tabSignal.connect('views[' + path + '].filters.beforeInit', (filters) => { + for (let filter of Object.values(filters)) { + if (filter.name == 'type') { + filter.type = 'choices'; + filter.enum = [''].concat(app.models.Host.fields.type.options.enum); } } }); @@ -47,13 +46,17 @@ host_paths.forEach(path => { * Signal, that creates views for paths, which do not exist in API: * - /inventory/{pk}/group/{group_id}/host/ and all paths, that nested in /group/{pk}/host/ path. */ -tabSignal.connect('allViews.inited', obj => { +tabSignal.connect('allViews.inited', (obj) => { let views = obj.views; let prefix = '/inventory/{' + path_pk_key + '}'; - let constr = new SubViewWithOutApiPathConstructor(openapi_dictionary, app.models, {prefix: prefix}); - let group_host_paths = Object.keys(views).filter(path => path.indexOf( "/group/{" + path_pk_key + "}/host/") == 0); + let constr = new spa.views.SubViewWithOutApiPathConstructor(spa.api.openapi_dictionary, app.models, { + prefix: prefix, + }); + let group_host_paths = Object.keys(views).filter( + (path) => path.indexOf('/group/{' + path_pk_key + '}/host/') == 0, + ); - group_host_paths.forEach(path => { + group_host_paths.forEach((path) => { let new_path = prefix + path.replace('{' + path_pk_key + '}', '{group_id}'); let new_view = constr.generateSubView(views, path, new_path); views[new_path] = new_view; @@ -64,15 +67,21 @@ tabSignal.connect('allViews.inited', obj => { * Signal, that creates views for paths, which do not exist in API: * - /project/{pk}/inventory/{inventory_id}/group/{group_id}/host/ and all paths, that nested in /group/{pk}/host/ path. */ -tabSignal.connect('allViews.inited', obj => { +tabSignal.connect('allViews.inited', (obj) => { let views = obj.views; let prefix = '/project/{' + path_pk_key + '}/inventory/{inventory_id}'; - let constr = new SubViewWithOutApiPathConstructor(openapi_dictionary, app.models, {prefix: prefix}); - let group_host_paths = Object.keys(views).filter(path => path.indexOf( "/group/{" + path_pk_key + "}/host/") == 0); + let constr = new spa.views.SubViewWithOutApiPathConstructor(spa.api.openapi_dictionary, app.models, { + prefix: prefix, + }); + let group_host_paths = Object.keys(views).filter( + (path) => path.indexOf('/group/{' + path_pk_key + '}/host/') == 0, + ); - group_host_paths.forEach(path => { + group_host_paths.forEach((path) => { let new_path = prefix + path.replace('{' + path_pk_key + '}', '{group_id}'); let new_view = constr.generateSubView(views, path, new_path); views[new_path] = new_view; }); -}); \ No newline at end of file +}); + +export { addSignalOwnerReadOnly }; diff --git a/polemarch/static/js/pmInventories.js b/frontend_src/inventories.js similarity index 69% rename from polemarch/static/js/pmInventories.js rename to frontend_src/inventories.js index 08e1ebd7..67239ae6 100644 --- a/polemarch/static/js/pmInventories.js +++ b/frontend_src/inventories.js @@ -1,8 +1,8 @@ /** * Changes options of InventoryImport Model's fields. */ -tabSignal.connect("models[InventoryImport].fields.beforeInit", fields => { +tabSignal.connect('models[InventoryImport].fields.beforeInit', (fields) => { fields.inventory_id.hidden = true; fields.raw_data.format = 'file'; fields.raw_data.title = 'Inventory file'; -}); \ No newline at end of file +}); diff --git a/frontend_src/main.js b/frontend_src/main.js new file mode 100644 index 00000000..d5ec0f83 --- /dev/null +++ b/frontend_src/main.js @@ -0,0 +1,18 @@ +import Logo from './Logo.vue'; +spa.globalComponentsRegistrator.add(Logo); + +import './customizer.js'; +import './common.js'; +import './fields'; +import * as hosts from './hosts.js'; +import './inventories'; +import './projects'; +import * as history from './history'; +import * as projects from './projects.js'; +import * as tasks from './tasks.js'; +import * as users from './users.js'; +import * as dashboard from './dashboard'; + +export { hosts, history, projects, tasks, users, dashboard }; + +import './polemarch-gui.css'; diff --git a/polemarch/static/css/polemarch-gui.css b/frontend_src/polemarch-gui.css similarity index 78% rename from polemarch/static/css/polemarch-gui.css rename to frontend_src/polemarch-gui.css index cb5330d9..61e4a3fc 100644 --- a/polemarch/static/css/polemarch-gui.css +++ b/frontend_src/polemarch-gui.css @@ -1,4 +1,5 @@ -.pt-enabled, .hook-enable { +.pt-enabled, +.hook-enable { font-weight: bold; text-align: center; vertical-align: middle; @@ -10,14 +11,12 @@ } @media (max-width: 1200px) { - .add-existing-item { margin-right: 0px; margin-top: 10px; } } - @media (min-width: 1200px) { .readme_content img { max-width: 60%; @@ -25,13 +24,15 @@ } } -.td-history-start_time, .td-history-stop_time, -.td-project_history-start_time, .td-project_history-stop_time{ - width:180px; +.td-history-start_time, +.td-history-stop_time, +.td-project_history-start_time, +.td-project_history-stop_time { + width: 180px; } .td-history-status, -.td-project_history-status{ +.td-project_history-status { width: 140px; } @@ -113,12 +114,10 @@ @media (max-width: 480px) { .td-hook-type, - .td-group-children, .td-inventory_group-children, .td-project_group-children, .td-project_inventory_group-children, - .td-host-type, .td-group_host-type, .td-inventory_host-type, @@ -160,20 +159,19 @@ body { --chart-axes-lines-color: efefef; } - .gui-skin-dark { - --history-status-ok: #56E401; - --history-status-error: #F61328; - --history-status-interrupted: #B68CF3; - --history-status-delay: #DBEA10; - --history-status-offline: #90C1C0; - --history-status-run: #00D7FF; - - --project-status-new: #D48CCA; - --project-status-error: #F61328; - --project-status-ok: #56E401; - --project-status-wait-sync: #00D7FF; - --project-status-sync: #FF9600; + --history-status-ok: #56e401; + --history-status-error: #f61328; + --history-status-interrupted: #b68cf3; + --history-status-delay: #dbea10; + --history-status-offline: #90c1c0; + --history-status-run: #00d7ff; + + --project-status-new: #d48cca; + --project-status-error: #f61328; + --project-status-ok: #56e401; + --project-status-wait-sync: #00d7ff; + --project-status-sync: #ff9600; --chart-legend-text-color: #cccccc; --chart-axes-text-color: #cccccc; @@ -204,7 +202,7 @@ body { color: var(--history-status-ok); } -.project-status{ +.project-status { font-weight: bold; text-align: center; vertical-align: middle; @@ -252,59 +250,49 @@ body { } } -.stdout-line .S{color:red}/* red - lines */ -.stdout-line .func{color:blue}/* blue - user-functions */ -.stdout-line .C{color:orange}/* comments - orange */ -.stdout-line .kwrd{font-weight:bold}/* bold - keywords */ -.stdout-line .R{color:gray} /* grey - regexps */ -.stdout-line.fatal{ +.stdout-line .S { + color: red; +} /* red - lines */ +.stdout-line .func { + color: blue; +} /* blue - user-functions */ +.stdout-line .C { + color: orange; +} /* comments - orange */ +.stdout-line .kwrd { + font-weight: bold; +} /* bold - keywords */ +.stdout-line .R { + color: gray; +} /* grey - regexps */ +.stdout-line.fatal { background: #ffe7e7; } -.history-stdout{ - overflow: auto; - max-height: calc(100vh - 338px); - min-height: 400px; - background: #000; - padding-left: 15px; - padding-right: 15px; - font-weight: normal!important; -} - -@media (min-width: 767px) { - .history-stdout{ - max-height: calc(100vh - 414px); - } -} - - -.history-mode.history-fullsize .history-LeftInfo{ +.history-mode.history-fullsize .history-LeftInfo { width: 100%; } -.history-mode.history-fullsize .history-RightInfo{ +.history-mode.history-fullsize .history-RightInfo { display: none; } -.history-mode .history-LeftInfo .btn-history-resize .fa-expand{ +.history-mode .history-LeftInfo .btn-history-resize .fa-expand { display: block; } -.history-mode.history-fullsize .history-LeftInfo .btn-history-resize .fa-expand{ +.history-mode.history-fullsize .history-LeftInfo .btn-history-resize .fa-expand { display: none; } - - -.history-mode .history-LeftInfo .btn-history-resize .fa-compress{ +.history-mode .history-LeftInfo .btn-history-resize .fa-compress { display: none; } -.history-mode.history-fullsize .history-LeftInfo .btn-history-resize .fa-compress{ +.history-mode.history-fullsize .history-LeftInfo .btn-history-resize .fa-compress { display: block; } - .text-logo { margin-left: auto; width: 165px; @@ -326,7 +314,7 @@ body { .chart-period-select { width: 100%; - height: 30px!important; + height: 30px !important; line-height: 30px; padding: 3px 12px; display: inline-block; @@ -335,17 +323,17 @@ body { @media (max-width: 540px) { #period-list { - width: 100%!important; + width: 100% !important; margin-top: 10px; } .chart-period-select-wrapper { margin-right: 0; } - } -.guifield-one_history_boolean .boolean-true, .guifield-one_history_boolean .boolean-false{ +.guifield-one_history_boolean .boolean-true, +.guifield-one_history_boolean .boolean-false { font-size: 24px; } @@ -368,4 +356,4 @@ body { .details .form-group { margin-bottom: 0; -} \ No newline at end of file +} diff --git a/frontend_src/projects.js b/frontend_src/projects.js new file mode 100644 index 00000000..a73b1bd5 --- /dev/null +++ b/frontend_src/projects.js @@ -0,0 +1,243 @@ +import ProjectPageAdditional from './ProjectPageAdditional.vue'; +const path_pk_key = spa.utils.path_pk_key; + +/** + * Function - that forms onchange callback of dynamic field - AnsibleModule.fields.group/AnsiblePlaybook.fields.limit. + */ +function ExecuteModulePlaybook_group_limit_callback() { + let previous_inventory; + let previous_format; + + /** + * Function - onchange callback of dynamic field - AnsibleModule.fields.group/AnsiblePlaybook.fields.limit. + * @param {object} parent_values Values of parent fields. + */ + return function (parent_values = {}) { + let inventory = parent_values.inventory; + + if (inventory && typeof inventory == 'object' && inventory.value !== undefined) { + inventory = inventory.value; + } + + let save_value = false; + + if (previous_inventory === undefined || previous_inventory == inventory) { + save_value = true; + } + + previous_inventory = inventory; + + if (inventory && !isNaN(Number(inventory))) { + let format = 'group_autocomplete'; + + if (previous_format && previous_format != format) { + save_value = false; + } + + previous_format = format; + + return { + format: format, + default: 'all', + additionalProperties: { + list_paths: [ + '/project/{' + path_pk_key + '}/inventory/{inventory_id}/all_groups/', + '/project/{' + path_pk_key + '}/inventory/{inventory_id}/all_hosts/', + ], + value_field: 'name', + view_field: 'name', + url_params: { inventory_id: inventory }, + }, + save_value: save_value, + }; + } else { + let format = 'autocomplete'; + + if (previous_format && previous_format != format) { + save_value = false; + } + + previous_format = format; + + return { + format: 'autocomplete', + default: 'all', + save_value: save_value, + }; + } + }; +} + +/** + * Function, that connects to the signal, in that some manipulations with model's fields should be made. + * This function is supposed to be called for AnsibleModule and AnsiblePlaybook models. + * @param {string} model Name of model. + */ +function ansiblePlaybookAndAnsibleModuleModelsFieldsHandler(model) { + tabSignal.connect(`models[${model}].fields.beforeInit`, (fields) => { + fields.inventory.format = 'inventory_autocomplete'; + + let prop; + let type_props = ['module', 'playbook']; + + type_props.forEach((item) => { + if (model.toLowerCase().indexOf(item) !== -1) { + prop = item; + } + }); + + if (fields[prop]) { + fields[prop].format = prop + '_autocomplete'; + } + + if (fields[prop] && fields[prop].additionalProperties && prop == 'playbook') { + fields[prop].additionalProperties.view_field = 'playbook'; + } + + let group_props = ['group', 'limit']; + + group_props.forEach((prop) => { + if (fields[prop]) { + fields[prop].format = 'dynamic'; + fields[prop].additionalProperties = { + field: ['inventory'], + callback: ExecuteModulePlaybook_group_limit_callback(), + }; + } + }); + }); +} + +spa.globalComponentsRegistrator.add(ProjectPageAdditional); + +/** + * Mixin for '/project/{pk}/' view. + */ +const project_pk_mixin = { + watch: { + hasPolemarchYamlForm: function (value) { + if (value && this.card_collapsed == false && this.card_collapsed_button == false) { + this.card_collapsed = true; + this.card_collapsed_button = true; + } + }, + }, + computed: { + hasPolemarchYamlForm() { + let instance = this.data.instance; + + if (instance && instance.data && instance.data.execute_view_data) { + return true; + } + + return false; + }, + + content_additional() { + if (this.hasPolemarchYamlForm) { + return ProjectPageAdditional.name; + } + }, + }, +}; + +/** + * Variable, that stores names of models, connected with project. + * This is needed for easy redefinition in EE version. + */ +let project_connected_models_dict = { + module: 'AnsibleModule', + playbook: 'AnsiblePlaybook', +}; + +tabSignal.connect('views[/project/{' + path_pk_key + '}/].afterInit', (obj) => { + obj.view.mixins = obj.view.mixins.concat(project_pk_mixin); +}); + +tabSignal.connect('models[OneProject].fields.beforeInit', (fields) => { + fields.execute_view_data.format = 'hidden'; +}); + +tabSignal.connect('models[OneModule].fields.beforeInit', (fields) => { + fields.data.format = 'ansible_json'; +}); + +/** + * Function, that adds signals to the AnsibleModule and AnsiblePlaybook models. + */ +function addSignalsForAnsibleModuleAndAnsiblePlaybookModels() { + Object.entries(project_connected_models_dict) + .map((item) => { + if (['module', 'playbook'].includes(item[0])) { + return item[1]; + } + }) + .forEach(ansiblePlaybookAndAnsibleModuleModelsFieldsHandler); +} + +addSignalsForAnsibleModuleAndAnsiblePlaybookModels(); + +/** + * Changes 'status' filter type to 'choices'. + */ +tabSignal.connect('views[/project/].filters.beforeInit', (filters) => { + for (let filter of Object.values(filters)) { + if (filter.name == 'status' || filter.name == 'status__not') { + filter.type = 'choices'; + filter.enum = [''].concat(app.models.Project.fields.status.options.enum); + } + } +}); + +/** + * Variable, that stores pairs (key, value), where: + * - key - value of the 'key' field of ProjectVariable model; + * - value - value of the 'value' field of ProjectVariable model. + */ +const ProjectVariable_value_from_key = { + ci_template: { + additionalProperties: { + list_paths: ['/project/{' + path_pk_key + '}/template/'], + view_field: 'name', + value_field: 'id', + }, + }, +}; + +/** + * Function - onchange callback of dynamic field - ProjectVariable.fields.value. + * @param {object} parent_values Values of parent fields. + */ +function ProjectVariable_value_callback(parent_values = {}) { + if (parent_values.key && Object.keys(ProjectVariable_value_from_key).includes(parent_values.key)) { + return ProjectVariable_value_from_key[parent_values.key]; + } + + return {}; +} + +/** + * Adds callback for dynamic 'value' field of ProjectVariable model. + */ +tabSignal.connect('models[ProjectVariable].fields.beforeInit', (fields) => { + if (fields.value && fields.value.additionalProperties) { + fields.value.additionalProperties.callback = ProjectVariable_value_callback; + } +}); + +/** + * Hides 'pb_filter' filter on the playbook list view. + */ +tabSignal.connect(`views[/project/{${path_pk_key}}/playbook/].filters.beforeInit`, (filters) => { + for (let filter of Object.values(filters)) { + if (filter.name == 'pb_filter') { + filter.hidden = true; + } + } +}); + +export { + project_connected_models_dict, + addSignalsForAnsibleModuleAndAnsiblePlaybookModels, + ProjectVariable_value_from_key, +}; diff --git a/polemarch/static/js/pmPeriodicTasks.js b/frontend_src/tasks.js similarity index 55% rename from polemarch/static/js/pmPeriodicTasks.js rename to frontend_src/tasks.js index a6b587ab..059c934d 100644 --- a/polemarch/static/js/pmPeriodicTasks.js +++ b/frontend_src/tasks.js @@ -1,11 +1,18 @@ +import { + OneTemplateVariable_key_callback, + OneTemplateVariable_value_callback, + template_vars, +} from './templates.js'; +const path_pk_key = spa.utils.path_pk_key; + /** * Function - onchange callback of dynamic field - OnePeriodictask.fields.inventory. * @param {object} parent_values Values of parent fields. */ -function OnePeriodictask_inventory_callback(parent_values={}) { +function OnePeriodictask_inventory_callback(parent_values = {}) { let kind = parent_values.kind; - if(kind && (kind.toLowerCase() == "playbook" || kind.toLowerCase() == "module")) { + if (kind && (kind.toLowerCase() == 'playbook' || kind.toLowerCase() == 'module')) { return { format: 'inventory_autocomplete', additionalProperties: { @@ -22,14 +29,14 @@ function OnePeriodictask_inventory_callback(parent_values={}) { * Function - onchange callback of dynamic field - OnePeriodictask.fields.mode. * @param {object} parent_values Values of parent fields. */ -function OnePeriodictask_mode_callback(parent_values={}) { +function OnePeriodictask_mode_callback(parent_values = {}) { let kind = parent_values.kind; - if(kind) { + if (kind) { kind = kind.toLowerCase(); } - if(kind == "playbook") { + if (kind == 'playbook') { return { format: 'playbook_autocomplete', additionalProperties: { @@ -39,7 +46,7 @@ function OnePeriodictask_mode_callback(parent_values={}) { }, required: true, }; - } else if(kind == "module") { + } else if (kind == 'module') { return { format: 'module_autocomplete', additionalProperties: { @@ -57,14 +64,14 @@ function OnePeriodictask_mode_callback(parent_values={}) { * Function - onchange callback of dynamic field - OnePeriodictask.fields.template. * @param {object} parent_values Values of parent fields. */ -function OnePeriodictask_template_callback(parent_values={}) { +function OnePeriodictask_template_callback(parent_values = {}) { let kind = parent_values.kind; - if(kind) { + if (kind) { kind = kind.toLowerCase(); } - if(kind == 'template') { + if (kind == 'template') { return { format: 'fk', additionalProperties: { @@ -95,10 +102,10 @@ function OnePeriodictask_template_opt_callback() { * Function - onchange callback of dynamic field - OnePeriodictask.fields.template_opt. * @param {object} parent_values Values of parent fields. */ - return function(parent_values) { + return function (parent_values) { let kind = parent_values.kind; - if(kind && kind.toLowerCase() !== 'template') { + if (kind && kind.toLowerCase() !== 'template') { return { format: 'hidden', }; @@ -106,26 +113,26 @@ function OnePeriodictask_template_opt_callback() { let template = parent_values.template; - if(template && typeof template == 'object' && template.value !== undefined) { + if (template && typeof template == 'object' && template.value !== undefined) { template = template.value; } let save_value = false; - if(previous_template === undefined || previous_template == template) { + if (previous_template === undefined || previous_template == template) { save_value = true; } previous_template = template; - if(template) { + if (template) { return { format: 'fk', additionalProperties: { view_field: 'name', value_field: 'name', list_paths: ['/project/{' + path_pk_key + '}/template/{template_id}/option/'], - url_params: {template_id: template}, + url_params: { template_id: template }, }, save_value: save_value, }; @@ -139,11 +146,11 @@ function OnePeriodictask_template_opt_callback() { //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for PERIODIC TASK entity //////////////////////////////////////////////////////////////////////////////////// -['Periodictask','OnePeriodictask'].forEach(model => { - let str = "models[{0}].fields.beforeInit".format([model]); - tabSignal.connect(str, (fields => { - if(model == 'Periodictask') { - ['mode', 'inventory', 'template', 'template_opt'].forEach(field => { +['Periodictask', 'OnePeriodictask'].forEach((model) => { + let str = 'models[{0}].fields.beforeInit'.format([model]); + tabSignal.connect(str, (fields) => { + if (model == 'Periodictask') { + ['mode', 'inventory', 'template', 'template_opt'].forEach((field) => { fields[field].hidden = true; }); } @@ -160,19 +167,19 @@ function OnePeriodictask_template_opt_callback() { }; fields.template_opt.additionalProperties.field = ['template']; - fields.template_opt.additionalProperties.types.TEMPLATE = "fk"; + fields.template_opt.additionalProperties.types.TEMPLATE = 'fk'; fields.template_opt.additionalProperties.callback = OnePeriodictask_template_opt_callback(); fields.schedule.additionalProperties.types.INTERVAL = 'uptime'; - })); + }); }); /** * Changes 'kind' filter type to 'choices'. */ -tabSignal.connect("views[/project/{" + path_pk_key + "}/periodic_task/].filters.beforeInit", filters => { - for(let key in filters) { - if(filters.hasOwnProperty(key)) { +tabSignal.connect('views[/project/{' + path_pk_key + '}/periodic_task/].filters.beforeInit', (filters) => { + for (let key in filters) { + if (filters.hasOwnProperty(key)) { let filter = filters[key]; if (filter.name == 'kind') { @@ -186,22 +193,23 @@ tabSignal.connect("views[/project/{" + path_pk_key + "}/periodic_task/].filters. /** * Hides 'variables' button from periodic_task views, where data.kind == 'TEMPLATE'. */ -tabSignal.connect('allViews.inited', obj => { +tabSignal.connect('allViews.inited', (obj) => { let views = obj.views; [ '/project/{' + path_pk_key + '}/periodic_task/', '/project/{' + path_pk_key + '}/periodic_task/{periodic_task_id}/', - ].forEach(path => { - views[path].getViewSublinkButtons = function(type, buttons, instance) { /* jshint unused: false */ + ].forEach((path) => { + views[path].getViewSublinkButtons = function (type, buttons, instance) { + /* jshint unused: false */ let data = instance.data; let btns = $.extend(true, {}, buttons); - if(!data) { + if (!data) { return btns; } - if(data.kind == 'TEMPLATE' && btns.variables) { + if (data.kind == 'TEMPLATE' && btns.variables) { btns.variables.hidden = true; } @@ -213,14 +221,14 @@ tabSignal.connect('allViews.inited', obj => { // EndBlock of extensions for PERIODIC TASK entity //////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for PERIODIC TASK VARIABLE entity //////////////////////////////////////////////////////////////////////////////////// /** * Model class for OnePeriodicTaskVariable model. */ -guiModels.OnePeriodicTaskVariableModel = class OnePeriodicTaskVariableModel extends guiModels.Model { +spa.models.guiModels.OnePeriodicTaskVariableModel = class OnePeriodicTaskVariableModel extends spa.models + .Model { /** * Redefinition of guiModels.Model class's 'constructor'. */ @@ -230,86 +238,93 @@ guiModels.OnePeriodicTaskVariableModel = class OnePeriodicTaskVariableModel exte this.view_name = 'key'; } - save(method="patch") { - return this.queryset.getParentInstance().then(parent_instance => { - let instance_data = this.toInner(this.data); + save(method = 'patch') { + return this.queryset + .getParentInstance() + .then((parent_instance) => { + let instance_data = this.toInner(this.data); - delete instance_data.kind; - delete instance_data.inventory; + delete instance_data.kind; + delete instance_data.inventory; - return this.queryset.formQueryAndSend(method, instance_data).then(response => { - return this.queryset.model.getInstance( - this.queryset._formInstanceData( - parent_instance.data, response.data, - ), - this.queryset, - ); + return this.queryset.formQueryAndSend(method, instance_data).then((response) => { + return this.queryset.model.getInstance( + this.queryset._formInstanceData(parent_instance.data, response.data), + this.queryset, + ); + }); + }) + .catch((error) => { + debugger; + throw error; }); - }).catch(error => { - debugger; - throw error; - }); } }; /** * QuerySet class for OnePeriodicTaskVariable model's QuerySet. */ -guiQuerySets.OnePeriodicTaskVariableQuerySet = class OnePeriodicTaskVariableQuerySet extends guiQuerySets.QuerySet { +spa.querySet.guiQuerySets.OnePeriodicTaskVariableQuerySet = class OnePeriodicTaskVariableQuerySet extends spa + .querySet.QuerySet { /** * Method, that returns data_type for parent instance bulk requests. */ getParentInstanceDataType() { - return this.url.replace(/^\/|\/$/g, "") - .replace(/\/variables([A-z,0-9,_,\/]*)$/, "").split("/"); + return this.url + .replace(/^\/|\/$/g, '') + .replace(/\/variables([A-z,0-9,_,\/]*)$/, '') + .split('/'); } /** * Method, that returns promise, that returns parent instance. */ getParentInstance() { - if(this.parent_instance) { + if (this.parent_instance) { return Promise.resolve(this.parent_instance); } let bulk = { - data_type: this.getParentInstanceDataType(), + path: this.getParentInstanceDataType(), method: 'get', }; - return this.sendQuery(bulk).then(response => { - this.parent_instance = app.models.OnePeriodictask.getInstance( - response.data, - this.clone({url: this.url.replace(/\/variables([A-z,0-9,_,\/]*)$/, "") }), - ); - return this.parent_instance; - }).catch(error => { - debugger; - throw error; - }); + return this.sendQuery(bulk) + .then((response) => { + this.parent_instance = app.models.OnePeriodictask.getInstance( + response.data, + this.clone({ url: this.url.replace(/\/variables([A-z,0-9,_,\/]*)$/, '') }), + ); + return this.parent_instance; + }) + .catch((error) => { + debugger; + throw error; + }); } /** * Redefinition of 'get' method of guiQuerySets.QuerySet class. */ get() { - if(this.cache) { + if (this.cache) { return Promise.resolve(this.cache); } - return this.getParentInstance().then(parent_instance => { - return this.formQueryAndSend('get').then(response => { - let instance = this.model.getInstance( - this._formInstanceData(parent_instance.data, response.data), - this, - ); + return this.getParentInstance() + .then((parent_instance) => { + return this.formQueryAndSend('get').then((response) => { + let instance = this.model.getInstance( + this._formInstanceData(parent_instance.data, response.data), + this, + ); - this.cache = instance; - return instance; + this.cache = instance; + return instance; + }); + }) + .catch((error) => { + debugger; + throw error; }); - - }).catch(error => { - debugger; - throw error; - }); } /** * Method, that returns periodic task variable data object. @@ -318,9 +333,7 @@ guiQuerySets.OnePeriodicTaskVariableQuerySet = class OnePeriodicTaskVariableQuer * @private */ _formInstanceData(parent_data, instance_data) { - return Object.assign( - {}, instance_data, {kind: parent_data.kind, inventory: parent_data.inventory}, - ); + return Object.assign({}, instance_data, { kind: parent_data.kind, inventory: parent_data.inventory }); } }; @@ -329,21 +342,22 @@ tabSignal.connect('openapi.loaded', (openapi) => { openapi.definitions.OnePeriodicTaskVariable = copy; - let list = openapi.paths['/project/{' + path_pk_key + '}/periodic_task/{periodic_task_id}/variables/']; - list.post.parameters[0].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - list.post.responses[201].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - - let page = openapi.paths['/project/{' + path_pk_key + '}/periodic_task/{periodic_task_id}/variables/{variables_id}/']; - page.get.responses[200].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - page.patch.responses[200].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - page.put.responses[200].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - page.patch.parameters[0].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - page.put.parameters[0].schema.$ref = "#/definitions/OnePeriodicTaskVariable"; - + list.post.parameters[0].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + list.post.responses[201].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + + let page = + openapi.paths[ + '/project/{' + path_pk_key + '}/periodic_task/{periodic_task_id}/variables/{variables_id}/' + ]; + page.get.responses[200].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + page.patch.responses[200].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + page.put.responses[200].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + page.patch.parameters[0].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; + page.put.parameters[0].schema.$ref = '#/definitions/OnePeriodicTaskVariable'; }); -tabSignal.connect("models[OnePeriodicTaskVariable].fields.beforeInit", function(fields) { +tabSignal.connect('models[OnePeriodicTaskVariable].fields.beforeInit', function (fields) { fields.kind = { title: 'Kind', type: 'hidden', @@ -359,44 +373,52 @@ tabSignal.connect("models[OnePeriodicTaskVariable].fields.beforeInit", function( fields.key.format = 'dynamic'; fields.key.additionalProperties = { field: ['kind'], - callback: OneTemplateVariable_key_callback, /* globals OneTemplateVariable_key_callback */ + callback: OneTemplateVariable_key_callback, }; fields.value.format = 'dynamic'; fields.value.additionalProperties = { field: ['inventory', 'key'], - types: template_vars.value.types, /* globals template_vars */ - callback: OneTemplateVariable_value_callback(), /* globals OneTemplateVariable_value_callback */ + types: template_vars.value.types, + callback: OneTemplateVariable_value_callback(), }; }); -tabSignal.connect("views[/project/{" + path_pk_key + "}/periodic_task/{periodic_task_id}/variables/new/].afterInit", (obj) => { - obj.view.mixins = obj.view.mixins.concat({ - methods: { - fetchData() { - this.initLoading(); - let qs = this.setAndGetQuerySetFromSandBox(this.view, this.qs_url); - qs.getParentInstance().then(parent_instance => { - this.data.instance = qs.cache = qs.model.getInstance( - this._formInstanceData(parent_instance), qs, - ); - this.setLoadingSuccessful(); - this.getParentInstancesForPath(); - }).catch(error => { - debugger; - throw error; - }); - }, +tabSignal.connect( + 'views[/project/{' + path_pk_key + '}/periodic_task/{periodic_task_id}/variables/new/].afterInit', + (obj) => { + obj.view.mixins = obj.view.mixins.concat({ + methods: { + fetchData() { + this.initLoading(); + let qs = this.setAndGetQuerySetFromSandBox(this.view, this.qs_url); + qs.getParentInstance() + .then((parent_instance) => { + this.data.instance = qs.cache = qs.model.getInstance( + this._formInstanceData(parent_instance), + qs, + ); + this.setLoadingSuccessful(); + this.getParentInstancesForPath(); + }) + .catch((error) => { + debugger; + throw error; + }); + }, - _formInstanceData(parent_instance) { - return { - kind: parent_instance.data.kind, - inventory: parent_instance.data.inventory, - }; + _formInstanceData(parent_instance) { + return { + kind: parent_instance.data.kind, + inventory: parent_instance.data.inventory, + }; + }, }, - }, - }); -}); + }); + }, +); //////////////////////////////////////////////////////////////////////////////////// // EndBlock of extensions for PERIODIC TASK VARIABLE entity -//////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////// + +export { OnePeriodictask_template_opt_callback }; diff --git a/polemarch/static/js/pmTemplates.js b/frontend_src/templates.js similarity index 58% rename from polemarch/static/js/pmTemplates.js rename to frontend_src/templates.js index 8012ce6c..310856d1 100644 --- a/polemarch/static/js/pmTemplates.js +++ b/frontend_src/templates.js @@ -1,3 +1,8 @@ +import { project_connected_models_dict } from './projects.js'; +const path_pk_key = spa.utils.path_pk_key; +const guiModels = spa.models.guiModels; +const guiQuerySets = spa.querySet.guiQuerySets; + /** * Variable, that stores properties for callbacks of OneTemplateVariable dynamic fields. */ @@ -10,220 +15,229 @@ const template_vars = { * Mixin for template sublinks' Model classes. * @param Class_name */ -const template_sublink_model_mixin = (Class_name) => class extends Class_name { - /** - * Redefinition of 'save' method of guiModels.Model class. - */ - save(method="patch") { /* jshint unused: false */ - return this.queryset.getTemplateInstance().then(template_instance => { - this._onSave(template_instance.data, this.toInner(this.data)); - - return this.queryset.formQueryAndSend('patch', template_instance.data).then(response => { /* jshint unused: false */ - return this.queryset.model.getInstance( - this.queryset._formInstanceData( - template_instance.data, this.getPkValue(), - ), - this.queryset, - ); - }); - }).catch(error => { - debugger; - throw error; - }); - } - /** - * Method - 'save' method callback. - * @param {object} template_data Template instance data. - * @param {object} instance_data Instance data. - * @private - */ - _onSave(template_data, instance_data) {} /* jshint unused: false */ - /** - * Redefinition of 'delete' method of guiModels.Model class. - */ - delete() { - return this.queryset.getTemplateInstance().then(template_instance => { - this._onDelete(template_instance.data); +const template_sublink_model_mixin = (Class_name) => + class extends Class_name { + /** + * Redefinition of 'save' method of guiModels.Model class. + */ + save(method = 'patch') { + /* jshint unused: false */ + return this.queryset + .getTemplateInstance() + .then((template_instance) => { + this._onSave(template_instance.data, this.toInner(this.data)); + + return this.queryset + .formQueryAndSend('patch', template_instance.data) + .then((response) => { + /* jshint unused: false */ + return this.queryset.model.getInstance( + this.queryset._formInstanceData(template_instance.data, this.getPkValue()), + this.queryset, + ); + }); + }) + .catch((error) => { + debugger; + throw error; + }); + } + /** + * Method - 'save' method callback. + * @param {object} template_data Template instance data. + * @param {object} instance_data Instance data. + * @private + */ + _onSave(template_data, instance_data) {} /* jshint unused: false */ + /** + * Redefinition of 'delete' method of guiModels.Model class. + */ + delete() { + return this.queryset.getTemplateInstance().then((template_instance) => { + this._onDelete(template_instance.data); - return this.queryset.formQueryAndSend('patch', template_instance.data).then(response => { - return response; + return this.queryset.formQueryAndSend('patch', template_instance.data).then((response) => { + return response; + }); }); - }); - } - /** - * Method - 'delete' method callback. - * @param {object} template_data Template instance data. - * @private - */ - _onDelete(template_data) {} /* jshint unused: false */ -}; + } + /** + * Method - 'delete' method callback. + * @param {object} template_data Template instance data. + * @private + */ + _onDelete(template_data) {} /* jshint unused: false */ + }; /** * Mixin for template sublinks' QuerySet classes. * @param Class_name */ -const template_sublink_qs_mixin = (Class_name) => class extends Class_name { - /** - * Redefinition of 'makeQueryString' method of guiQuerySets.QuerySet class. - */ - makeQueryString(query = this.query){ - let filters = []; - let allowed_filters = ['limit']; - for(let key in query) { - if(!allowed_filters.includes(key)) { - continue; +const template_sublink_qs_mixin = (Class_name) => + class extends Class_name { + /** + * Redefinition of 'makeQueryString' method of guiQuerySets.QuerySet class. + */ + makeQueryString(query = this.query) { + let filters = []; + let allowed_filters = ['limit']; + for (let key in query) { + if (!allowed_filters.includes(key)) { + continue; + } + filters.push([key, query[key]].join('=')); } - filters.push([key, query[key]].join('=')); + return filters.join('&'); } - return filters.join("&"); - } - /** - * Redefinition of 'items' method of guiQuerySets.QuerySet class. - */ - items() { - if(this.cache){ - return Promise.resolve(this.cache); - } - return this.formQueryAndSend('get').then(response => { - let data = response.data; - this.template_instance = app.models.OneTemplate.getInstance( - data, this.clone(), - ); - - let instances = this._formInstances(data); - - if(instances.length == 0) { - this.api_count = 0; - this.cache = instances; - return instances; + /** + * Redefinition of 'items' method of guiQuerySets.QuerySet class. + */ + items() { + if (this.cache) { + return Promise.resolve(this.cache); } + return this.formQueryAndSend('get') + .then((response) => { + let data = response.data; + this.template_instance = app.models.OneTemplate.getInstance(data, this.clone()); - let filtered = this._getFilteredInstances(instances); + let instances = this._formInstances(data); - instances = filtered.filtered_instances; - this.api_count = filtered.api_count; - this.cache = instances; - return instances; - }).catch(error => { - debugger; - throw error; - }); - } - /** - * Redefinition of 'get' method of guiQuerySets.QuerySet class. - */ - get() { - if(this.cache) { - return Promise.resolve(this.cache); - } - return this.getTemplateInstance(true).then(template_instance => { - let inst_name = this.url.split("/").last; + if (instances.length == 0) { + this.api_count = 0; + this.cache = instances; + return instances; + } + + let filtered = this._getFilteredInstances(instances); - if(!this._instanceExists(template_instance, inst_name)) { - throw new StatusError(404, 'Instance was not found.'); + instances = filtered.filtered_instances; + this.api_count = filtered.api_count; + this.cache = instances; + return instances; + }) + .catch((error) => { + debugger; + throw error; + }); + } + /** + * Redefinition of 'get' method of guiQuerySets.QuerySet class. + */ + get() { + if (this.cache) { + return Promise.resolve(this.cache); } + return this.getTemplateInstance(true) + .then((template_instance) => { + let inst_name = this.url.split('/').last; - let instance = this.model.getInstance( - this._formInstanceData(template_instance.data, inst_name), - this.clone(), - ); + if (!this._instanceExists(template_instance, inst_name)) { + throw new spa.api.StatusError(404, 'Instance was not found.'); + } - this.cache = instance; - return instance; - }).catch(error => { - debugger; - throw error; - }); - } - /** - * Method, that returns promise, that returns parent template instance. - * @param {boolean} reload Means, that data should be updated or not. - */ - getTemplateInstance(reload=false) { - if(this.template_instance && !reload) { - return Promise.resolve(this.template_instance); + let instance = this.model.getInstance( + this._formInstanceData(template_instance.data, inst_name), + this.clone(), + ); + + this.cache = instance; + return instance; + }) + .catch((error) => { + debugger; + throw error; + }); } + /** + * Method, that returns promise, that returns parent template instance. + * @param {boolean} reload Means, that data should be updated or not. + */ + getTemplateInstance(reload = false) { + if (this.template_instance && !reload) { + return Promise.resolve(this.template_instance); + } - return this.formQueryAndSend('get').then(response => { - this.template_instance = app.models.OneTemplate.getInstance( - response.data, this.clone(), - ); - return this.template_instance; - }).catch(error => { - debugger; - throw error; - }); - } - /** - * Method, that filters instances and returns them and their api_count. - * @param {array} instances Array of instances objects. - * @private - */ - _getFilteredInstances(instances) { - let filters = this._getFilterNames(); - let filtered_instances = [ ...instances]; + return this.formQueryAndSend('get') + .then((response) => { + this.template_instance = app.models.OneTemplate.getInstance(response.data, this.clone()); + return this.template_instance; + }) + .catch((error) => { + debugger; + throw error; + }); + } + /** + * Method, that filters instances and returns them and their api_count. + * @param {array} instances Array of instances objects. + * @private + */ + _getFilteredInstances(instances) { + let filters = this._getFilterNames(); + let filtered_instances = [...instances]; - for(let filter in this.query) { - if(!filters.includes(filter)) { - continue; - } + for (let filter in this.query) { + if (!filters.includes(filter)) { + continue; + } - let filter_value = this.query[filter]; + let filter_value = this.query[filter]; - filtered_instances = filtered_instances.filter(instance => { - if(typeof instance.data[filter] == 'string') { - if(instance.data[filter].match(filter_value) != null) { - return instance; - } - } else { - if(typeof instance.data[filter] == 'boolean' && typeof filter_value == 'string') { - filter_value = stringToBoolean(filter_value); /* globals stringToBoolean */ - } + filtered_instances = filtered_instances.filter((instance) => { + if (typeof instance.data[filter] == 'string') { + if (instance.data[filter].match(filter_value) != null) { + return instance; + } + } else { + if (typeof instance.data[filter] == 'boolean' && typeof filter_value == 'string') { + filter_value = stringToBoolean(filter_value); /* globals stringToBoolean */ + } - if(instance.data[filter] == filter_value) { - return instance; + if (instance.data[filter] == filter_value) { + return instance; + } } - } - }); - } + }); + } - let api_count = filtered_instances.length; + let api_count = filtered_instances.length; - if(this.query.offset) { - filtered_instances.splice(0, this.query.offset); - } + if (this.query.offset) { + filtered_instances.splice(0, this.query.offset); + } - if(this.query.limit) { - filtered_instances = filtered_instances.splice(0, this.query.limit); - } + if (this.query.limit) { + filtered_instances = filtered_instances.splice(0, this.query.limit); + } - return {filtered_instances: filtered_instances, api_count: api_count}; - } - /** - * Method, that returns Array with names of allowed filters. - * @returns {array} - * @private - */ - _getFilterNames() { - return ['name']; - } -}; + return { filtered_instances: filtered_instances, api_count: api_count }; + } + /** + * Method, that returns Array with names of allowed filters. + * @returns {array} + * @private + */ + _getFilterNames() { + return ['name']; + } + }; /** * Function - that forms onchange callback of dynamic field - OneTemplate.fields.group. * @param {boolean} required Required field or not. */ -function OneTemplate_group_callback(required=false) { +function OneTemplate_group_callback(required = false) { let previous_inventory; - /** + /** * Function - onchange callback of dynamic field - OneTemplate.fields.group. * @param {object} parent_values Values of parent fields. */ - return function(parent_values={}) { + return function (parent_values = {}) { let kind = parent_values.kind; - if(kind && kind.toLowerCase() == 'task') { + if (kind && kind.toLowerCase() == 'task') { return { format: 'hidden', required: false, @@ -232,19 +246,19 @@ function OneTemplate_group_callback(required=false) { let inventory = parent_values.inventory; - if(inventory && typeof inventory == 'object' && inventory.value !== undefined) { + if (inventory && typeof inventory == 'object' && inventory.value !== undefined) { inventory = inventory.value; } let save_value = false; - if(previous_inventory === undefined || previous_inventory == inventory) { + if (previous_inventory === undefined || previous_inventory == inventory) { save_value = true; } previous_inventory = inventory; - if(inventory && !isNaN(Number(inventory))) { + if (inventory && !isNaN(Number(inventory))) { return { format: 'group_autocomplete', required: required, @@ -256,7 +270,7 @@ function OneTemplate_group_callback(required=false) { ], value_field: 'name', view_field: 'name', - url_params: {inventory_id: inventory}, + url_params: { inventory_id: inventory }, }, }; } else { @@ -273,24 +287,24 @@ function OneTemplate_group_callback(required=false) { * Function - that forms onchange callback of dynamic field - OneTemplate.fields.module. * @param {boolean} required Required field or not. */ -function OneTemplate_module_callback(required=false) { +function OneTemplate_module_callback(required = false) { /** * Function - onchange callback of dynamic field - OneTemplate.fields.module. * @param {object} parent_values Values of parent fields. */ - return function(parent_values={}) { + return function (parent_values = {}) { let key = 'kind'; let obj = { - format: "hidden", + format: 'hidden', }; - if(parent_values[key] && parent_values[key].toLowerCase() == "module") { - obj.format = "module_autocomplete"; + if (parent_values[key] && parent_values[key].toLowerCase() == 'module') { + obj.format = 'module_autocomplete'; obj.required = required; obj.additionalProperties = { - list_paths: ["/project/{" + path_pk_key + "}/module/"], - value_field: "name", - view_field: "path", + list_paths: ['/project/{' + path_pk_key + '}/module/'], + value_field: 'name', + view_field: 'path', }; } @@ -302,14 +316,14 @@ function OneTemplate_module_callback(required=false) { * Function - onchange callback of dynamic field - OneTemplate.fields.args. * @param {object} parent_values Values of parent fields. */ -function OneTemplate_args_callback(parent_values={}) { +function OneTemplate_args_callback(parent_values = {}) { let key = 'kind'; let obj = { - format: "hidden", + format: 'hidden', }; - if(parent_values[key] && parent_values[key].toLowerCase() == "module") { - obj.format = "string"; + if (parent_values[key] && parent_values[key].toLowerCase() == 'module') { + obj.format = 'string'; } return obj; @@ -319,24 +333,24 @@ function OneTemplate_args_callback(parent_values={}) { * Function - that forms onchange callback of dynamic field - OneTemplate.fields.playbook. * @param {boolean} required Required field or not. */ -function OneTemplate_playbook_callback(required=false) { +function OneTemplate_playbook_callback(required = false) { /** * Function - onchange callback of dynamic field - OneTemplate.fields.playbook. * @param {object} parent_values Values of parent fields. */ - return function(parent_values={}) { + return function (parent_values = {}) { let key = 'kind'; let obj = { - format: "hidden", + format: 'hidden', }; - if(parent_values[key] && parent_values[key].toLowerCase() == "task") { - obj.format = "playbook_autocomplete"; + if (parent_values[key] && parent_values[key].toLowerCase() == 'task') { + obj.format = 'playbook_autocomplete'; obj.required = required; obj.additionalProperties = { - list_paths: ["/project/{" + path_pk_key + "}/playbook/"], - value_field: "playbook", - view_field: "playbook", + list_paths: ['/project/{' + path_pk_key + '}/playbook/'], + value_field: 'playbook', + view_field: 'playbook', }; } @@ -348,23 +362,23 @@ function OneTemplate_playbook_callback(required=false) { * Function - onchange callback of dynamic field - OneTemplateVariable.fields.key. * @param {object} parent_values Values of parent fields. */ -function OneTemplateVariable_key_callback(parent_values={}) { +function OneTemplateVariable_key_callback(parent_values = {}) { let obj = { - format: "choices", + format: 'choices', enum: [], save_value: true, }; let p_v = parent_values.kind; - if(p_v) { + if (p_v) { p_v = p_v.toLowerCase(); } - if(p_v == 'module') { - obj.enum = [ ...template_vars.key.enum_module ]; - } else if(p_v == 'task' || p_v == 'playbook') { - obj.enum = [ ...template_vars.key.enum_task ]; + if (p_v == 'module') { + obj.enum = [...template_vars.key.enum_module]; + } else if (p_v == 'task' || p_v == 'playbook') { + obj.enum = [...template_vars.key.enum_task]; } return obj; @@ -377,12 +391,16 @@ function OneTemplateVariable_value_callback() { /** * @param {object} parent_values Values of parent fields. */ - return function(parent_values={}) { + return function (parent_values = {}) { let key = parent_values.key; let inventory = parent_values.inventory; - if(key && (key.toLowerCase() == 'group' || key.toLowerCase() == 'limit') && - inventory && !isNaN(Number(inventory))) { + if ( + key && + (key.toLowerCase() == 'group' || key.toLowerCase() == 'limit') && + inventory && + !isNaN(Number(inventory)) + ) { return { format: 'group_autocomplete', default: 'all', @@ -393,7 +411,7 @@ function OneTemplateVariable_value_callback() { ], value_field: 'name', view_field: 'name', - url_params: {inventory_id: inventory}, + url_params: { inventory_id: inventory }, }, save_value: true, }; @@ -408,18 +426,18 @@ function OneTemplateVariable_value_callback() { function getOpenApiPathParameters_template() { return [ { - name: path_pk_key, - in: "path", - description: "A unique integer value identifying this project.", + name: path_pk_key, + in: 'path', + description: 'A unique integer value identifying this project.', required: true, - type: "integer", + type: 'integer', }, { - name: "template_id", - in: "path", - description: "A unique integer value identifying instance of this template sublist.", + name: 'template_id', + in: 'path', + description: 'A unique integer value identifying instance of this template sublist.', required: true, - type: "integer", + type: 'integer', }, ]; } @@ -431,11 +449,11 @@ function getOpenApiPathParameters_template() { function getOpenApiPathParameters_option() { return [ { - name: "option_id", - in: "path", - description: "A unique string value identifying instance of this option sublist.", + name: 'option_id', + in: 'path', + description: 'A unique string value identifying instance of this option sublist.', required: true, - type: "string", + type: 'string', }, ]; } @@ -447,11 +465,11 @@ function getOpenApiPathParameters_option() { function getOpenApiPathParameters_variables() { return [ { - name: "variables_id", - in: "path", + name: 'variables_id', + in: 'path', required: true, - type: "string", - description: "A unique string value identifying instance of this variables sublist.", + type: 'string', + description: 'A unique string value identifying instance of this variables sublist.', }, ]; } @@ -465,47 +483,47 @@ function getOpenApiPathParameters_variables() { function getOpenApiPagePathQueryTypes(entity_name, operation_id, model) { return { get: { - description: "Return a " + entity_name + " of instance.", - operationId: operation_id + "_get", + description: 'Return a ' + entity_name + ' of instance.', + operationId: operation_id + '_get', parameters: [], - tags: ["project"], + tags: ['project'], responses: { 200: { - description: "Action accepted.", - schema: {$ref: "#/definitions/" + model}, + description: 'Action accepted.', + schema: { $ref: '#/definitions/' + model }, }, }, }, put: { - description: "Update one or more fields on an existing " + entity_name + ".", - operationId: operation_id + "_edit", + description: 'Update one or more fields on an existing ' + entity_name + '.', + operationId: operation_id + '_edit', parameters: [ { - in: "body", - name: "data", + in: 'body', + name: 'data', required: true, - schema: {$ref: "#/definitions/" + model}, + schema: { $ref: '#/definitions/' + model }, }, ], responses: { 200: { - description: "Action accepted.", - schema: {$ref: "#/definitions/" + model}, + description: 'Action accepted.', + schema: { $ref: '#/definitions/' + model }, }, }, }, delete: { - description: "Remove an existing " + entity_name + ".", - operationId: operation_id + "_remove", + description: 'Remove an existing ' + entity_name + '.', + operationId: operation_id + '_remove', parameters: [], - tags: ["project"], + tags: ['project'], responses: { 204: { - description: "Action accepted.", + description: 'Action accepted.', }, 400: { - description: "Validation error or some data error.", - schema: {$ref: "#/definitions/Error"}, + description: 'Validation error or some data error.', + schema: { $ref: '#/definitions/Error' }, }, }, }, @@ -523,54 +541,54 @@ function getOpenApiPagePathQueryTypes(entity_name, operation_id, model) { function getOpenApiListPathQueryTypes(entity, operation_id, m_get, m_post, filters = []) { let f_params = [ { - name: "limit", - in: "query", - description: "Number of results to return per page.", + name: 'limit', + in: 'query', + description: 'Number of results to return per page.', required: false, - type: "integer", + type: 'integer', }, { - name: "offset", - in: "query", - description: "The initial index from which to return the results.", + name: 'offset', + in: 'query', + description: 'The initial index from which to return the results.', required: false, - type: "integer", + type: 'integer', }, ].concat(filters); return { get: { - description: "Return all " + entity + " of instance.", - operationId: operation_id + "_list", + description: 'Return all ' + entity + ' of instance.', + operationId: operation_id + '_list', parameters: f_params, responses: { 200: { schema: { results: { - items: {$ref: "#/definitions/" + m_get}, - } - } - } + items: { $ref: '#/definitions/' + m_get }, + }, + }, + }, }, - tags: ["project"], + tags: ['project'], }, post: { - description: "Create a new " + entity + " of instance.", - operationId: operation_id + "_add", + description: 'Create a new ' + entity + ' of instance.', + operationId: operation_id + '_add', parameters: [ { - in: "body", - name: "data", + in: 'body', + name: 'data', required: true, - schema: {$ref: "#/definitions/" + m_post}, + schema: { $ref: '#/definitions/' + m_post }, }, ], responses: { 201: { - description: "Action accepted.", - schema: {$ref: "#/definitions/" + m_post}, + description: 'Action accepted.', + schema: { $ref: '#/definitions/' + m_post }, }, - } + }, }, }; } @@ -581,8 +599,7 @@ function getOpenApiListPathQueryTypes(entity, operation_id, m_get, m_post, filte * @param {object} openapi OpenApi Schema. */ function formEnumForVariables(openapi) { - if(template_vars.key.enum_module && template_vars.key.enum_task && - template_vars.value.types) { + if (template_vars.key.enum_module && template_vars.key.enum_task && template_vars.value.types) { return; } @@ -592,7 +609,7 @@ function formEnumForVariables(openapi) { let exclude_keys = ['module', 'playbook', 'inventory']; function f_func(key) { - if(!exclude_keys.includes(key)) { + if (!exclude_keys.includes(key)) { return key; } } @@ -600,8 +617,8 @@ function formEnumForVariables(openapi) { function formTypes(obj) { let types = {}; - for(let key in obj) { - if(obj.hasOwnProperty(key)) { + for (let key in obj) { + if (obj.hasOwnProperty(key)) { if (exclude_keys.includes(key)) { continue; } @@ -615,7 +632,8 @@ function formEnumForVariables(openapi) { template_vars.key.enum_module = Object.keys(ansible_module.properties).filter(f_func); template_vars.key.enum_task = Object.keys(ansible_playbook.properties).filter(f_func); template_vars.value.types = Object.assign( - formTypes(ansible_module.properties), formTypes(ansible_playbook.properties), + formTypes(ansible_module.properties), + formTypes(ansible_playbook.properties), ); } @@ -623,7 +641,7 @@ function formEnumForVariables(openapi) { * Function returns common fields for OneTemplate * and for OneTemplateOption models. */ -function getTemplateCommonFields(set_required=false) { +function getTemplateCommonFields(set_required = false) { return { group: { name: 'group', @@ -705,11 +723,11 @@ function getOneTemplateVariableSchema() { field: ['inventory', 'key'], types: template_vars.value.types, callback: OneTemplateVariable_value_callback(), - } + }, }, }, - required: ["key", "value"], - type: "object", + required: ['key', 'value'], + type: 'object', }; } @@ -722,16 +740,16 @@ function getFiltersForTemplateVariable() { { name: 'key', in: 'query', - description: "A key name string value (or comma separated list) of instance.", + description: 'A key name string value (or comma separated list) of instance.', required: false, - type: "string", + type: 'string', }, { - name: "value", - in: "query", - description: "A value of instance.", + name: 'value', + in: 'query', + description: 'A value of instance.', required: false, - type: "string", + type: 'string', }, ]; } @@ -745,32 +763,33 @@ const tmp_vars_list_mixin = { * Redefinition of 'removeInstances' method of list view. */ removeInstances() { - let selections = this.$store.getters.getSelections( - this.qs_url.replace(/^\/|\/$/g, ""), - ); + let selections = this.$store.getters.getSelections(this.qs_url.replace(/^\/|\/$/g, '')); let qs = this.getQuerySet(this.view, this.qs_url); - return qs.getTemplateInstance().then(template_instance => { - let selected = []; + return qs + .getTemplateInstance() + .then((template_instance) => { + let selected = []; - for(let key in selections) { - if(!selections[key]) { - continue; - } + for (let key in selections) { + if (!selections[key]) { + continue; + } - selected.push(key); - this._removeInstance(template_instance, key); - } + selected.push(key); + this._removeInstance(template_instance, key); + } - return qs.formQueryAndSend('patch', template_instance.data) - .then(response => { /* jshint unused: false */ + return qs.formQueryAndSend('patch', template_instance.data).then((response) => { + /* jshint unused: false */ return this.removeInstances_callback_custom(selected); }); - }).catch(error => { - debugger; - throw error; - }); + }) + .catch((error) => { + debugger; + throw error; + }); }, /** * Method, that removes template variable. @@ -785,12 +804,12 @@ const tmp_vars_list_mixin = { * Redefinition of 'removeInstances_callback' method of list view. */ removeInstances_callback_custom(selected) { - selected.forEach(item => { - guiPopUp.success(pop_up_msg.instance.success.remove.format( - [item, this.view.schema.name] - )); + selected.forEach((item) => { + spa.popUp.guiPopUp.success( + spa.popUp.pop_up_msg.instance.success.remove.format([item, this.view.schema.name]), + ); - let url = this.qs_url.replace(/^\/|\/$/g, "") + "/" + item; + let url = this.qs_url.replace(/^\/|\/$/g, '') + '/' + item; this.deleteQuerySet(url); @@ -799,30 +818,29 @@ const tmp_vars_list_mixin = { ids[item] = false; this.$store.commit('setSelectionValuesByIds', { - url: this.qs_url.replace(/^\/|\/$/g, ""), + url: this.qs_url.replace(/^\/|\/$/g, ''), ids: ids, }); let new_qs = this.getQuerySet(this.view, this.qs_url).copy(); - if(!new_qs.cache) { + if (!new_qs.cache) { return; } - for(let index = 0; index < new_qs.cache.length; index++) { + for (let index = 0; index < new_qs.cache.length; index++) { let list_instance = new_qs.cache[index]; - if(list_instance.getPkValue() == item) { + if (list_instance.getPkValue() == item) { new_qs.cache.splice(index, 1); this.setQuerySet(this.view, this.qs_url, new_qs); - this.getInstancesList(this.view, this.qs_url).then(instances => { + this.getInstancesList(this.view, this.qs_url).then((instances) => { this.setInstancesToData(instances); }); } } - }); }, }, @@ -836,16 +854,19 @@ const tmp_vars_new_mixin = { fetchData() { this.initLoading(); let qs = this.setAndGetQuerySetFromSandBox(this.view, this.qs_url); - qs.getTemplateInstance().then(template_instance => { - this.data.instance = qs.cache = qs.model.getInstance( - this._formInstanceData(template_instance), qs, - ); - this.setLoadingSuccessful(); - this.getParentInstancesForPath(); - }).catch(error => { - debugger; - throw error; - }); + qs.getTemplateInstance() + .then((template_instance) => { + this.data.instance = qs.cache = qs.model.getInstance( + this._formInstanceData(template_instance), + qs, + ); + this.setLoadingSuccessful(); + this.getParentInstancesForPath(); + }) + .catch((error) => { + debugger; + throw error; + }); }, _formInstanceData(template_instance) { @@ -857,28 +878,27 @@ const tmp_vars_new_mixin = { }, }; - //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for TEMPLATE entity //////////////////////////////////////////////////////////////////////////////////// /** * Model class for OneTemplate model. */ -guiModels.OneTemplateModel = class OneTemplateModel extends guiModels.Model { +guiModels.OneTemplateModel = class OneTemplateModel extends spa.models.Model { /** * Redefinition of 'toInner' method of guiModels.Model class. * @param {object} form_data Data from form with fields. */ - toInner(form_data=this.data) { + toInner(form_data = this.data) { let data = {}; - for(let item in form_data) { - if(this.fields[item]) { + for (let item in form_data) { + if (this.fields[item]) { data[item] = this.fields[item].toInner(form_data); } } - if(!data.data) { + if (!data.data) { data.data = {}; } @@ -889,7 +909,7 @@ guiModels.OneTemplateModel = class OneTemplateModel extends guiModels.Model { let module_fields = ['module', 'args', 'group']; let playbook_fields = ['playbook']; - if(data.kind && data.kind.toLowerCase() == 'module') { + if (data.kind && data.kind.toLowerCase() == 'module') { arr_data_fields = module_fields; delete_data_fields = playbook_fields; } else { @@ -901,28 +921,27 @@ guiModels.OneTemplateModel = class OneTemplateModel extends guiModels.Model { // filters fields for this current kind arr_data_fields.forEach((value) => { - if(data[value]) { + if (data[value]) { data.data[value] = data[value]; delete data[value]; } }); - if(!data.data.vars) { + if (!data.data.vars) { data.data.vars = {}; } - - if(!data.options) { + if (!data.options) { data.options = {}; } // deletes fields from opposite kind delete_data_fields.forEach((value) => { - if(data[value]) { + if (data[value]) { delete data[value]; } - if(data.data[value]) { + if (data.data[value]) { delete data.data[value]; } }); @@ -933,17 +952,20 @@ guiModels.OneTemplateModel = class OneTemplateModel extends guiModels.Model { * Redefinition of 'save' method of guiModels.Model class. * @param {string} method */ - save(method="patch") { - return this.queryset.formQueryAndSend(method, this.toInner(this.data)).then(response => { - if(this.queryset._get_responseHandler) { - response = this.queryset._get_responseHandler(response); - } + save(method = 'patch') { + return this.queryset + .formQueryAndSend(method, this.toInner(this.data)) + .then((response) => { + if (this.queryset._get_responseHandler) { + response = this.queryset._get_responseHandler(response); + } - return this.queryset.model.getInstance(response.data, this.queryset); - }).catch(error => { - debugger; - throw error; - }); + return this.queryset.model.getInstance(response.data, this.queryset); + }) + .catch((error) => { + debugger; + throw error; + }); } }; @@ -960,8 +982,8 @@ guiQuerySets.OneTemplateQuerySet = class OneTemplateQuerySet extends guiQuerySet let data = response.data; let fields = this.model.fields; - for(let key in data.data) { - if(fields[key]) { + for (let key in data.data) { + if (fields[key]) { data[key] = data.data[key]; } } @@ -972,44 +994,46 @@ guiQuerySets.OneTemplateQuerySet = class OneTemplateQuerySet extends guiQuerySet * Redefinition of 'get' method of guiQuerySets.QuerySet class. */ get() { - if(this.cache) { + if (this.cache) { return Promise.resolve(this.cache); } - return this.formQueryAndSend('get').then(response => { - if(this._get_responseHandler) { - response = this._get_responseHandler(response); - } + return this.formQueryAndSend('get') + .then((response) => { + if (this._get_responseHandler) { + response = this._get_responseHandler(response); + } - let instance = this.model.getInstance(response.data, this); - let prefetch_fields = this._getPrefetchFields(); + let instance = this.model.getInstance(response.data, this); + let prefetch_fields = this._getPrefetchFields(); - // if prefetch fields exist, loads prefetch data. - if(prefetch_fields && prefetch_fields.length > 0) { - return this._loadPrefetchData(prefetch_fields, [instance]).then(() => { - this.cache = instance; - return instance; - }); - } + // if prefetch fields exist, loads prefetch data. + if (prefetch_fields && prefetch_fields.length > 0) { + return this._loadPrefetchData(prefetch_fields, [instance]).then(() => { + this.cache = instance; + return instance; + }); + } - // otherwise, returns instance. - this.cache = instance; - return instance; - }).catch(error => { - debugger; - throw error; - }); + // otherwise, returns instance. + this.cache = instance; + return instance; + }) + .catch((error) => { + debugger; + throw error; + }); } }; -tabSignal.connect("models[Template].fields.beforeInit", function(fields) { - ['data', 'options'].forEach(item => { +tabSignal.connect('models[Template].fields.beforeInit', function (fields) { + ['data', 'options'].forEach((item) => { fields[item].hidden = true; }); fields.options_list.format = 'string_array'; fields.options_list.title = 'Options'; }); -tabSignal.connect("models[OneTemplate].fields.beforeInit", function(fields) { +tabSignal.connect('models[OneTemplate].fields.beforeInit', function (fields) { fields.options.hidden = true; fields.options_list.hidden = true; fields.data.hidden = true; @@ -1022,25 +1046,25 @@ tabSignal.connect("models[OneTemplate].fields.beforeInit", function(fields) { format: 'inventory_autocomplete', additionalProperties: { list_paths: ['/project/{' + path_pk_key + '}/inventory/'], - value_field:'id', - view_field:'name', + value_field: 'id', + view_field: 'name', }, }; fields = Object.assign(fields, getTemplateCommonFields(true)); }); -tabSignal.connect("models[TemplateExec].fields.beforeInit", function(fields) { +tabSignal.connect('models[TemplateExec].fields.beforeInit', function (fields) { let option = fields.option; option.format = 'fk'; option.default = { - id: "", - text: "None", + id: '', + text: 'None', }; option.additionalProperties = { list_paths: ['/project/{' + path_pk_key + '}/template/{template_id}/option/'], - value_field:'name', - view_field:'name', + value_field: 'name', + view_field: 'name', }; }); @@ -1049,14 +1073,15 @@ tabSignal.connect("models[TemplateExec].fields.beforeInit", function(fields) { * If type of template was changed, user will see the message about deleting of vars and options, * and he also will se a question 'Does he really want to do it?'. */ -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/edit/].afterInit", (obj) => { +tabSignal.connect('views[/project/{' + path_pk_key + '}/template/{template_id}/edit/].afterInit', (obj) => { let mixins = [...obj.view.mixins].reverse(); - let baseSaveInstance = routesComponentsTemplates.page_edit.methods.saveInstance; /* globals routesComponentsTemplates */ + let baseSaveInstance = + routesComponentsTemplates.page_edit.methods.saveInstance; /* globals routesComponentsTemplates */ - for(let index = 0; index < mixins.length; index++) { + for (let index = 0; index < mixins.length; index++) { let item = mixins[index]; - if(item.methods && item.methods.saveInstance) { + if (item.methods && item.methods.saveInstance) { baseSaveInstance = item.methods.saveInstance; break; @@ -1071,16 +1096,16 @@ tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/e let api_data = this.getQuerySet(this.view, this.qs_url).cache.data; let current_data = this.getQuerySetFromSandBox(this.view, this.qs_url).cache.data; - if(api_data.kind == current_data.kind) { + if (api_data.kind == current_data.kind) { return this.baseSaveInstance(); } - let question = `You have changed type of current template - + let question = `You have changed type of current template - all existing template 'variables' and 'options' will be deleted during saving.
Do you really want to do it?`; - guiPopUp.question(question, ['Yes', 'No']).then(answer => { - if(answer == 'Yes') { + spa.popUp.guiPopUp.question(question, ['Yes', 'No']).then((answer) => { + if (answer == 'Yes') { let qs = this.getQuerySetFromSandBox(this.view, this.qs_url); qs.cache.data.data.vars = {}; @@ -1097,9 +1122,9 @@ tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/e /** * Changes 'kind' filter type to 'choices'. */ -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/].filters.beforeInit", filters => { - for(let index in filters) { - if(filters.hasOwnProperty(index)) { +tabSignal.connect('views[/project/{' + path_pk_key + '}/template/].filters.beforeInit', (filters) => { + for (let index in filters) { + if (filters.hasOwnProperty(index)) { let filter = filters[index]; if (filter.name == 'kind') { @@ -1113,15 +1138,15 @@ tabSignal.connect("views[/project/{" + path_pk_key + "}/template/].filters.befor // EndBlock of extensions for TEMPLATE entity //////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for TEMPLATE VARIABLE entity //////////////////////////////////////////////////////////////////////////////////// /** * Model class for TemplateVariable model. */ -guiModels.TemplateVariableModel = class TemplateVariableModel - extends template_sublink_model_mixin(guiModels.Model) { +guiModels.TemplateVariableModel = class TemplateVariableModel extends template_sublink_model_mixin( + guiModels.Model, +) { /** * Redefinition of guiModels.Model class's 'constructor'. */ @@ -1136,7 +1161,7 @@ guiModels.TemplateVariableModel = class TemplateVariableModel * Redefinition of '_onSave' method of template_sublink_model_mixin. */ _onSave(template_data, instance_data) { - if(!template_data.data.vars) { + if (!template_data.data.vars) { template_data.data.vars = {}; } @@ -1147,8 +1172,7 @@ guiModels.TemplateVariableModel = class TemplateVariableModel * Redefinition of '_onDelete' method of template_sublink_model_mixin. */ _onDelete(template_data) { - if(template_data && template_data.data && - template_data.data.vars) { + if (template_data && template_data.data && template_data.data.vars) { delete template_data.data.vars[this.getPkValue()]; } } @@ -1157,14 +1181,17 @@ guiModels.TemplateVariableModel = class TemplateVariableModel /** * QuerySet class for TemplateVariable model's QuerySet. */ -guiQuerySets.TemplateVariableQuerySet = class TemplateVariableQuerySet - extends template_sublink_qs_mixin(guiQuerySets.QuerySet) { +guiQuerySets.TemplateVariableQuerySet = class TemplateVariableQuerySet extends template_sublink_qs_mixin( + guiQuerySets.QuerySet, +) { /** * Redefinition of 'getDataType' method of guiQuerySets.QuerySet class. */ getDataType() { - return this.url.replace(/^\/|\/$/g, "") - .replace(/\/variables([A-z,0-9,_,\/]*)$/, "").split("/"); + return this.url + .replace(/^\/|\/$/g, '') + .replace(/\/variables([A-z,0-9,_,\/]*)$/, '') + .split('/'); } /** * Method, that forms instances, based on data. @@ -1175,17 +1202,19 @@ guiQuerySets.TemplateVariableQuerySet = class TemplateVariableQuerySet _formInstances(data) { let instances = []; - if(!(data && data.data && data.data.vars)) { + if (!(data && data.data && data.data.vars)) { return instances; } - for(let item in data.data.vars) { - if(data.data.vars.hasOwnProperty(item)) { + for (let item in data.data.vars) { + if (data.data.vars.hasOwnProperty(item)) { instances.push( this.model.getInstance( { - kind: data.kind, inventory: data.data.inventory, - key: item, value: data.data.vars[item] + kind: data.kind, + inventory: data.data.inventory, + key: item, + value: data.data.vars[item], }, this.clone(), ), @@ -1203,9 +1232,12 @@ guiQuerySets.TemplateVariableQuerySet = class TemplateVariableQuerySet * @private */ _instanceExists(template_instance, instance_name) { - if(template_instance.data && template_instance.data.data && + if ( + template_instance.data && + template_instance.data.data && template_instance.data.data.vars && - template_instance.data.data.vars[instance_name]!== undefined) { + template_instance.data.data.vars[instance_name] !== undefined + ) { return true; } @@ -1238,14 +1270,12 @@ guiQuerySets.TemplateVariableQuerySet = class TemplateVariableQuerySet /** * Model class for OneTemplateVariable model's QuerySet. */ -guiModels.OneTemplateVariableModel = class OneTemplateVariableModel - extends guiModels.TemplateVariableModel {}; +guiModels.OneTemplateVariableModel = class OneTemplateVariableModel extends guiModels.TemplateVariableModel {}; /** * QuerySet class for OneTemplateVariable model's QuerySet. */ -guiQuerySets.OneTemplateVariableQuerySet = class OneTemplateVariableQuerySet - extends guiQuerySets.TemplateVariableQuerySet {}; +guiQuerySets.OneTemplateVariableQuerySet = class OneTemplateVariableQuerySet extends guiQuerySets.TemplateVariableQuerySet {}; tabSignal.connect('openapi.loaded', (openapi) => { formEnumForVariables(openapi); @@ -1261,8 +1291,10 @@ tabSignal.connect('openapi.loaded', (openapi) => { parameters: [].concat(getOpenApiPathParameters_template()), }, getOpenApiListPathQueryTypes( - 'variables', 'project_template_variables', - 'TemplateVariable', 'OneTemplateVariable', + 'variables', + 'project_template_variables', + 'TemplateVariable', + 'OneTemplateVariable', getFiltersForTemplateVariable(), ), ); @@ -1270,36 +1302,38 @@ tabSignal.connect('openapi.loaded', (openapi) => { let page_path = '/project/{' + path_pk_key + '}/template/{template_id}/variables/{variables_id}/'; openapi.paths[page_path] = Object.assign( { - parameters: [].concat( - getOpenApiPathParameters_template(), getOpenApiPathParameters_variables(), - ), + parameters: [].concat(getOpenApiPathParameters_template(), getOpenApiPathParameters_variables()), }, - getOpenApiPagePathQueryTypes( - 'variables', 'project_template_variables', 'OneTemplateVariable', - ), + getOpenApiPagePathQueryTypes('variables', 'project_template_variables', 'OneTemplateVariable'), ); }); -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/variables/].afterInit", (obj) => { - obj.view.mixins = obj.view.mixins.concat(tmp_vars_list_mixin); -}); +tabSignal.connect( + 'views[/project/{' + path_pk_key + '}/template/{template_id}/variables/].afterInit', + (obj) => { + obj.view.mixins = obj.view.mixins.concat(tmp_vars_list_mixin); + }, +); -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/variables/new/].afterInit", (obj) => { - obj.view.mixins = obj.view.mixins.concat(tmp_vars_new_mixin); -}); +tabSignal.connect( + 'views[/project/{' + path_pk_key + '}/template/{template_id}/variables/new/].afterInit', + (obj) => { + obj.view.mixins = obj.view.mixins.concat(tmp_vars_new_mixin); + }, +); //////////////////////////////////////////////////////////////////////////////////// // EndBlock of extensions for TEMPLATE VARIABLE entity //////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for TEMPLATE OPTION entity //////////////////////////////////////////////////////////////////////////////////// /** * Model class for TemplateOption model. */ -guiModels.TemplateOptionModel = class TemplateOptionModel - extends template_sublink_model_mixin(guiModels.Model) { +guiModels.TemplateOptionModel = class TemplateOptionModel extends template_sublink_model_mixin( + guiModels.Model, +) { /** * Redefinition of guiModels.Model class's 'constructor'. */ @@ -1314,9 +1348,9 @@ guiModels.TemplateOptionModel = class TemplateOptionModel _onSave(template_data, instance_data) { let exclude_props = ['name', 'inventory', 'kind']; - exclude_props.forEach(prop => delete instance_data[prop]); + exclude_props.forEach((prop) => delete instance_data[prop]); - if(!template_data.options) { + if (!template_data.options) { template_data.options = {}; } @@ -1326,7 +1360,7 @@ guiModels.TemplateOptionModel = class TemplateOptionModel * Redefinition of '_onDelete' method of template_sublink_model_mixin. */ _onDelete(template_data) { - if(template_data && template_data.options) { + if (template_data && template_data.options) { delete template_data.options[this.getPkValue()]; } } @@ -1335,14 +1369,17 @@ guiModels.TemplateOptionModel = class TemplateOptionModel /** * QuerySet class for TemplateOption model's QuerySet. */ -guiQuerySets.TemplateOptionQuerySet = class TemplateOptionQuerySet - extends template_sublink_qs_mixin(guiQuerySets.QuerySet) { +guiQuerySets.TemplateOptionQuerySet = class TemplateOptionQuerySet extends template_sublink_qs_mixin( + guiQuerySets.QuerySet, +) { /** * Redefinition of 'getDataType' method of guiQuerySets.QuerySet class. */ getDataType() { - return this.url.replace(/^\/|\/$/g, "") - .replace(/\/option([A-z,0-9,_,\/]*)$/, "").split("/"); + return this.url + .replace(/^\/|\/$/g, '') + .replace(/\/option([A-z,0-9,_,\/]*)$/, '') + .split('/'); } /** * Method, that forms instances, based on data. @@ -1353,15 +1390,13 @@ guiQuerySets.TemplateOptionQuerySet = class TemplateOptionQuerySet _formInstances(data) { let instances = []; - if(!(data && data.options)) { + if (!(data && data.options)) { return instances; } - for(let item in data.options) { - if(data.options.hasOwnProperty(item)) { - instances.push( - this.model.getInstance({name: item}, this.clone()), - ); + for (let item in data.options) { + if (data.options.hasOwnProperty(item)) { + instances.push(this.model.getInstance({ name: item }, this.clone())); } } @@ -1375,8 +1410,11 @@ guiQuerySets.TemplateOptionQuerySet = class TemplateOptionQuerySet * @private */ _instanceExists(template_instance, instance_name) { - if(template_instance.data && template_instance.data.options && - template_instance.data.options[instance_name]!== undefined) { + if ( + template_instance.data && + template_instance.data.options && + template_instance.data.options[instance_name] !== undefined + ) { return true; } @@ -1403,25 +1441,23 @@ guiQuerySets.TemplateOptionQuerySet = class TemplateOptionQuerySet tmp.kind = template_data.kind; tmp.inventory = template_data.data.inventory; - if(template_data.options && template_data.options[option_name]) { + if (template_data.options && template_data.options[option_name]) { option_data = template_data.options[option_name]; } - return $.extend(true, {}, option_data, tmp, {name: option_name}); + return $.extend(true, {}, option_data, tmp, { name: option_name }); } }; /** * Model class for OneTemplateOption model's QuerySet. */ -guiModels.OneTemplateOptionModel = class OneTemplateOptionModel - extends guiModels.TemplateOptionModel {}; +guiModels.OneTemplateOptionModel = class OneTemplateOptionModel extends guiModels.TemplateOptionModel {}; /** * QuerySet class for OneTemplateOption model's QuerySet. */ -guiQuerySets.OneTemplateOptionQuerySet = class OneTemplateOptionQuerySet - extends guiQuerySets.TemplateOptionQuerySet {}; +guiQuerySets.OneTemplateOptionQuerySet = class OneTemplateOptionQuerySet extends guiQuerySets.TemplateOptionQuerySet {}; tabSignal.connect('openapi.loaded', (openapi) => { let template_option = { @@ -1431,8 +1467,8 @@ tabSignal.connect('openapi.loaded', (openapi) => { type: 'string', }, }, - required: ["name"], - type: "object", + required: ['name'], + type: 'object', }; let props = Object.assign( @@ -1457,8 +1493,8 @@ tabSignal.connect('openapi.loaded', (openapi) => { let one_template_option = { properties: props, - required: ["name"], - type: "object", + required: ['name'], + type: 'object', }; openapi.definitions.TemplateOption = template_option; @@ -1470,50 +1506,50 @@ tabSignal.connect('openapi.loaded', (openapi) => { parameters: [].concat(getOpenApiPathParameters_template()), }, getOpenApiListPathQueryTypes( - 'option', 'project_template_option', - 'TemplateOption', 'OneTemplateOption', + 'option', + 'project_template_option', + 'TemplateOption', + 'OneTemplateOption', [ { name: 'name', in: 'query', - description: "A name string value (or comma separated list) of instance.", + description: 'A name string value (or comma separated list) of instance.', required: false, - type: "string", + type: 'string', }, ], ), ); - let page_path = '/project/{' + path_pk_key + '}/template/{template_id}/option/{option_id}/'; openapi.paths[page_path] = Object.assign( { - parameters: [].concat( - getOpenApiPathParameters_template(), getOpenApiPathParameters_option(), - ), + parameters: [].concat(getOpenApiPathParameters_template(), getOpenApiPathParameters_option()), }, - getOpenApiPagePathQueryTypes( - 'option', 'project_template_option', 'OneTemplateOption', - ), + getOpenApiPagePathQueryTypes('option', 'project_template_option', 'OneTemplateOption'), ); }); -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/option/new/].afterInit", (obj) => { - obj.view.mixins = obj.view.mixins.concat(tmp_vars_new_mixin, { - methods: { - _formInstanceData(template_instance) { - return { - kind: template_instance.data.kind, - inventory: template_instance.data.data.inventory, - }; +tabSignal.connect( + 'views[/project/{' + path_pk_key + '}/template/{template_id}/option/new/].afterInit', + (obj) => { + obj.view.mixins = obj.view.mixins.concat(tmp_vars_new_mixin, { + methods: { + _formInstanceData(template_instance) { + return { + kind: template_instance.data.kind, + inventory: template_instance.data.data.inventory, + }; + }, }, - }, - }); -}); + }); + }, +); -tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/option/].afterInit", (obj) => { +tabSignal.connect('views[/project/{' + path_pk_key + '}/template/{template_id}/option/].afterInit', (obj) => { obj.view.mixins = obj.view.mixins.concat({ - mixins:[tmp_vars_list_mixin], + mixins: [tmp_vars_list_mixin], methods: { /** * Method, that removes template option. @@ -1531,15 +1567,15 @@ tabSignal.connect("views[/project/{" + path_pk_key + "}/template/{template_id}/o // EndBlock of extensions for TEMPLATE OPTION entity //////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// // Block of extensions for TEMPLATE OPTION VARIABLE entity //////////////////////////////////////////////////////////////////////////////////// /** * Model class for TemplateOptionVariable model. */ -guiModels.TemplateOptionVariableModel = class TemplateOptionVariableModel - extends template_sublink_model_mixin(guiModels.Model) { +guiModels.TemplateOptionVariableModel = class TemplateOptionVariableModel extends template_sublink_model_mixin( + guiModels.Model, +) { /** * Redefinition of guiModels.Model class's 'constructor'. */ @@ -1555,7 +1591,7 @@ guiModels.TemplateOptionVariableModel = class TemplateOptionVariableModel _onSave(template_data, instance_data) { let option = this.queryset.getOptionName(); - if(!template_data.options[option].vars) { + if (!template_data.options[option].vars) { template_data.options[option].vars = {}; } @@ -1567,10 +1603,12 @@ guiModels.TemplateOptionVariableModel = class TemplateOptionVariableModel _onDelete(template_data) { let option = this.queryset.getOptionName(); - if(template_data && + if ( + template_data && template_data.options && template_data.options[option] && - template_data.options[option].vars) { + template_data.options[option].vars + ) { delete template_data.options[option].vars[this.getPkValue()]; } } @@ -1579,22 +1617,24 @@ guiModels.TemplateOptionVariableModel = class TemplateOptionVariableModel /** * QuerySet class for TemplateOptionVariable model's QuerySet. */ -guiQuerySets.TemplateOptionVariableQuerySet = class TemplateOptionVariableQuerySet - extends template_sublink_qs_mixin(guiQuerySets.QuerySet) { +guiQuerySets.TemplateOptionVariableQuerySet = class TemplateOptionVariableQuerySet extends template_sublink_qs_mixin( + guiQuerySets.QuerySet, +) { /** * Redefinition of 'getDataType' method of guiQuerySets.QuerySet class. */ getDataType() { - return this.url.replace(/^\/|\/$/g, "") - .replace(/\/option([A-z,0-9,_,\/]+)\/variables([A-z,0-9,_,\/]*)$/, "") - .split("/"); + return this.url + .replace(/^\/|\/$/g, '') + .replace(/\/option([A-z,0-9,_,\/]+)\/variables([A-z,0-9,_,\/]*)$/, '') + .split('/'); } getOptionName() { try { - return this.url.split("/option")[1].split("/")[1]; - } catch(e) { + return this.url.split('/option')[1].split('/')[1]; + } catch (e) { debugger; - throw new StatusError(404, 'Instance was not found'); + throw new spa.api.StatusError(404, 'Instance was not found'); } } /** @@ -1607,18 +1647,19 @@ guiQuerySets.TemplateOptionVariableQuerySet = class TemplateOptionVariableQueryS let instances = []; let option_name = this.getOptionName(); - if(!(data && data.options && data.options[option_name] && - data.options[option_name].vars)) { + if (!(data && data.options && data.options[option_name] && data.options[option_name].vars)) { return instances; } - for(let item in data.options[option_name].vars) { - if(data.options[option_name].vars.hasOwnProperty(item)) { + for (let item in data.options[option_name].vars) { + if (data.options[option_name].vars.hasOwnProperty(item)) { instances.push( this.model.getInstance( { - kind: data.kind, inventory: data.data.inventory, - key: item, value: data.options[option_name].vars[item], + kind: data.kind, + inventory: data.data.inventory, + key: item, + value: data.options[option_name].vars[item], }, this.clone(), ), @@ -1638,10 +1679,13 @@ guiQuerySets.TemplateOptionVariableQuerySet = class TemplateOptionVariableQueryS _instanceExists(template_instance, instance_name) { let option = this.getOptionName(); - if(template_instance.data && template_instance.data.options && + if ( + template_instance.data && + template_instance.data.options && template_instance.data.options[option] && template_instance.data.options[option].vars && - template_instance.data.options[option].vars[instance_name]!== undefined) { + template_instance.data.options[option].vars[instance_name] !== undefined + ) { return true; } @@ -1676,14 +1720,12 @@ guiQuerySets.TemplateOptionVariableQuerySet = class TemplateOptionVariableQueryS /** * Model class for OneTemplateOptionVariable model's QuerySet. */ -guiModels.OneTemplateOptionVariableModel = class OneTemplateOptionVariableModel - extends guiModels.TemplateOptionVariableModel {}; +guiModels.OneTemplateOptionVariableModel = class OneTemplateOptionVariableModel extends guiModels.TemplateOptionVariableModel {}; /** * QuerySet class for OneTemplateOptionVariable model's QuerySet. */ -guiQuerySets.OneTemplateOptionVariableQuerySet = class OneTemplateOptionVariableQuerySet - extends guiQuerySets.TemplateOptionVariableQuerySet {}; +guiQuerySets.OneTemplateOptionVariableQuerySet = class OneTemplateOptionVariableQuerySet extends guiQuerySets.TemplateOptionVariableQuerySet {}; tabSignal.connect('openapi.loaded', (openapi) => { formEnumForVariables(openapi); @@ -1696,19 +1738,19 @@ tabSignal.connect('openapi.loaded', (openapi) => { let list_path = '/project/{' + path_pk_key + '}/template/{template_id}/option/{option_id}/variables/'; openapi.paths[list_path] = Object.assign( { - parameters: [].concat( - getOpenApiPathParameters_template(), - getOpenApiPathParameters_option(), - ), + parameters: [].concat(getOpenApiPathParameters_template(), getOpenApiPathParameters_option()), }, getOpenApiListPathQueryTypes( - 'variables', 'project_template_option_variables', - 'TemplateOptionVariable', 'OneTemplateOptionVariable', + 'variables', + 'project_template_option_variables', + 'TemplateOptionVariable', + 'OneTemplateOptionVariable', getFiltersForTemplateVariable(), ), ); - let page_path = '/project/{' + path_pk_key + '}/template/{template_id}/option/{option_id}/variables/{variables_id}/'; + let page_path = + '/project/{' + path_pk_key + '}/template/{template_id}/option/{option_id}/variables/{variables_id}/'; openapi.paths[page_path] = Object.assign( { parameters: [].concat( @@ -1718,23 +1760,27 @@ tabSignal.connect('openapi.loaded', (openapi) => { ), }, getOpenApiPagePathQueryTypes( - 'variables', 'project_template_option_variables', 'OneTemplateOptionVariable', + 'variables', + 'project_template_option_variables', + 'OneTemplateOptionVariable', ), ); }); tabSignal.connect( - "views[/project/{" + path_pk_key + "}/template/{template_id}/option/{option_id}/variables/new/].afterInit", + 'views[/project/{' + + path_pk_key + + '}/template/{template_id}/option/{option_id}/variables/new/].afterInit', (obj) => { obj.view.mixins = obj.view.mixins.concat(tmp_vars_new_mixin); }, ); tabSignal.connect( - "views[/project/{" + path_pk_key + "}/template/{template_id}/option/{option_id}/variables/].afterInit", + 'views[/project/{' + path_pk_key + '}/template/{template_id}/option/{option_id}/variables/].afterInit', (obj) => { obj.view.mixins = obj.view.mixins.concat({ - mixins:[tmp_vars_list_mixin], + mixins: [tmp_vars_list_mixin], methods: { /** * Method, that removes template option. @@ -1753,4 +1799,6 @@ tabSignal.connect( ); //////////////////////////////////////////////////////////////////////////////////// // EndBlock of extensions for TEMPLATE OPTION VARIABLE entity -//////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +//////////////////////////////////////////////////////////////////////////////////// + +export { OneTemplateVariable_key_callback, OneTemplateVariable_value_callback, template_vars }; diff --git a/polemarch/static/js/pmUsers.js b/frontend_src/users.js similarity index 51% rename from polemarch/static/js/pmUsers.js rename to frontend_src/users.js index 734fa60f..ac9e06fd 100644 --- a/polemarch/static/js/pmUsers.js +++ b/frontend_src/users.js @@ -1,3 +1,5 @@ +import { updateSettings } from './dashboard'; + /** * Mixin for UserSettings page_edit view. */ @@ -5,48 +7,53 @@ const user_settings_page_edit_mixin = { methods: { saveInstance() { let data = this.getValidData(); - if(!data) { + if (!data) { return; } - let is_current_user_settings = this.qs_url.replace(/^\/|\/$/g, "") == 'user/' + app.api.getUserId() + '/settings'; + let is_current_user_settings = + this.qs_url.replace(/^\/|\/$/g, '') == 'user/' + app.api.getUserId() + '/settings'; - if(is_current_user_settings) { - data.selectedSkin = guiCustomizer.skin.name; - data.skinsSettings = guiCustomizer.skins_custom_settings; + if (is_current_user_settings) { + data.selectedSkin = spa.guiCustomizer.guiCustomizer.skin.name; + data.skinsSettings = spa.guiCustomizer.guiCustomizer.skins_custom_settings; } let instance = this.data.instance; instance.data = data; let method = this.view.schema.query_type; this.loading = true; - instance.save(method).then(instance => { - this.loading = false; - let qs = this.getQuerySet(this.view, this.qs_url).clone(); - qs.cache = instance; - this.setQuerySet(this.view, this.qs_url, qs); - - if(is_current_user_settings) { - guiDashboard.updateSettings(instance.data); - } - - guiPopUp.success(this.$t('User settings were successfully saved.')); - - let url = this.getRedirectUrl({instance:instance}); - - this.$router.push({path: url}); - - }).catch(error => { - this.loading = false; - let str = app.error_handler.errorToString(error); - - let srt_to_show = pop_up_msg.instance.error.save.format( - ['settings', this.view.schema.name, str], - ); - - app.error_handler.showError(srt_to_show, str); - debugger; - }); + instance + .save(method) + .then((instance) => { + this.loading = false; + let qs = this.getQuerySet(this.view, this.qs_url).clone(); + qs.cache = instance; + this.setQuerySet(this.view, this.qs_url, qs); + + if (is_current_user_settings) { + updateSettings(instance.data); + } + + spa.popUp.guiPopUp.success(this.$t('User settings were successfully saved.')); + + let url = this.getRedirectUrl({ instance: instance }); + + this.$router.push({ path: url }); + }) + .catch((error) => { + this.loading = false; + let str = app.error_handler.errorToString(error); + + let srt_to_show = spa.popUp.pop_up_msg.instance.error.save.format([ + 'settings', + this.view.schema.name, + str, + ]); + + app.error_handler.showError(srt_to_show, str); + debugger; + }); }, getRedirectUrl() { @@ -71,11 +78,11 @@ function editUserSettingsPageInOpenApi(path) { * @param {string} path /user/{pk}/settings/edit/. */ function editUserSettingsPageEditView(path) { - tabSignal.connect("views[" + path + "].beforeInit", function(obj){ - obj.schema.query_type = "post"; + tabSignal.connect('views[' + path + '].beforeInit', function (obj) { + obj.schema.query_type = 'post'; }); - tabSignal.connect("views[" + path + "].afterInit", function(obj) { + tabSignal.connect('views[' + path + '].afterInit', function (obj) { obj.view.mixins.push(user_settings_page_edit_mixin); }); } @@ -85,7 +92,7 @@ function editUserSettingsPageEditView(path) { * @param {string} path /user/{pk}/settings/new/. */ function deleteUserSettingsPageNewView(path) { - tabSignal.connect("allViews.inited", function(obj){ + tabSignal.connect('allViews.inited', function (obj) { delete obj.views[path]; }); } @@ -110,57 +117,61 @@ function prepareUserSettingsModelFields(model) { /** * Signal, that edits options of UserSettings model's fields. */ - tabSignal.connect("models[" + model + "].fields.beforeInit", (fields => { - if(fields.lang) { + tabSignal.connect('models[' + model + '].fields.beforeInit', (fields) => { + if (fields.lang) { fields.lang.title = 'language'; fields.lang.description = 'application interface language'; } - if(fields.autoupdateInterval) { + if (fields.autoupdateInterval) { fields.autoupdateInterval.format = 'time_interval'; fields.autoupdateInterval.required = true; fields.autoupdateInterval.title = 'Auto update interval'; - fields.autoupdateInterval.description = 'application automatically updates pages data' + - ' with following interval (time in seconds)'; + fields.autoupdateInterval.description = + 'application automatically updates pages data' + ' with following interval (time in seconds)'; } [ - {name: 'chartLineSettings', title: "Dashboard chart lines settings", }, - {name: 'widgetSettings', title: "Dashboard widgets settings"}, + { name: 'chartLineSettings', title: 'Dashboard chart lines settings' }, + { name: 'widgetSettings', title: 'Dashboard widgets settings' }, ].forEach((item) => { - if(fields[item.name]) { + if (fields[item.name]) { fields[item.name].format = 'inner_api_object'; fields[item.name].title = item.title; } }); - if(fields.selectedSkin) { + if (fields.selectedSkin) { fields.selectedSkin = { title: 'Selected skin', format: 'hidden', }; } - if(fields.skinsSettings) { + if (fields.skinsSettings) { fields.skinsSettings = { title: 'Skin settings', format: 'hidden', }; } - })); + }); } /** * Variable, that stores name of user Settings model. */ -let user_settings_model_name = 'UserSettings'; +const user_model_settings = { + name: 'UserSettings', +}; /** * Prepares fields of user settings model. */ -prepareUserSettingsModelFields(user_settings_model_name); +prepareUserSettingsModelFields(user_model_settings.name); /** * Emits signals for UserSettings views. */ -prepareUserSettingsViews('/user/{' + path_pk_key + '}/settings/'); +prepareUserSettingsViews('/user/{' + spa.utils.path_pk_key + '}/settings/'); + +export { prepareUserSettingsViews, prepareUserSettingsModelFields, user_model_settings }; diff --git a/package.json b/package.json new file mode 100644 index 00000000..b469bd79 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "polemarch", + "version": "1.7.1b1", + "author": "VST Consulting", + "license": "AGPL-3.0-only", + "browserslist": [ + "> 0.25%", + "not dead" + ], + "scripts": { + "build": "APP_ENV=prod webpack", + "buildAnalyze": "APP_ENV=prod BUNDLE_ANALYZER=true webpack", + "buildJson": "APP_ENV=prod webpack --profile --json > stat.json", + "devBuild": "webpack", + "styleCheck": "prettier --check frontend_src/**", + "styleFix": "prettier --write frontend_src/**" + }, + "devDependencies": { + "@babel/core": "^7.8.7", + "@babel/preset-env": "^7.8.7", + "babel-loader": "^8.1.0", + "babel-minify-webpack-plugin": "^0.3.1", + "clean-webpack-plugin": "^3.0.0", + "core-js": "^3.6.4", + "css-loader": "^3.4.2", + "dotenv": "^8.2.0", + "file-loader": "^5.1.0", + "node-sass": "^4.13.1", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "prettier": "^2.0.2", + "sass-loader": "^8.0.2", + "style-loader": "^1.1.3", + "url-loader": "^3.0.0", + "vue-loader": "^15.9.1", + "vue-template-compiler": "^2.6.11", + "webpack": "^4.42.1", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-cli": "^3.3.11" + }, + "dependencies": {} +} diff --git a/polemarch/__main__.py b/polemarch/__main__.py index a44159ac..caa23ca7 100644 --- a/polemarch/__main__.py +++ b/polemarch/__main__.py @@ -1,6 +1,9 @@ # pylint: disable=wrong-import-position,unused-import from vstutils.environment import cmd_execution, sys sys.path.append('./') -from . import default_settings # noqa: F401 +try: + from polemarch import default_settings # noqa: F401 +except ImportError: + from . import default_settings # noqa: F401 cmd_execution() diff --git a/polemarch/api/v2/serializers.py b/polemarch/api/v2/serializers.py index 6ecebfab..97c27975 100644 --- a/polemarch/api/v2/serializers.py +++ b/polemarch/api/v2/serializers.py @@ -1147,8 +1147,12 @@ def create(self, validated_data: Dict) -> Dict: g_subs.append(created_hosts[name]) inv_group.hosts.add(*g_subs) + inventory.raw_data = validated_data['raw_data'] + return inventory + + def to_representation(self, instance): return dict( - inventory_id=inventory.id, - name=inventory.name, - raw_data=validated_data['raw_data'] + inventory_id=instance.id, + name=instance.name, + raw_data=getattr(instance, 'raw_data', '') ) diff --git a/polemarch/api/v2/views.py b/polemarch/api/v2/views.py index 805a4443..6598a66e 100644 --- a/polemarch/api/v2/views.py +++ b/polemarch/api/v2/views.py @@ -38,7 +38,7 @@ def copy_instance(self, instance): return new_instance -class OwnedView(base.ModelViewSetSet, base.CopyMixin): +class OwnedView(base.ModelViewSet, base.CopyMixin): POST_WHITE_LIST = [] @deco.action(methods=["post"], detail=True, serializer_class=sers.SetOwnerSerializer) @@ -55,7 +55,7 @@ def set_owner(self, request, **kwargs): return base.Response(serializer.data, status.HTTP_201_CREATED).resp -class __VarsViewSet(base.ModelViewSetSet): +class __VarsViewSet(base.ModelViewSet): ''' Instance execution variables. @@ -349,7 +349,7 @@ class HostViewSet(OwnedView, _VariablesCopyMixin): @deco.nested_view('variables', 'id', view=__InvVarsViewSet) -class _BaseGroupViewSet(OwnedView, base.ModelViewSetSet): +class _BaseGroupViewSet(OwnedView, base.ModelViewSet): ''' retrieve: Return a group instance. @@ -432,13 +432,10 @@ def import_inventory(self, request, **kwargs): # pylint: disable=no-member serializer = self.get_serializer(data=request.data) serializer.is_valid(True) - serializer.save() + instance = serializer.save() if hasattr(self, 'nested_manager'): - data = {self.lookup_field: serializer.data['inventory_id']} - self._data_create( - self.prepare_request_data(data, False), - self.lookup_field - ) + self.nested_manager.add(instance) + return base.Response(serializer.data, status.HTTP_201_CREATED).resp @@ -477,7 +474,7 @@ class __ModuleViewSet(base.ReadOnlyModelViewSet): @deco.nested_view('variables', 'id', view=__PeriodicTaskVarsViewSet) -class __PeriodicTaskViewSet(base.ModelViewSetSet): +class __PeriodicTaskViewSet(base.ModelViewSet): ''' retrieve: Return a perodic task instance. @@ -513,7 +510,7 @@ def execute(self, request, *args, **kwargs): return serializer.execute().resp -class __TemplateViewSet(base.ModelViewSetSet): +class __TemplateViewSet(base.ModelViewSet): ''' retrieve: Return a execute template instance. @@ -643,7 +640,7 @@ def use_it(self, request, *args, **kwargs): return base.Response(serializer.data, status=status.HTTP_201_CREATED).resp -class HookViewSet(base.ModelViewSetSet): +class HookViewSet(base.ModelViewSet): ''' retrieve: Return a hook instance. diff --git a/polemarch/main/settings.py b/polemarch/main/settings.py index 83e8cf0a..24c2bda0 100644 --- a/polemarch/main/settings.py +++ b/polemarch/main/settings.py @@ -304,27 +304,7 @@ class GitCloneSection(GitSection): } SPA_STATIC += [ - {'priority': 200, 'type': 'tpl', 'name': 'templates/pmFields.html', 'spa': True, 'api': False}, - {'priority': 200, 'type': 'tpl', 'name': 'templates/pmItems.html', 'spa': True, 'api': True}, - {'priority': 200, 'type': 'tpl', 'name': 'templates/pmProjects.html', 'spa': True, 'api': False}, - {'priority': 200, 'type': 'tpl', 'name': 'templates/pmHistory.html', 'spa': True, 'api': False}, - {'priority': 150, 'type': 'js', 'name': 'js/libs/ansi_up.js', 'spa': True, 'api': True}, - {'priority': 150, 'type': 'js', 'name': 'js/pmCustomizer.js', 'spa': True, 'api': True}, - {'priority': 160, 'type': 'js', 'name': 'js/common.js', 'spa': True, 'api': True}, - {'priority': 182, 'type': 'js', 'name': 'js/pmFields.js', 'spa': True, 'api': False}, - {'priority': 182, 'type': 'js', 'name': 'js/pmFieldsMixins.js', 'spa': True, 'api': False}, - {'priority': 183, 'type': 'js', 'name': 'js/pmItems.js', 'spa': True, 'api': True}, - {'priority': 184, 'type': 'js', 'name': 'js/pmHosts.js', 'spa': True, 'api': False}, - {'priority': 184.5, 'type': 'js', 'name': 'js/pmGroups.js', 'spa': True, 'api': False}, - {'priority': 185, 'type': 'js', 'name': 'js/pmInventories.js', 'spa': True, 'api': False}, - {'priority': 186, 'type': 'js', 'name': 'js/pmProjects.js', 'spa': True, 'api': False}, - {'priority': 187, 'type': 'js', 'name': 'js/pmHistory.js', 'spa': True, 'api': False}, - {'priority': 190, 'type': 'js', 'name': 'js/pmTemplates.js', 'spa': True, 'api': False}, - {'priority': 191, 'type': 'js', 'name': 'js/pmPeriodicTasks.js', 'spa': True, 'api': False}, - {'priority': 183, 'type': 'js', 'name': 'js/pmUsers.js', 'spa': True, 'api': False}, - {'priority': 400, 'type': 'js', 'name': 'js/pmDashboard.js', 'spa': True, 'api': False}, - {'priority': 200, 'type': 'css', 'name': 'css/polemarch-gui.css', 'spa': True, 'api': True}, - {'priority': 200, 'type': 'css', 'name': 'css/ansi-colors.css', 'spa': True, 'api': True}, + {'priority': 149, 'type': 'js', 'name': 'polemarch/pmlib.js'}, ] # TEST settings diff --git a/polemarch/main/tests/api.py b/polemarch/main/tests/api.py index fd79909b..a8686082 100644 --- a/polemarch/main/tests/api.py +++ b/polemarch/main/tests/api.py @@ -355,7 +355,6 @@ def test_api_versions_list(self): result = self.get_result("get", "/api/") self.assertEqual(len(result['available_versions']), 1) self.assertTrue(result['available_versions'].get(self._settings('VST_API_VERSION'), False)) - self.assertTrue(result.get('openapi', False)) def test_api_v1_list(self): result = self.get_result('get', self.get_url()) diff --git a/polemarch/main/tests/openapi.py b/polemarch/main/tests/openapi.py index 08f579f4..04de280c 100644 --- a/polemarch/main/tests/openapi.py +++ b/polemarch/main/tests/openapi.py @@ -27,7 +27,7 @@ def test_openapi_schema(self): --user admin \ -m doc/api_schema.yaml ''' - schema = self.get_result('get', '/api/openapi/?format=openapi') + schema = self.get_result('get', '/api/endpoint/?format=openapi') with openapi_schema_yaml.open('r') as fin: openapi_schema_yml = yaml.load(fin, Loader=yaml.SafeLoader) diff --git a/polemarch/static/js/common.js b/polemarch/static/js/common.js deleted file mode 100644 index 47460941..00000000 --- a/polemarch/static/js/common.js +++ /dev/null @@ -1,23 +0,0 @@ -tabSignal.connect("app.beforeInit", ({app}) => { - if(app && window.moment && window.moment.tz) { - window.moment.tz.setDefault(app.api.getTimeZone()); - } -}); - -if(guiLocalSettings.get('hideMenu')) { - if(window.innerWidth>767) { - $("body").addClass('sidebar-collapse'); - } -} - -// Adds tests files to the common list of GUI tests -window.guiTestsFiles.push('js/tests/pmTests.js'); -window.guiTestsFiles.push('js/tests/pmFields.js'); -window.guiTestsFiles.push('js/tests/pmUsers.js'); -window.guiTestsFiles.push('js/tests/pmHistory.js'); -window.guiTestsFiles.push('js/tests/pmHooks.js'); -window.guiTestsFiles.push('js/tests/pmHosts.js'); -window.guiTestsFiles.push('js/tests/pmGroups.js'); -window.guiTestsFiles.push('js/tests/pmInventories.js'); -window.guiTestsFiles.push('js/tests/pmProjects.js'); -window.guiTestsFiles.push('js/tests/pmDashboard.js'); diff --git a/polemarch/static/js/libs/ansi_up.js b/polemarch/static/js/libs/ansi_up.js deleted file mode 100644 index 8a41ec10..00000000 --- a/polemarch/static/js/libs/ansi_up.js +++ /dev/null @@ -1,334 +0,0 @@ -/* ansi_up.js - * author : Dru Nelson - * license : MIT - * http://github.com/drudru/ansi_up - */ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['exports'], factory); - } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { - // CommonJS - factory(exports); - } else { - // Browser globals - var exp = {}; - factory(exp); - root.AnsiUp = exp.default; - } -}(this, function (exports) { -"use strict"; -function rgx(tmplObj) { - var subst = []; - for (var _i = 1; _i < arguments.length; _i++) { - subst[_i - 1] = arguments[_i]; - } - var regexText = tmplObj.raw[0]; - var wsrgx = /^\s+|\s+\n|\s+#[\s\S]+?\n/gm; - var txt2 = regexText.replace(wsrgx, ''); - return new RegExp(txt2, 'm'); -} -var AnsiUp = (function () { - function AnsiUp() { - this.VERSION = "2.0.2"; - this.ansi_colors = [ - [ - { rgb: [0, 0, 0], class_name: "ansi-black" }, - { rgb: [187, 0, 0], class_name: "ansi-red" }, - { rgb: [0, 187, 0], class_name: "ansi-green" }, - { rgb: [187, 187, 0], class_name: "ansi-yellow" }, - { rgb: [0, 0, 187], class_name: "ansi-blue" }, - { rgb: [187, 0, 187], class_name: "ansi-magenta" }, - { rgb: [0, 187, 187], class_name: "ansi-cyan" }, - { rgb: [255, 255, 255], class_name: "ansi-white" } - ], - [ - { rgb: [85, 85, 85], class_name: "ansi-bright-black" }, - { rgb: [255, 85, 85], class_name: "ansi-bright-red" }, - { rgb: [0, 255, 0], class_name: "ansi-bright-green" }, - { rgb: [255, 255, 85], class_name: "ansi-bright-yellow" }, - { rgb: [85, 85, 255], class_name: "ansi-bright-blue" }, - { rgb: [255, 85, 255], class_name: "ansi-bright-magenta" }, - { rgb: [85, 255, 255], class_name: "ansi-bright-cyan" }, - { rgb: [255, 255, 255], class_name: "ansi-bright-white" } - ] - ]; - this.htmlFormatter = { - transform: function (fragment, instance) { - var txt = fragment.text; - if (txt.length === 0) - return txt; - if (instance._escape_for_html) - txt = instance.old_escape_for_html(txt); - if (!fragment.bright && fragment.fg === null && fragment.bg === null) - return txt; - var styles = []; - var classes = []; - var fg = fragment.fg; - var bg = fragment.bg; - if (fg === null && fragment.bright) - fg = instance.ansi_colors[1][7]; - if (!instance._use_classes) { - if (fg) - styles.push("color:rgb(" + fg.rgb.join(',') + ")"); - if (bg) - styles.push("background-color:rgb(" + bg.rgb + ")"); - } - else { - if (fg) { - if (fg.class_name !== 'truecolor') { - classes.push(fg.class_name + "-fg"); - } - else { - styles.push("color:rgb(" + fg.rgb.join(',') + ")"); - } - } - if (bg) { - if (bg.class_name !== 'truecolor') { - classes.push(bg.class_name + "-bg"); - } - else { - styles.push("background-color:rgb(" + bg.rgb.join(',') + ")"); - } - } - } - var class_string = ''; - var style_string = ''; - if (classes.length) - class_string = " class=\"" + classes.join(' ') + "\""; - if (styles.length) - style_string = " style=\"" + styles.join(';') + "\""; - return "" + txt + ""; - }, - compose: function (segments, instance) { - return segments.join(""); - } - }; - this.textFormatter = { - transform: function (fragment, instance) { - return fragment.text; - }, - compose: function (segments, instance) { - return segments.join(""); - } - }; - this.setup_256_palette(); - this._use_classes = false; - this._escape_for_html = true; - this.bright = false; - this.fg = this.bg = null; - this._buffer = ''; - } - Object.defineProperty(AnsiUp.prototype, "use_classes", { - get: function () { - return this._use_classes; - }, - set: function (arg) { - this._use_classes = arg; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(AnsiUp.prototype, "escape_for_html", { - get: function () { - return this._escape_for_html; - }, - set: function (arg) { - this._escape_for_html = arg; - }, - enumerable: true, - configurable: true - }); - AnsiUp.prototype.setup_256_palette = function () { - var _this = this; - this.palette_256 = []; - this.ansi_colors.forEach(function (palette) { - palette.forEach(function (rec) { - _this.palette_256.push(rec); - }); - }); - var levels = [0, 95, 135, 175, 215, 255]; - for (var r = 0; r < 6; ++r) { - for (var g = 0; g < 6; ++g) { - for (var b = 0; b < 6; ++b) { - var col = { rgb: [levels[r], levels[g], levels[b]], class_name: 'truecolor' }; - this.palette_256.push(col); - } - } - } - var grey_level = 8; - for (var i = 0; i < 24; ++i, grey_level += 10) { - var gry = { rgb: [grey_level, grey_level, grey_level], class_name: 'truecolor' }; - this.palette_256.push(gry); - } - }; - AnsiUp.prototype.old_escape_for_html = function (txt) { - return txt.replace(/[&<>]/gm, function (str) { - if (str === "&") - return "&"; - if (str === "<") - return "<"; - if (str === ">") - return ">"; - }); - }; - AnsiUp.prototype.old_linkify = function (txt) { - return txt.replace(/(https?:\/\/[^\s]+)/gm, function (str) { - return "" + str + ""; - }); - }; - AnsiUp.prototype.detect_incomplete_ansi = function (txt) { - return !(/.*?[\x40-\x7e]/.test(txt)); - }; - AnsiUp.prototype.detect_incomplete_link = function (txt) { - var found = false; - for (var i = txt.length - 1; i > 0; i--) { - if (/\s|\x1B/.test(txt[i])) { - found = true; - break; - } - } - if (!found) { - if (/(https?:\/\/[^\s]+)/.test(txt)) - return 0; - else - return -1; - } - var prefix = txt.substr(i + 1, 4); - if (prefix.length === 0) - return -1; - if ("http".indexOf(prefix) === 0) - return (i + 1); - }; - AnsiUp.prototype.ansi_to = function (txt, formatter) { - var pkt = this._buffer + txt; - this._buffer = ''; - var raw_text_pkts = pkt.split(/\x1B\[/); - if (raw_text_pkts.length === 1) - raw_text_pkts.push(''); - this.handle_incomplete_sequences(raw_text_pkts); - var first_chunk = this.with_state(raw_text_pkts.shift()); - var blocks = new Array(raw_text_pkts.length); - for (var i = 0, len = raw_text_pkts.length; i < len; ++i) { - blocks[i] = (formatter.transform(this.process_ansi(raw_text_pkts[i]), this)); - } - if (first_chunk.text.length > 0) - blocks.unshift(formatter.transform(first_chunk, this)); - return formatter.compose(blocks, this); - }; - AnsiUp.prototype.ansi_to_html = function (txt) { - return this.ansi_to(txt, this.htmlFormatter); - }; - AnsiUp.prototype.ansi_to_text = function (txt) { - return this.ansi_to(txt, this.textFormatter); - }; - AnsiUp.prototype.with_state = function (text) { - return { bright: this.bright, fg: this.fg, bg: this.bg, text: text }; - }; - AnsiUp.prototype.handle_incomplete_sequences = function (chunks) { - var last_chunk = chunks[chunks.length - 1]; - if ((last_chunk.length > 0) && this.detect_incomplete_ansi(last_chunk)) { - this._buffer = "\x1B[" + last_chunk; - chunks.pop(); - chunks.push(''); - } - else { - if (last_chunk.slice(-1) === "\x1B") { - this._buffer = "\x1B"; - console.log("raw", chunks); - chunks.pop(); - chunks.push(last_chunk.substr(0, last_chunk.length - 1)); - console.log(chunks); - console.log(last_chunk); - } - if (chunks.length === 2 && - chunks[1] === "" && - chunks[0].slice(-1) === "\x1B") { - this._buffer = "\x1B"; - last_chunk = chunks.shift(); - chunks.unshift(last_chunk.substr(0, last_chunk.length - 1)); - } - } - }; - AnsiUp.prototype.process_ansi = function (block) { - if (!this._sgr_regex) { - this._sgr_regex = (_a = ["\n ^ # beginning of line\n ([!<-?]?) # a private-mode char (!, <, =, >, ?)\n ([d;]*) # any digits or semicolons\n ([ -/]? # an intermediate modifier\n [@-~]) # the command\n ([sS]*) # any text following this CSI sequence\n "], _a.raw = ["\n ^ # beginning of line\n ([!\\x3c-\\x3f]?) # a private-mode char (!, <, =, >, ?)\n ([\\d;]*) # any digits or semicolons\n ([\\x20-\\x2f]? # an intermediate modifier\n [\\x40-\\x7e]) # the command\n ([\\s\\S]*) # any text following this CSI sequence\n "], rgx(_a)); - } - var matches = block.match(this._sgr_regex); - if (!matches) { - return this.with_state(block); - } - var orig_txt = matches[4]; - if (matches[1] !== '' || matches[3] !== 'm') { - return this.with_state(orig_txt); - } - var sgr_cmds = matches[2].split(';'); - while (sgr_cmds.length > 0) { - var sgr_cmd_str = sgr_cmds.shift(); - var num = parseInt(sgr_cmd_str, 10); - if (isNaN(num) || num === 0) { - this.fg = this.bg = null; - this.bright = false; - } - else if (num === 1) { - this.bright = true; - } - else if (num === 22) { - this.bright = false; - } - else if (num === 39) { - this.fg = null; - } - else if (num === 49) { - this.bg = null; - } - else if ((num >= 30) && (num < 38)) { - var bidx = this.bright ? 1 : 0; - this.fg = this.ansi_colors[bidx][(num - 30)]; - } - else if ((num >= 90) && (num < 98)) { - this.fg = this.ansi_colors[1][(num - 90)]; - } - else if ((num >= 40) && (num < 48)) { - this.bg = this.ansi_colors[0][(num - 40)]; - } - else if ((num >= 100) && (num < 108)) { - this.bg = this.ansi_colors[1][(num - 100)]; - } - else if (num === 38 || num === 48) { - if (sgr_cmds.length > 0) { - var is_foreground = (num === 38); - var mode_cmd = sgr_cmds.shift(); - if (mode_cmd === '5' && sgr_cmds.length > 0) { - var palette_index = parseInt(sgr_cmds.shift(), 10); - if (palette_index >= 0 && palette_index <= 255) { - if (is_foreground) - this.fg = this.palette_256[palette_index]; - else - this.bg = this.palette_256[palette_index]; - } - } - if (mode_cmd === '2' && sgr_cmds.length > 2) { - var r = parseInt(sgr_cmds.shift(), 10); - var g = parseInt(sgr_cmds.shift(), 10); - var b = parseInt(sgr_cmds.shift(), 10); - if ((r >= 0 && r <= 255) && (g >= 0 && g <= 255) && (b >= 0 && b <= 255)) { - var c = { rgb: [r, g, b], class_name: 'truecolor' }; - if (is_foreground) - this.fg = c; - else - this.bg = c; - } - } - } - } - } - return this.with_state(orig_txt); - var _a; - }; - return AnsiUp; -}()); -//# sourceMappingURL=ansi_up.js.map - Object.defineProperty(exports, "__esModule", { value: true }); - exports.default = AnsiUp; -})); diff --git a/polemarch/static/js/pmCustomizer.js b/polemarch/static/js/pmCustomizer.js deleted file mode 100644 index 13965f00..00000000 --- a/polemarch/static/js/pmCustomizer.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Mixin, that extends guiSkins.default. - */ -const pmSkinDefaultMixin = { - history_status_ok: { - color_var:"--history-status-ok", - title:'History status ok', - format:'color', - default:"#276900", - // priority: 41, - }, - - history_status_error: { - color_var:"--history-status-error", - title:'History status error', - format:'color', - default:"#dc3545", - // priority: 42, - }, - - history_status_interrupted: { - color_var:"--history-status-interrupted", - title:'History status interrupted', - format:'color', - default:"#9b97e4", - // priority: 43, - }, - - history_status_delay: { - color_var:"--history-status-delay", - title:'History status delay', - format:'color', - default:"#808419", - // priority: 44, - }, - - history_status_offline: { - color_var:"--history-status-offline", - title:'History status offline', - format:'color', - default:"#9e9e9e", - // priority: 45, - }, - - history_status_run: { - color_var:"--history-status-run", - title:'History status run', - format:'color', - default:"#0085ff", - // priority: 46, - }, - - - project_status_new: { - color_var:"--project-status-new", - title:'Project status new', - format:'color', - default:"#bf71b7", - // priority: 47, - }, - - project_status_error: { - color_var:"--project-status-error", - title:'Project status error', - format:'color', - default:"#dc3545", - // priority: 48, - }, - - project_status_ok: { - color_var:"--project-status-ok", - title:'Project status ok', - format:'color', - default:"#276900", - // priority: 49, - }, - - project_status_wait_sync: { - color_var:"--project-status-wait-sync", - title:'Project status wait_sync', - format:'color', - default:"#0085ff", - // priority: 50, - }, - - project_status_sync: { - color_var:"--project-status-sync", - title:'Project status sync', - format:'color', - default:"#ff8c00", - // priority: 51, - }, - - chart_legend_text_color: { - color_var:"--chart-legend-text-color", - title:'Chart legend text color', - format:'color', - default:"#666666", - // priority: 52, - }, - - chart_axes_text_color: { - color_var:"--chart-axes-text-color", - title:'Chart axes text color', - format:'color', - default:"#666666", - // priority: 53, - }, - - chart_axes_lines_color: { - color_var:"--chart-axes-lines-color", - title:'Chart axes lines color', - format:'color', - default:"#efefef", - // priority: 54, - }, -}; - -guiSkins.default = $.extend(true, guiSkins.default, pmSkinDefaultMixin); - -/** - * Mixin, that extends guiSkins.dark. - */ -const pmSkinDarkMixin = { - history_status_ok: { - default:"#56E401", - }, - - history_status_error: { - default:"#F61328", - }, - - history_status_interrupted: { - default:"#B68CF3", - }, - - history_status_delay: { - default:"#DBEA10", - }, - - history_status_offline: { - default:"#90C1C0", - }, - - history_status_run: { - default:"#00D7FF", - }, - - project_status_new: { - default:"#D48CCA", - }, - - project_status_error: { - default:"#F61328", - }, - - project_status_ok: { - default:"#56E401", - }, - - project_status_wait_sync: { - default:"#00D7FF", - }, - - project_status_sync: { - default:"#FF9600", - }, - - chart_legend_text_color: { - default:"#cccccc", - }, - - chart_axes_text_color: { - default:"#cccccc", - }, - - chart_axes_lines_color: { - default:"#bababa", - }, -}; - -guiSkins.dark = $.extend(true, {}, guiSkins.default, guiSkins.dark, pmSkinDarkMixin); \ No newline at end of file diff --git a/polemarch/static/js/pmDashboard.js b/polemarch/static/js/pmDashboard.js deleted file mode 100644 index acfc4bdb..00000000 --- a/polemarch/static/js/pmDashboard.js +++ /dev/null @@ -1,720 +0,0 @@ - -/** - * Function, that returns QuerySet for profile/setting page. - */ -function getProfileSettingQsFromStore() { - let qs = app.application.$store.getters.getQuerySet('user/' + app.api.getUserId() + '/settings'); - - if(!qs) { - return; - } - - return qs.copy(); -} - -/** - * Function, that updates data of QuerySet for profile/setting page - * and saves updated queryset in store. - * @param {object} qs QuerySet for profile/setting page - */ -function updateProfileSettingsQsAndSave(qs) { - qs.formQueryAndSend('post', qs.cache.data).then(response => { /* jshint unused: false */ - app.application.$store.commit('setQuerySet', { - url: qs.url, - queryset: qs, - }); - }).catch(error => { /* jshint unused: false */ - debugger; - }); -} - -/** - * This function is supposed to be called from 'GuiCustomizer.skin.name.changed' tabSignal. - * This function updates selected skin and saves ProfileSettings QuerySet. - * @param {object} customizer GuiCustomizer instance. - */ -function guiCustomizerSkinOnChangeHandler(customizer) { - let qs = getProfileSettingQsFromStore(); - - if(!qs) { - return; - } - - qs.cache.data.selectedSkin = customizer.skin.name; - - return updateProfileSettingsQsAndSave(qs); -} - -/** - * This function is supposed to be called from 'GuiCustomizer.skins_custom_settings.saved' tabSignal. - * This function updates skins_custom_settings and saves ProfileSettings QuerySet. - * @param {object} customizer GuiCustomizer instance. - */ -function guiCustomizerCustomSettingsOnSaveHandler(customizer) { - let qs = getProfileSettingQsFromStore(); - - if(!qs) { - return; - } - - qs.cache.data.skinsSettings = customizer.skins_custom_settings; - - return updateProfileSettingsQsAndSave(qs); -} - -/** - * Class of history chart widget. - */ -guiWidgets.history_chart = class HistoryChart extends guiWidgets.line_chart { - constructor(options) { - super(options); - - this.format = 'history_chart'; - this.period = options.period; - this.date_format = 'DD.MM.YY'; - - Object.defineProperty(this, 'chart_options', { - get: function() { - return { - maintainAspectRatio: false, - legend: { - labels: { - fontColor: guiCustomizer.skin.settings.chart_legend_text_color, - }, - }, - scales: { - yAxes: [{ - ticks: { - beginAtZero:true, - fontColor: guiCustomizer.skin.settings.chart_axes_text_color, - - }, - gridLines: { - color: guiCustomizer.skin.settings.chart_axes_lines_color, - } - }], - xAxes: [{ - ticks: { - fontColor: guiCustomizer.skin.settings.chart_axes_text_color, - - }, - gridLines: { - color: guiCustomizer.skin.settings.chart_axes_lines_color, - } - }] - }, - tooltips: { - mode: 'index', - }, - }; - } - }); - } - - /** - * Method, that returns chart start time moment (first period on xAxes) - - * time in ISO 8601 format. - * @return {number} - * @private - */ - _getChartStartTime() { - // defines current months and year - let monthNum = moment().format("MM"); - let yearNum = moment().format("YYYY"); - let dayNum = moment().format("DD"); - let hourNum = "T00:00:00"; - let startTimeOrg = ""; - - switch(this.period.type) { - case "year": - startTimeOrg = yearNum + "-01-01" + hourNum; - break; - case "month": - startTimeOrg = yearNum + "-" + monthNum + "-01" + hourNum; - break; - case "day": - startTimeOrg = yearNum + "-" + monthNum + "-" + dayNum + hourNum; - break; - } - - return Number( - moment(startTimeOrg).subtract(this.period.amount - 1, this.period.type).tz(app.api.getTimeZone()).format("x"), - ); - } - /** - * Redefinition of '_formChartDataLabels' method of guiWidgets.line_chart class. - * @returns {Array} - * @private - */ - _formChartDataLabels(raw_data) { /* jshint unused: false */ - let labels = []; - let start_time = this._getChartStartTime(); - - for(let i = -1; i< this.period.amount; i++) { - // period up - let time =+ moment(start_time).add(i, this.period.type).tz(app.api.getTimeZone()).format("x"); - time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); - labels.push(time); - } - - return labels; - } - /** - * Redefinition of '_formChartDataDatasets_oneLine' method of guiWidgets.line_chart class. - * @private - */ - _formChartDataDatasets_oneLine(line, raw_data, labels) { - let data = {}; - - for(let index = 0; index < labels.length; index++) { - data[labels[index]] = 0; - } - - for(let index = 0; index < raw_data[this.period.type].length; index++) { - let item = raw_data[this.period.type][index]; - - let time =+ moment(item[this.period.type]).tz(app.api.getTimeZone()).format("x"); - time = moment(time).tz(app.api.getTimeZone()).format(this.date_format); - - if(data[time] === undefined) { - continue; - } - - if(line.name.toLowerCase() == 'all_tasks') { - data[time] = item.all; - } else if(line.name.toLowerCase() == item.status.toLowerCase()) { - data[time] = item.sum; - } - } - - return Object.values(data).map(item => Number(item)); - } - /** - * Method, that form data sets for chart lines. - * @param {object} raw_data Object with raw data for chart. - * @param {array} labels Array with chart labels. - * @return {Array} - * @private - */ - _formChartDataDatasets(raw_data, labels) { - let datasets = []; - - for(let key in this.lines) { - if(this.lines.hasOwnProperty(key)) { - let line = this.lines[key]; - - if (!line.active) { - continue; - } - - datasets.push({ - label: _translate((line.title || line.name).toLowerCase()).toUpperCase(), - data: this._formChartDataDatasets_oneLine(line, raw_data, labels), - borderColor: this._getChartLineColor(line), - backgroundColor: this._getChartLineColor(line, true), - }); - } - } - - return datasets; - } - /** - * Method, that returns current color for chart line. - * @param {object} line Object with chart line settings. - * @param {boolean} bg If true - color should be return for 'background-color' CSS property. - * Otherwise, should be return for 'color' CSS property. - * @private - */ - _getChartLineColor(line, bg) { - let alpha = 1; - let prop = 'color'; - let skin = guiCustomizer.skin.settings; - - if(bg) { - alpha = 0.3; - prop = 'bg_color'; - } - - if(skin['history_status_' + line.name]) { - if(skin['history_status_' + line.name][0] == "#") { - let color = hexToRgbA(skin['history_status_' + line.name], alpha); /* globals hexToRgbA */ - return color; - } - - return skin['history_status_' + line.name]; - } - - return line[prop]; - } - /** - * Method, that returns data for widget progress bars - bars that show statistic info. - * @param {object} raw_data Object with raw data for chart. - * @returns {object} - */ - getProgressBarsData(raw_data) { - let all = 0; - let data = {}; - - for(let key in this.lines) { - if(this.lines.hasOwnProperty(key)) { - let line = this.lines[key]; - - if (line.name == 'all_tasks') { - continue; - } - - data[line.name] = { - all: all, - sum: 0, - status: line.name.toUpperCase(), - }; - } - } - - if(raw_data && raw_data.year) { - let stats = raw_data.year; - - for(let index = 0; index < stats.length; index++) { - let record = stats[index]; - let status = record.status.toLowerCase(); - - if(!data[status]) { - continue; - } - - data[status].sum += record.sum; - } - - for(let key in data) { - if(data.hasOwnProperty(key)){ - all += data[key].sum; - } - } - - for(let key in data) { - if(data.hasOwnProperty(key)){ - data[key].all = all; - } - } - } - - return data; - } - /** - * Method, that sets chart period settings based on period.amount property. - * @param {number} number New period.amount property. - */ - setChartPeriod(number) { - let amount, type; - let num = Number(number); - - switch(num) { - case 1095: - amount = 3; - type = "year"; - break; - case 365: - amount = 13; - type = "month"; - break; - case 90: - amount = 3; - type = "month"; - break; - default: - amount = num; - type = "day"; - break; - } - - this.period = { - type: type, - amount: amount, - query_amount: num, - }; - - guiLocalSettings.set('chart_period', num); - } -}; - -/** - * Sets Dashboard counter widgets. - */ -[ - {name: 'pmwTemplatesCounter', title: 'templates counter', sort: 1, active: true,}, - {name: 'pmwProjectsCounter', title: 'projects counter', sort: 2, active: true, url: '/project'}, - {name: 'pmwInventoriesCounter', title: 'inventories counter', sort: 3, active: true, url: '/inventory'}, - {name: 'pmwGroupsCounter', title: 'groups counter', sort: 4, active: true, url: '/group'}, - {name: 'pmwHostsCounter', title: 'hosts counter', sort: 5, active: true, url: '/host'}, - {name: 'pmwUsersCounter', title: 'users counter', sort: 6, active: true, url: '/user'}, -].forEach(item => { - guiDashboard.widgets[item.name] = new guiWidgets.counter(item); -}); - -/** - * Sets Dashboard history `chart` widget. - */ -guiDashboard.widgets.pmwChartWidget = new guiWidgets.history_chart( - { - name: 'pmwChartWidget', title:'Tasks history', sort:7, - lines: { - all_tasks: { - name: "all_tasks", - // title: "All tasks", - color: "#1f77b4", - bg_color: "rgba(31, 119, 180, 0.3)", - active: true, - }, - ok: { - name: "ok", - title: "OK", - color: "#276900", - bg_color: "rgba(39, 105, 0, 0.3)", - active: true, - }, - error: { - name: "error", - title: "ERROR", - color: "#dc3545", - bg_color: "rgba(220, 53, 69, 0.3)", - active: true, - }, - interrupted: { - name: "interrupted", - title: "INTERRUPTED", - color: "#9b97e4", - bg_color: "rgba(155, 151, 228, 0.3)", - active: true, - }, - delay: { - name: "delay", - title: "DELAY", - color: "#808419", - bg_color: "rgba(128, 132, 25, 0.3)", - active: true, - }, - offline: { - name: "offline", - title: "OFFLINE", - color: "#9e9e9e", - bg_color: "rgba(158, 158, 158, 0.3)", - active: true, - }, - }, - period: { - /** - * Type of period interval. - */ - type: 'day', - /** - * Amount of periods. - */ - amount: 14, - /** - * Amount of periods in days. - * This property is used for API requests. - */ - query_amount: 14, - }, - }, -); - -/** - * Method, that updates Dashboard widgets' settings. - * @param {object} settings Object with new Dashboard widgets' settings. - */ -guiDashboard.updateWidgetSettings = function(settings) { - for(let key in settings) { - if(settings.hasOwnProperty(key)) { - let s_item = settings[key]; - - if (!this.widgets[key]) { - continue; - } - - for (let prop in s_item) { - if(s_item.hasOwnProperty(prop)) { - this.widgets[key][prop] = s_item[prop]; - } - } - } - } -}; - -/** - * Method, that updates line settings of Dashboard pmwChartWidget. - * @param {object} settings Object with new line settings. - */ -guiDashboard.updateChartLineSettings = function(settings) { - for(let key in settings) { - if(!this.widgets.pmwChartWidget.lines[key]) { - continue; - } - - let s_item = settings[key]; - - for(let prop in s_item) { - if(s_item.hasOwnProperty(prop)) { - this.widgets.pmwChartWidget.lines[key][prop] = s_item[prop]; - }} - } -}; - -/** - * Method, that updates Dashboard widgets' settings, guiCustomizer settings - * and auto_update interval. - * @param {object} settings Object with new settings. - */ -guiDashboard.updateSettings = function(settings) { - if(settings.autoupdateInterval) { - guiLocalSettings.set('page_update_interval', settings.autoupdateInterval); - } - - if(settings.selectedSkin) { - guiLocalSettings.set('skin', settings.selectedSkin); - guiCustomizer.skin.name = settings.selectedSkin; - } - - if(settings.skinsSettings) { - guiLocalSettings.set('skins_settings', settings.skinsSettings); - guiCustomizer.skins_custom_settings = settings.skinsSettings; - } - - if(settings.widgetSettings) { - guiLocalSettings.set('widget_settings', settings.widgetSettings); - guiDashboard.updateWidgetSettings(settings.widgetSettings); - } - - if(settings.chartLineSettings && guiDashboard.widgets.pmwChartWidget) { - guiLocalSettings.set('chart_line_settings', settings.chartLineSettings); - guiDashboard.updateChartLineSettings(settings.chartLineSettings); - } - - if(settings.lang) { - app.setLanguage(settings.lang); - } -}; - -if(guiLocalSettings.get('widget_settings')) { - guiDashboard.updateWidgetSettings(guiLocalSettings.get('widget_settings')); -} - -if(guiLocalSettings.get('chart_line_settings')) { - guiDashboard.updateChartLineSettings(guiLocalSettings.get('chart_line_settings')); -} - -if(guiLocalSettings.get('chart_period')) { - guiDashboard.widgets.pmwChartWidget.setChartPeriod(guiLocalSettings.get('chart_period')); -} - -customRoutesComponentsTemplates.home = { /* globals customRoutesComponentsTemplates */ - mixins: [the_basest_view_mixin, view_with_autoupdate_mixin], /* globals the_basest_view_mixin */ - template: "#template_pm_dashboard", - data() { - return { - /** - * Property, that stores widgets objects. - */ - widgets: guiDashboard.widgets, - /** - * Property, that stores widgets' data. - */ - widgets_data: {}, - }; - }, - watch: { - /** - * Updates widgets' data, when chart widget period was changed. - * @param value - */ - 'widgets.pmwChartWidget.period': function(value) { /* jshint unused: false */ - this.setWidgetsData().then(data => { - this.widgets_data = data; - }); - }, - /** - * Saves widgets' data, when chart widget was collapsed/uncollapsed. - * @param value - */ - 'widgets.pmwChartWidget.collapse': function(value) { - this.saveWidgetSettingToApi('pmwChartWidget', 'collapse', value); - }, - }, - created() { - this.fetchData(); - }, - computed: { - title() { - return 'Dashboard'; - }, - /** - * Property, that returns array with sorted widgets. - * @return {array} - */ - sorted_widgets() { - return Object.values(this.widgets).sort((a, b) => { - return a.sort - b.sort; - }); - }, - }, - methods: { - /** - * Method, that gets data for a current view. - */ - fetchData() { - this.initLoading(); - - this.getWidgetsData().then(data => { - this.widgets_data = data; - this.setLoadingSuccessful(); - this.startAutoUpdate(); - }).catch(error => { - debugger; - this.setLoadingError(error); - }); - }, - /** - * Redefinition of 'updateData' method of view_with_autoupdate_mixin. - */ - updateData() { - return this.setWidgetsData().then(data => { - if(!deepEqual(this.widgets_data, data)) { - this.widgets_data = data; - } - - return data; - }); - }, - /** - * Method, that returns promise of getting widgets' data. - */ - getWidgetsData() { - let data = this.$store.getters.getWidgets(this.$route.path); - - if(data) { - return Promise.resolve(data); - } - - return this.setWidgetsData(); - }, - /** - * Method, that returns promise of setting widgets' data in store. - */ - setWidgetsData() { - return this.loadStats().then(response => { - let w_data = this.statsResponseToWidgetData(response); - - this.$store.commit('setWidgets', { - url: this.$route.path, - data: w_data, - }); - - return w_data; - }); - }, - /** - * Method, that loads stats - dict with widgets data. - */ - loadStats() { - return app.api.bulkQuery(this.formBulkStats()); - }, - /** - * Method, that returns bulk for stats query. - */ - formBulkStats() { - return { - type: 'get', - data_type: ['stats'], - filters: "last=" + this.widgets.pmwChartWidget.period.query_amount, - }; - }, - /** - * Method, that transforms API response with stats to widgets data. - * @param {object} response API response object - */ - statsResponseToWidgetData(response) { - let w_data = {}; - let exclude_stats = ['jobs']; - - for(let key in response.data) { - if (!response.data.hasOwnProperty(key)) { - continue; - } - - if (exclude_stats.includes(key)) { - w_data.pmwChartWidget = response.data[key]; - continue; - } - - w_data['pmw' + capitalizeString(key) + 'Counter'] = response.data[key]; - } - - return w_data; - }, - /** - * Method, that updates some property of widget and sends API request for saving updated User Settings. - * @param {string} widget Widget name - * @param {string} prop Widget's property name - * @param {any} value New value of widget's property name - */ - saveWidgetSettingToApi(widget, prop, value) { - let qs = app.application.$store.state.objects["user/" + app.api.getUserId() + "/settings"]; - - if(!qs) { - return; - } - - let instance = qs.cache; - - if(!instance) { - return; - } - - if(!instance.data) { - return; - } - - if(!instance.data.widgetSettings) { - instance.data.widgetSettings = {}; - } - - if(!instance.data.widgetSettings[widget]) { - instance.data.widgetSettings[widget] = {}; - } - - let widget_setting_backup = {...instance.data.widgetSettings[widget]}; - - instance.data.widgetSettings[widget][prop] = value; - - let view = app.views["/user/{" + path_pk_key + "}/settings/edit/"]; - instance.save(view.schema.query_type).then(instance => { - guiDashboard.updateSettings(instance.data); - }).catch(error => { /*jshint unused:false*/ - instance.data.widgetSettings[widget] = widget_setting_backup; - }); - }, - }, -}; - -tabSignal.connect('app.afterInit', (obj) => { - let app = obj.app; - let setting_view = app.views["/profile/settings/"]; - let qs = setting_view.objects.clone(); - qs.url = qs.url.format({[path_pk_key]: app.api.getUserId()}).replace(/^\/|\/$/g, ""); - - qs.get().then(instance => { - guiDashboard.updateSettings(instance.data); - - let qs_1 = app.application.$store.getters.getQuerySet(qs.url); - if(!qs_1) { - app.application.$store.commit('setQuerySet', { - url: qs.url, - queryset: qs, - }); - } - - tabSignal.connect('GuiCustomizer.skin.name.changed', guiCustomizerSkinOnChangeHandler); - tabSignal.connect('GuiCustomizer.skins_custom_settings.saved', guiCustomizerCustomSettingsOnSaveHandler); - tabSignal.connect('GuiCustomizer.skins_custom_settings.reseted', guiCustomizerCustomSettingsOnSaveHandler); - }); -}); \ No newline at end of file diff --git a/polemarch/static/js/pmFieldsMixins.js b/polemarch/static/js/pmFieldsMixins.js deleted file mode 100644 index 1c01da47..00000000 --- a/polemarch/static/js/pmFieldsMixins.js +++ /dev/null @@ -1,356 +0,0 @@ -/** - * Mixin for 'field_content_read_only' of json gui_field. - */ -const ansible_json_field_content_read_only_mixin = { - template: "#template_field_content_readonly_json", - data() { - return { - real_elements: {}, - real_elements_values: {}, - realField: {}, - }; - }, - created() { - if(!this.value) { - return; - } - - this.realFields = this.getRealElements(); - this.sortValues(); - }, - methods: { - /** - * Returns sorted values in real elements. - */ - sortValues() { - let sorted_values = {}; - let sorted_keys = [ - 'short_description', 'description', 'module', 'version_added', 'required', - 'requirements', 'extends_documentation_fragment', 'options', 'notes', 'author', - ]; - - for(let i = 0; i < sorted_keys.length; i++) { - let field = sorted_keys[i]; - if(this.realFields[field] !== undefined) { - sorted_values[field] = this.realFields[field]; - } - } - - for(let field in this.realFields) { - if($.inArray(field, sorted_keys) == -1) { - sorted_values[field] = this.realFields[field]; - } - } - - this.realFields = sorted_values; - }, - /** - * Returns real elements and values. - */ - getRealElements() { - let realElements = {}; - - let fields_types = { - short_description: 'text_paragraph', - description: 'text_paragraph', - notes: 'text_paragraph', - }; - - let options_field_title = "Options:"; - let options_child_fields_subtitle = "Option: "; - - for(let field in this.value) { - if(this.value.hasOwnProperty(field)) { - let options = { - name: field, - readOnly: this.field.options.readOnly || true, - title: capitalizeString(field.replace(/_/g, " ")), - format: 'string', - }; - - if (fields_types[field] && options.title != options_field_title) { - options.format = fields_types[field]; - - if (this.field.options.title && options.title.search(options_child_fields_subtitle) != -1) { - options.hide_title = true; - } - } else if (typeof this.value[field] == "string" && this.value[field].length > 50) { - options.format = 'textarea'; - } else if (typeof this.value[field] == 'boolean') { - options.format = 'boolean'; - } else if (typeof this.value[field] == 'object') { - if (Array.isArray(this.value[field])) { - options.format = 'textarea'; - } else if (this.value[field] === null) { - options.format = 'null'; - } else { - options.format = 'ansible_json'; - if (allPropertiesIsObjects(this.value[field])) { /* globals allPropertiesIsObjects */ - options.divider = true; - options.title += ":"; - } else { - /* jshint maxdepth: false */ - if (this.field.options.title == options_field_title) { - options.title = options_child_fields_subtitle + field; - } - } - } - } - - if (( - typeof this.value[field] == "string" && this.value[field] == "") || - (Array.isArray(this.value[field]) && this.value[field].length == 0) || - ( - typeof this.value[field] == "object" && - this.value[field] !== null && - Array.isArray(this.value[field]) == false && - Object.keys(this.value[field]).length == 0 - )) { - options.format = 'hidden'; - } - - realElements[field] = new guiFields[options.format](options); - } - } - - return realElements; - } - } -}; - -/** - * Mixin for 'one_history_fk' fields. - */ -const one_history_fk_mixin = { - components: { - field_content_readonly: { - mixins: [ - base_field_content_readonly_mixin, field_fk_content_readonly_mixin, - ], - // template: "#template_one_history_fk_field_content_readonly_link", - template: "#template_field_content_readonly_fk", - data() { - return { - class_list: [], - styles_dict: {}, - }; - }, - }, - }, -}; - -/** - * Mixin for ansible json field. - */ -gui_fields_mixins.ansible_json = { - data: function () { - return { - wrapper_classes_list: { - base: "form-group guiField", - grid: "col-lg-12 col-xs-12 col-sm-12 col-md-12", - }, - }; - }, - components: { - field_content_readonly: { - mixins: [ - base_field_content_readonly_mixin, ansible_json_field_content_read_only_mixin - ], - }, - }, -}; - -/** - * Mixin for fk_just_value field. - */ -gui_fields_mixins.fk_just_value = { - template: "#template_field_fk_just_value", - components: { - field_content_readonly: { - mixins: [ - base_field_content_readonly_mixin, field_fk_content_readonly_mixin, - ], - // template: "#template_field_content_readonly_fk_just_value", - template: "#template_field_content_readonly_fk", - data() { - return { - class_list: ["revers-color"], - styles_dict: {display: 'contents'}, - }; - } - }, - }, -}; - -/** - * Mixin for one_history_string field. - */ -gui_fields_mixins.one_history_string = { - data: function () { - return { - wrapper_classes_list: { - base: "form-group " + addCssClassesToElement( - 'guiField', this.field.options.name, this.field.options.format || this.field.options.type, - ), - grid: "col-lg-12 col-xs-12 col-sm-12 col-md-12", - }, - }; - }, - components: { - field_label: { - mixins: [base_field_label_mixin], - data() { - return { - styles_dict: { - float: 'left', - width: '50%', - }, - }; - }, - }, - field_content_readonly: { - mixins: [base_field_content_readonly_mixin], - template: "#template_field_content_readonly_one_history_string", - data() { - return { - class_list: ["text-data"], - styles_dict: { - float: 'left', - width: '50%', - }, - }; - }, - }, - }, -}; - -/** - * Mixin for one_history_fk field. - */ -gui_fields_mixins.one_history_fk = { - mixins: [one_history_fk_mixin], -}; - -/** - * Mixin for one_history_initiator field. - */ -gui_fields_mixins.one_history_initiator = { - mixins: [one_history_fk_mixin], -}; - -/** - * Mixin for one_history_choices field. - */ -gui_fields_mixins.one_history_choices = { - components: { - field_content_readonly: { - mixins: [choices_field_content_readonly_mixin], /* globals choices_field_content_readonly_mixin */ - template: "#template_field_content_readonly_one_history_choices", - data() { - return { - class_list: [], - styles_dict: {}, - }; - }, - }, - }, -}; - -/** - * Mixin for one_history_boolean field. - */ -gui_fields_mixins.one_history_boolean = { - components: { - field_content_readonly: { - mixins: [base_field_content_edit_mixin, boolean_field_content_mixin], /* globals base_field_content_edit_mixin, boolean_field_content_mixin */ - template: "#template_field_content_read_only_one_history_boolean", - data() { - return { - class_list: [], - styles_dict: { - float: 'left', - width: '50%', - }, - }; - }, - computed: { - selected: function(){ - return this.value ? 'boolean-true fa fa-check' : 'boolean-false fa fa-times'; - }, - }, - }, - }, -}; - -/** - * Mixin for one_history_execute_args field. - */ -gui_fields_mixins.one_history_execute_args = { - template: "#template_field_one_history_execute_args", - data: function () { - return { - execute_args_toggle: false, - }; - }, - components: { - field_label: { - mixins: [base_field_label_mixin], - data() { - return { - styles_dict: { - paddingRight: '10px', - }, - }; - }, - }, - }, -}; - -/** - * Mixin for one_history_raw_inventory field. - */ -gui_fields_mixins.one_history_raw_inventory = { - template: "#template_field_one_history_raw_inventory", -}; - -/** - * Mixin for history_executor field. - */ -gui_fields_mixins.history_executor = { - components: { - field_list_view: { - mixins: [base_field_list_view_mixin, field_fk_content_readonly_mixin], /* globals base_field_list_view_mixin */ - template: "#template_field_part_list_view_fk", - computed: { - text() { - return this.field.toRepresent(this.data); - }, - }, - }, - }, -}; - -/** - * Mixin for one_history_executor field. - */ -gui_fields_mixins.one_history_executor = { - components: { - field_content_readonly: { - mixins: [ - base_field_content_readonly_mixin, field_fk_content_readonly_mixin, - ], - template: "#template_field_content_readonly_fk", - data() { - return { - class_list: [], - styles_dict: {}, - }; - }, - computed: { - text() { - return this.field.toRepresent(this.data); - }, - }, - }, - } -}; \ No newline at end of file diff --git a/polemarch/static/js/pmGroups.js b/polemarch/static/js/pmGroups.js deleted file mode 100644 index 085b7e74..00000000 --- a/polemarch/static/js/pmGroups.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Signal, that creates views for paths, which do not exist in API: - * - /inventory/{pk}/group/{group_id}/group/ and all paths, that nested in /group/{pk}/group/ path. - */ -tabSignal.connect('allViews.inited', obj => { - let views = obj.views; - let prefix = '/inventory/{' + path_pk_key + '}'; - let constr = new SubViewWithOutApiPathConstructor(openapi_dictionary, app.models, {prefix: prefix}); - let group_group_paths = Object.keys(views).filter(path => path.indexOf( "/group/{" + path_pk_key + "}/group/") == 0); - - group_group_paths.forEach(path => { - let new_path = prefix + path.replace('{group_id}', '{subgroup_id}').replace('{' + path_pk_key + '}', '{group_id}'); - let new_view = constr.generateSubView(views, path, new_path); - views[new_path] = new_view; - }); -}); - -/** - * Signal, that creates views for paths, which do not exist in API: - * - /project/{pk}/inventory/{inventory_id}/group/{group_id}/group/ and all paths, that nested in /group/{pk}/group/ path. - */ -tabSignal.connect('allViews.inited', obj => { - let views = obj.views; - let prefix = '/project/{' + path_pk_key + '}/inventory/{inventory_id}'; - let constr = new SubViewWithOutApiPathConstructor(openapi_dictionary, app.models, {prefix: prefix}); - let group_group_paths = Object.keys(views).filter(path => path.indexOf( "/group/{" + path_pk_key + "}/group/") == 0); - - group_group_paths.forEach(path => { - let new_path = prefix + path.replace('{group_id}', '{subgroup_id}').replace('{' + path_pk_key + '}', '{group_id}'); - let new_view = constr.generateSubView(views, path, new_path); - views[new_path] = new_view; - }); -}); - -/** - * Signal, that hides 'Host' button from children group views and hides 'Group' button from not children group views. - */ -tabSignal.connect('allViews.inited', obj => { - let views = obj.views; - let group_views = Object.values(views).filter(view => { - let obj = view.schema; - if(obj.path.indexOf('group') != -1 && obj.name == 'group' && ['list', 'page'].includes(obj.type)) { - return true; - } - }); - - group_views.forEach(view => { - view.getViewSublinkButtons = function(type, buttons, instance) { - let data = instance.data; - let btns = $.extend(true, {}, buttons); - - if(!data) { - return btns; - } - - if(type == 'sublinks' || type == 'child_links') { - if(data.children) { - if(btns.host) { - btns.host.hidden = true; - } - } else { - if(btns.group) { - btns.group.hidden = true; - } - } - } - - return btns; - }; - }); -}); \ No newline at end of file diff --git a/polemarch/static/js/pmHistory.js b/polemarch/static/js/pmHistory.js deleted file mode 100644 index 420da0c2..00000000 --- a/polemarch/static/js/pmHistory.js +++ /dev/null @@ -1,675 +0,0 @@ -/** - * Variable, that stores array with History Models names, - * fields of those should be changed in the tabSignal. - */ -const history_models = ['History', 'OneHistory', 'ProjectHistory']; - -/** - * Variable, that stores pairs (key, value), where: - * - key - value of initiator_type field; - * - value - path from which should be loaded prefetch data. - */ -const history_initiator_types = { - project: '/project/', - template: '/project/{' + path_pk_key + '}/template/', - scheduler: '/project/{' + path_pk_key + '}/periodic_task/', -}; - -/** - * Variable, that stores array with History paths, - * options of those should be changed in the tabSignal. - */ -const history_paths = [ - '/history/', - '/history/{' + path_pk_key + '}/', - '/project/{' + path_pk_key + '}/history/', - '/project/{' + path_pk_key + '}/history/{history_id}/', -]; - -/** - * Variable, that stores object with additional properties for history_mode field's options. - */ -const history_mode_additionalProperties = { - list_paths: [ - "/project/{" + path_pk_key + "}/playbook/", - "/project/{" + path_pk_key + "}/module/", - ], - value_field: 'id', -}; - -/** - * Function, that adds signal for some history model's fields. - * @param {string} model - */ -function historyModelsFieldsHandler(model) { - let str = "models[{0}].fields.beforeInit".format([model]); - tabSignal.connect(str, (fields) => { - fields.start_time.format = 'one_history_date_time'; - fields.stop_time.format = 'one_history_date_time'; - - if(fields.inventory) { - fields.inventory.format = 'fk'; - fields.inventory.additionalProperties = { - model: {$ref: "#/definitions/Inventory"}, - value_field: "id", - view_field: "name", - }; - } - - if(fields.executor) { - fields.executor.format = 'history_executor'; - fields.executor.additionalProperties = { - model: {$ref: "#/definitions/User"}, - value_field: "id", - view_field: "username", - }; - } - - [ - 'options', - 'initiator_type', - 'kind', - 'project' - ].forEach(field => { - if(fields[field]) { - fields[field].hidden = true; - } - }); - - if(fields.initiator) { - fields.initiator.format = 'history_initiator'; - fields.initiator.additionalProperties = { - list_paths: Object.values(history_initiator_types), - view_field: 'name', - value_field: 'id', - }; - } - - - if(fields.revision) { - fields.revision.format = 'one_history_revision'; - } - - if(fields.mode) { - fields.mode.format = 'history_mode'; - fields.mode.additionalProperties = {...history_mode_additionalProperties}; - } - }); -} - -/** - * Function - onchange callback of dynamic field - OneHistory.fields.mode. - */ -function OneHistory_kind_mode_callback(parent_values={}) { - let obj = { - save_value: true, - format: 'one_history_mode', - additionalProperties: {...history_mode_additionalProperties}, - }; - - if(parent_values.kind) { - obj.title = parent_values.kind.toLowerCase(); - } - - return obj; -} - -/** - * Function, that adds signal for some OneHistory model's fields. - * @param {string} model - */ -function OneHistoryFieldsHandler(model) { - tabSignal.connect("models[" + model + "].fields.beforeInit", (fields) => { - for(let field in fields) { - if(fields.hasOwnProperty(field)) { - fields[field].format = 'one_history_string'; - - if (['kind', 'raw_args', 'raw_stdout', 'initiator_type'].includes(field)) { - fields[field].format = 'hidden'; - } else if (['start_time', 'stop_time'].includes(field)) { - fields[field].format = 'one_history_date_time'; - } - } - } - - fields.executor.format = 'one_history_executor'; - fields.initiator.format = 'one_history_initiator'; - fields.inventory.format = 'one_history_fk'; - fields.inventory.hidden = true; - fields.execute_args.format = 'one_history_execute_args'; - fields.execution_time.format = 'one_history_uptime'; - fields.revision.format = 'one_history_revision'; - fields.status.format = 'one_history_choices'; - - fields.raw_inventory.format = 'one_history_raw_inventory'; - fields.raw_inventory.hidden = true; - - fields.mode.format = 'dynamic'; - fields.mode.additionalProperties = { - callback: OneHistory_kind_mode_callback, - field: ['kind'], - }; - }); -} - -/** - * Mixin for /history/{pk}/ view. - */ -const history_pk_mixin = { - data: function () { - return { - inventory_toggle: false, - output_toggle: true, - information_toggle: true, - - was_cleared: undefined, - }; - }, - /** - * Redefinition of 'beforeRouteUpdate' hook of view_with_autoupdate_mixin. - */ - beforeRouteUpdate(to, from, next) { /* jshint unused: false */ - this.stopChildrenAutoUpdate(); - this.stopAutoUpdate(); - next(); - }, - /** - * Redefinition of 'beforeRouteUpdate' hook of view_with_autoupdate_mixin. - */ - beforeRouteLeave(to, from, next) { /* jshint unused: false */ - this.stopChildrenAutoUpdate(); - this.stopAutoUpdate(); - this.$destroy(); - next(); - }, - computed: { - /** - * Property, that returns inventory field instance from inventory section. - */ - inventory_field() { - let options = $.extend(true, {}, this.view.objects.model.fields.inventory.options); - options.format = 'fk_just_value'; - options.hidden = false; - let field = new guiFields.fk_just_value(options); - field = guiFields.fk_just_value.prepareField(field, this.$route.name); - return field; - }, - /** - * Property, that returns prop data for inventory field from inventory section - */ - inventory_field_prop_data() { - return this.data.instance.data; - }, - /** - * Property, that returns wrapper_opt object for inventory field from inventory section - */ - inventory_field_wrapper_opt() { - return { - use_prop_data: true, - readOnly: true, - }; - }, - /** - * Property, that returns raw inventory field instance from inventory section. - */ - raw_inventory_field() { - let options = $.extend(true, {}, this.view.objects.model.fields.raw_inventory.options); - options.format = 'one_history_raw_inventory'; - options.hidden = false; - let field = new guiFields.one_history_raw_inventory(options); - return field; - }, - /** - * Property, that is responsible for showing and hiding of clear button. - */ - clear_button_show() { - if(this.data.instance.data && !["RUN", "DELAY"].includes(this.data.instance.data.status)) { - return true; - } - - return false; - }, - /** - * Property, that returns object with options for clear button. - */ - clear_button_options() { - return { - name: 'clear', - }; - }, - /** - * Property, that returns object with look options for clear button. - */ - clear_button_look() { - return { - icon_classes: ['fa', 'fa-trash', 'fa-lg'], - title_classes: ['clear-btn-title'], - classes: ['btn', 'btn-card-tool', 'btn-sm', 'btn-light', 'btn-icon', 'clear-btn' , 'hidden-button'], - }; - } - }, - methods: { - /** - * Stops autoupdate of history_stdout component. - */ - stopChildrenAutoUpdate() { - this.$children.forEach(child => { - if(child.stopAutoUpdate && typeof child.stopAutoUpdate == 'function') { - child.stopAutoUpdate(); - } - }); - }, - /** - * Method, that sends API request for cleaning of history stdout. - */ - clearInstance() { - let qs = this.getQuerySet(this.view, this.qs_url).clone({url: this.qs_url + '/clear'}); - - qs.formQueryAndSend('delete').then(response => { /* jshint unused: false */ - guiPopUp.success(pop_up_msg.instance.success.execute.format( - ['clear', this.view.schema.name] - )); - - this.was_cleared = true; - }).catch(error => { - let str = app.error_handler.errorToString(error); - - let srt_to_show = pop_up_msg.instance.error.execute.format( - ['clear', this.view.schema.name, str], - ); - - app.error_handler.showError(srt_to_show, str); - }); - }, - }, - components: { - /** - * Component for clear history stdout button. - */ - clear_button: { - mixins: [base_button_mixin], /* globals base_button_mixin */ - }, - /** - * Component, that is responsible for loading and showing history stdout output. - */ - history_stdout: { - template: "#template_history_stdout", - mixins: [view_with_autoupdate_mixin], - props: ['instance', 'url', 'cleared'], - data() { - return { - /** - * Array, that stores API response.data.results - array with lines objects. - */ - lines: [], - /** - * Number - limit filter value for lines query. - */ - lines_limit: 500, - /** - * Property, that means: is component loading data right now or not. - */ - loading: false, - /** - * Property, that stores QuerySet for lines loading. - */ - lines_qs: undefined, - /** - * Property, that stores last status of history instance. - */ - last_status: undefined, - /** - * Property, that stores stdout DOM element. - */ - stdout_el: undefined, - }; - }, - - watch: { - 'cleared': function(value) { - if(value) { - this.sendLinesApiRequest({limit:this.lines_limit}).then(response => { - this.lines = []; - this.saveNewLines(response.data.results); - }); - } - }, - }, - - computed: { - /** - * Property, that returns url for getting stdout lines with api prefix. - * @return {string} - */ - raw_stdout_link() { - let url = this.url.replace(/^\/|\/$/g, ""); - - return '/api/' + app.api.openapi.info.version + '/' + url + '/raw'; - }, - /** - * Property, that returns url for getting stdout lines. - * @return {string} - */ - lines_url() { - let url = this.url.replace(/^\/|\/$/g, ""); - - return "/" + url + "/lines/"; - }, - /** - * Property, that returns glued (concatenated) lines of history stdout output. - */ - gluedLines() { - let obj = {}; - - for(let index = 0; index < this.lines.length; index++) { - let subline = this.lines[index]; - - if(!obj[subline.line_gnumber]) { - obj[subline.line_gnumber] = { - id: subline.line_gnumber, - text: subline.line, - }; - } else { - obj[subline.line_gnumber].text += subline.line; - } - } - - return obj; - }, - /** - * Property, that return lines ready to represent - gluedLines with appropriate ansi_up CSS classes. - */ - linesHTML() { - let html = []; - - for(let key in this.gluedLines) { - if(this.gluedLines.hasOwnProperty(key)) { - html.push(this.ansiUp(this.gluedLines[key].text)); - } - } - - return html.join(""); - }, - /** - * Property, that return boolean values, that means: need to load additional lines on scroll event or not. - * @return {boolean} - */ - needLoadAdditionalData() { - if(["RUN", "DELAY"].includes(this.instance.data.status)) { - return false; - } - - let lines = [ ...this.lines].sort((a, b) => { - return b.line_gnumber - a.line_gnumber; - }); - - if(lines.last.line_gnumber == 1 || lines.last.line_gnumber == 0) { - return false; - } - - return true; - }, - }, - - created() { - this.lines_qs = new guiQuerySets.QuerySet(app.models.OneHistory, this.lines_url); - this.getLines().then(response => { /* jshint unused: false */ - setTimeout(() => { - $(this.stdout_el).scrollTop($(this.stdout_el).prop('scrollHeight')); - }, 300); - this.startAutoUpdate(); - }); - }, - - mounted() { - this.stdout_el = $(this.$el).find('.history-stdout')[0]; - }, - - methods: { - /** - * Method - on scroll event handler. - */ - updateData() { - let instance_data = this.instance.data; - - if(["RUN", "DELAY"].includes(instance_data.status)) { - this.last_status = instance_data.status; - - return this.loadLinesFromBeginning().then(response => { /* jshint unused: false */ - setTimeout(() => { - $(this.stdout_el).scrollTop($(this.stdout_el).prop('scrollHeight')); - }, 300); - }); - } else { - if(["RUN", "DELAY"].includes(this.last_status)) { - this.last_status = instance_data.status; - - this.sendLinesApiRequest({limit:this.lines_limit}).then(response => { - this.saveNewLines(response.data.results); - - setTimeout(() => { - $(this.stdout_el).scrollTop($(this.stdout_el).prop('scrollHeight')); - }, 300); - }); - } - - return Promise.resolve(); - } - }, - /** - * Method, that updates data on scroll event. - */ - updateDataOnScroll() { - if(this.needLoadAdditionalData) { - let height = $(this.stdout_el).prop('scrollHeight'); - - return this.loadLinesFromEnd().then(response => { /* jshint unused: false */ - setTimeout(() => { - $(this.stdout_el).scrollTop($(this.stdout_el).prop('scrollHeight') - height); - }, 300); - }); - } - }, - /** - * Method - on scroll event handler. - */ - scrollHandler() { - if($(this.stdout_el).scrollTop() < 100) { - this.updateDataOnScroll(); - } - }, - /** - * Method, that gets lines and set them to this.lines async. - */ - getLines() { - return this.loadLines(); - }, - - /** - * Method, that loads history stdout output lines from API. - */ - loadLines() { - let instance_data = this.instance.data; - - if(["RUN", "DELAY"].includes(instance_data.status)) { - return this.loadLinesFromBeginning(); - } else { - return this.loadLinesFromEnd(); - } - }, - - /** - * Method, that loads history stdout output lines from API: from first line to last. - */ - loadLinesFromBeginning() { - let query = { - ordering: 'line_gnumber', - limit: this.lines_limit, - }; - - if(this.lines.last) { - query.after = this.lines.last.line_gnumber; - } - - return this.sendLinesApiRequest(query).then(response => { - this.saveNewLines(response.data.results); - return response; - }); - }, - - /** - * Method, that loads history stdout output lines from API: from last line to first. - */ - loadLinesFromEnd() { - let query = { - ordering: '-line_gnumber', - limit: this.lines_limit, - }; - - if(this.lines.last) { - query.before = this.lines.last.line_gnumber; - } - - return this.sendLinesApiRequest(query).then(response => { - this.saveNewLines(response.data.results); - return response; - }); - }, - - /** - * Method, that sends request to API for getting stdout lines. - */ - sendLinesApiRequest(query={}) { - let qs = this.lines_qs.clone({query:query}); - - this.loading = true; - return qs.formQueryAndSend('get').then(response => { - this.loading = false; - return response; - }).catch(error => { - throw error; - }); - }, - - /** - * Method, that saves only lines, that were not saved before. - * @param {array} new_lines Array with potential new lines. - */ - saveNewLines(new_lines=[]) { - for(let index = 0; index < new_lines.length; index++) { - let new_line = new_lines[index]; - - let filtered = this.lines.filter(line => { - if(deepEqual(line, new_line)) { - return line; - } - }); - - if(filtered.length == 0) { - this.lines.push(new_line); - } - } - }, - /** - * Method, that returns html (line content with ansi_up classes). - * This method uses syntax highlighter form @link. - * @link https://habrahabr.ru/post/43030/ - * @param {string} line_content Content of line. - */ - ansiUp(line_content) { - let ansi_up = new AnsiUp(); /* globals AnsiUp */ - ansi_up.use_classes = true; - let html = ansi_up.ansi_to_html(line_content); - - return html.replace(/\t/g, '    '); // Change tab to non-breakable space - }, - }, - }, - }, -}; - - -/** - * Function, that adds signal for some history view's filters. - * @param {string} path - */ -function historyPathsFiltersHandler(path) { - /** - * Changes 'status' filter type to 'choices'. - */ - tabSignal.connect("views[" + path + "].filters.beforeInit", filters => { - for(let key in filters) { - if(filters.hasOwnProperty(key)) { - let filter = filters[key]; - - if (filter.name == 'status') { - filter.type = 'choices'; - filter.enum = app.models.History.fields.status.options.enum; - } - } - } - }); -} - -/** - * Function, that adds signal for some history view modification. - * @param {string} path - */ -function historyPathsViewsHandler(path) { - tabSignal.connect("views[" + path + "].afterInit", (obj) => { - if(obj.view.schema.type == 'page') { - obj.view.mixins = obj.view.mixins.concat(history_pk_mixin); - obj.view.template = '#template_view_history_one'; - } - }); - - tabSignal.connect('views[' + path + '].created', obj => { - if(obj.view.schema.type == 'list' && obj.view.schema.operations && obj.view.schema.operations.add) { - delete obj.view.schema.operations.add; - } - }); -} - -/** - * Function, that adds signals for history models and history views. - */ -function addHistorySignals() { - history_models.forEach(historyModelsFieldsHandler); - - history_paths.forEach(historyPathsViewsHandler); - - history_paths.forEach(historyPathsFiltersHandler); - - OneHistoryFieldsHandler('OneHistory'); -} -// adds signal for history models and views. -addHistorySignals(); - -tabSignal.connect('allViews.inited', obj => { - let views = obj.views; - - history_paths.forEach(path => { - views[path].getViewSublinkButtons = function(type, buttons, instance) { - let data = instance.data; - let btns = $.extend(true, {}, buttons); - - if(!data) { - return btns; - } - - if(type == 'actions' || type == 'child_links') { - if(!['RUN', 'DELAY'].includes(data.status)) { - btns.cancel.hidden = true; - } - - if(!(data.status == 'OK' && data.kind == 'MODULE' && data.mode == 'setup')) { - btns.facts.hidden = true; - } - - btns.clear.hidden = true; - } - - return btns; - }; - }); -}); \ No newline at end of file diff --git a/polemarch/static/js/pmItems.js b/polemarch/static/js/pmItems.js deleted file mode 100644 index 41f72de5..00000000 --- a/polemarch/static/js/pmItems.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Redefinition of logo Vue component. - */ -vst_vue_components.items.logo = spa.globalComponentsRegistrator.add({ - name: 'logo', - template: "#template_logo_pm", - computed: { - /** - * Property, that returns path to directory with static files. - * @returns {string}. - */ - staticPath() { - return window.guiStaticPath || "/static/"; - }, - }, -}); - -/** - * Component for guiWidgets.history_chart. - */ -vst_vue_components.widgets.w_history_chart = Vue.component('w_history_chart', { - mixins: [w_line_chart_mixin], /* globals w_line_chart_mixin */ - data() { - return { - with_content_header: true, - }; - }, - components: { - content_header: { - mixins: [base_widget_mixin], /* globals base_widget_mixin */ - template: "#template_w_history_chart_content_header", - data() { - return { - period_options: [ - { value: 1095, title: 'last 3 years' }, - { value: 365, title: 'last year' }, - { value: 90, title: 'last 3 months' }, - { value: 30, title: 'last month' }, - { value: 14, title: 'last 2 weeks' }, - { value: 7, title: 'last week' }, - { value: 3, title: 'last 3 days' }, - ], - }; - }, - methods: { - /** - * Method returns true, if option is selected. - * @param {object} option Parameters of period option. - * @return {boolean} - */ - isOptionSelected(option) { - return option.value == this.item.period.query_amount; - }, - /** - * Method - onChange callback for period select el. - * @param {string} value Selected value. - */ - onChangeHandler(value) { - this.item.setChartPeriod(value); - } - }, - }, - content_body: { - mixins: [w_line_chart_content_body_mixin], /* globals w_line_chart_content_body_mixin */ - template: "#template_w_history_chart_content_body", - data() { - return { - chart_instance: undefined, - customizer: guiCustomizer, - }; - }, - watch: { - 'customizer.skin.name': function(value) { /* jshint unused: false */ - this.updateChartData(); - } - }, - computed: { - /** - * Property, that returns data for Progress bars. - * @returns {Object} - */ - progressBarsData() { - return this.item.getProgressBarsData(this.value); - } - }, - methods: { - /** - * Method, that returns styles for progress bar. - * @param {object} stats Progress bar data. - * @returns {String} - */ - getProgressBarStyles(stats) { - let width = stats.sum / stats.all * 100; - let line = this.item.lines[stats.status.toLowerCase()]; - let bgc = this.item._getChartLineColor(line); - - return 'width: {0}%; background-color: {1}!important;'.format([width, bgc]); - } - }, - }, - }, -}); \ No newline at end of file diff --git a/polemarch/static/js/pmProjects.js b/polemarch/static/js/pmProjects.js deleted file mode 100644 index 9dab6b63..00000000 --- a/polemarch/static/js/pmProjects.js +++ /dev/null @@ -1,451 +0,0 @@ -/** - * Function - that forms onchange callback of dynamic field - AnsibleModule.fields.group/AnsiblePlaybook.fields.limit. - */ -function ExecuteModulePlaybook_group_limit_callback() { - let previous_inventory; - let previous_format; - - /** - * Function - onchange callback of dynamic field - AnsibleModule.fields.group/AnsiblePlaybook.fields.limit. - * @param {object} parent_values Values of parent fields. - */ - return function (parent_values = {}) { - let inventory = parent_values.inventory; - - if (inventory && typeof inventory == 'object' && inventory.value !== undefined) { - inventory = inventory.value; - } - - let save_value = false; - - if(previous_inventory === undefined || previous_inventory == inventory) { - save_value = true; - } - - previous_inventory = inventory; - - if (inventory && !isNaN(Number(inventory))) { - let format = 'group_autocomplete'; - - if(previous_format && previous_format != format) { - save_value = false; - } - - previous_format = format; - - return { - format: format, - default: 'all', - additionalProperties: { - list_paths: [ - '/project/{' + path_pk_key + '}/inventory/{inventory_id}/all_groups/', - '/project/{' + path_pk_key + '}/inventory/{inventory_id}/all_hosts/', - ], - value_field: 'name', - view_field: 'name', - url_params: {inventory_id: inventory}, - }, - save_value: save_value, - }; - } else { - let format = 'autocomplete'; - - if(previous_format && previous_format != format) { - save_value = false; - } - - previous_format = format; - - return { - format: 'autocomplete', - default: 'all', - save_value: save_value, - }; - } - }; -} - -/** - * Function, that connects to the signal, in that some manipulations with model's fields should be made. - * This function is supposed to be called for AnsibleModule and AnsiblePlaybook models. - * @param {string} model Name of model. - */ -function ansiblePlaybookAndAnsibleModuleModelsFieldsHandler(model) { - let str = "models[{0}].fields.beforeInit".format([model]); - - tabSignal.connect(str, (fields) => { - fields.inventory.format = "inventory_autocomplete"; - - let prop; - let type_props = ['module', 'playbook']; - - type_props.forEach(item => { - if(model.toLowerCase().indexOf(item) !== -1) { - prop = item; - } - }); - - if(fields[prop]) { - fields[prop].format = prop + "_autocomplete"; - } - - if(fields[prop] && fields[prop].additionalProperties && prop == 'playbook') { - fields[prop].additionalProperties.view_field = "playbook"; - } - - let group_props = ['group', 'limit']; - - group_props.forEach(prop => { - if(fields[prop]) { - fields[prop].format = 'dynamic'; - fields[prop].additionalProperties = { - field: ['inventory'], - callback: ExecuteModulePlaybook_group_limit_callback(), - }; - } - }); - }); -} - -/** - * Vue component of 'Run playbook form'. - */ -const gui_project_page_additional = Vue.component('gui_project_page_additional', { /* jshint unused: false */ - mixins: [base_page_type_mixin, collapsable_card_mixin], /* globals base_page_type_mixin, collapsable_card_mixin */ - template: "#template_project_page_additional", - data() { - return { - /** - * Property, that stores instance of guiField.form - - * form with base fields of 'Run playbook form'. - */ - base_fields: undefined, - /** - * Property, that stores value of base_fields form. - */ - base_fields_value: {}, - - /** - * Property, that stores instance of guiField.form - - * form with extra fields of 'Run playbook form'. - */ - extra_vars: undefined, - /** - * Property, that stores value of extra_vars form. - */ - extra_vars_value: {}, - /** - * Property, that stores instance of guiField.form - - * form with playbook buttons of 'Run playbook form'. - */ - buttons: undefined, - /** - * Boolean property, that is responsible for showing/hiding collapse-button. - */ - card_collapsed_button: true, - }; - }, - created() { - let instance = this.data.instance; - - // initialization of base_fields, extra_vars and buttons properties. - if(instance && instance.data && instance.data.execute_view_data) { - this.base_fields = new guiFields.form(this.getBaseFieldsFormOptions()); - - this.extra_vars = new guiFields.form(this.getExtraVarsFormOptions(instance.data.execute_view_data)); - - this.buttons = new guiFields.form(this.getButtonsForm(instance.data.execute_view_data)); - } - }, - methods: { - /** - * Method, that returns options for base_fields form. - */ - getBaseFieldsFormOptions() { - return { - name: 'base_fields', - title: "Execute parameters", - form: { - inventory: { - name: 'inventory', - title: 'inventory', - description: "inventory, on which playbook will be executed", - required: true, - format: 'inventory_autocomplete', - additionalProperties: { - view_field: 'name', - value_field: 'id', - list_paths: ['/project/{' + path_pk_key + '}/inventory/'], - } - }, - user: { - name: 'user', - title: 'User', - description: "connect as this user (default=None)", - format: 'string', - }, - key_file: { - name: 'key_file', - title: 'Key file', - description: "use this file to authenticate the connection", - format: 'secretfile', - }, - }, - }; - }, - /** - * Method, that returns options for extra_vars form. - * @param {object} data Schema of 'Run playbook form'. - * @returns {object}. - */ - getExtraVarsFormOptions(data) { - if(!isEmptyObject(data.fields)) { - return { - name: 'extra_vars', - title: "Additional execute parameters", - format: 'form', - form: data.fields, - }; - } - - return {form: {}}; - }, - /** - * Method, that returns options for buttons form. - * @param {object} data Schema of 'Run playbook form'. - * @returns {object}. - */ - getButtonsForm(data) { - if(isEmptyObject(data.playbooks)) { - return {form: {}}; - } - - let buttons = {}; - - for(let key in data.playbooks) { - if(data.playbooks.hasOwnProperty(key)) { - let val = data.playbooks[key]; - - buttons[key] = { - name: key, - title: val.title, - description: val.help || val.description, - format: 'button', - onclick: () => { - this.executePlaybook(key); - }, - }; - } - } - - return {name: 'buttons', title: ' ', form: buttons}; - }, - /** - * Method, that returns validated data of 'Run playbook form'. - * @return {object} Validated data or error. - */ - getPolemarchYamlValidData() { - try { - let val_base_fields = this.base_fields.toInner({base_fields: this.base_fields_value}); - - let valid_data = this.base_fields.validateValue({base_fields: val_base_fields}); - - let val_extra_vars = this.extra_vars.toInner({extra_vars: this.extra_vars_value}); - - let extra_vars = this.extra_vars.validateValue({extra_vars: val_extra_vars}); - - if(!isEmptyObject(extra_vars)) { - valid_data.extra_vars = extra_vars; - } - - return valid_data; - - } catch(e) { - app.error_handler.defineErrorAndShow(e); - } - }, - /** - * Method, that executes playbook. - * @param {string} playbook. - */ - executePlaybook(playbook) { - let data = this.getPolemarchYamlValidData(); - - if(!data) { - return; - } - - data.playbook = playbook; - - if(data.extra_vars) { - data.extra_vars = JSON.stringify(data.extra_vars); - } - - let qs = this.view.objects.clone(); - - qs.url = (qs.url + "execute_playbook/").format(this.$route.params); - qs.formQueryAndSend('post', data).then(res => { - guiPopUp.success("Playbook was successfully executed."); - - if(res && res.data && res.data.history_id) { - let redirect_path = "/project/{" + path_pk_key + "}/history/{history_id}/"; - let redirect_url; - - try { - redirect_url = redirect_path.format( - $.extend(true, {}, this.$route.params, {history_id: res.data.history_id}), - ); - - if(redirect_url) { - this.$router.push({path: redirect_url.replace(/\/$/g, "")}); - } - - } catch(e) {} - } - }).catch(error => { - debugger; - }); - }, - /** - * Method - handler for 'base_fields' and 'extra_vars' forms onChange event. - * @param {string} prop 'base_fields' or 'extra_vars'. - * @param {object} value New form value. - */ - formOnChangeHandler(prop, value) { - this[prop] = { ...this[prop], ...value }; - }, - }, -}); - -/** - * Mixin for '/project/{pk}/' view. - */ -const project_pk_mixin = { - watch: { - 'hasPolemarchYamlForm': function(value) { - if(value && this.card_collapsed == false && - this.card_collapsed_button == false) { - this.card_collapsed = true; - this.card_collapsed_button = true; - } - }, - }, - computed: { - hasPolemarchYamlForm() { - let instance = this.data.instance; - - if(instance && instance.data && instance.data.execute_view_data) { - return true; - } - - return false; - }, - - content_additional() { - if(this.hasPolemarchYamlForm) { - return 'gui_project_page_additional'; - } - }, - }, -}; - -/** - * Variable, that stores names of models, connected with project. - * This is needed for easy redefinition in EE version. - */ -let project_connected_models_dict = { - module: 'AnsibleModule', - playbook: 'AnsiblePlaybook', -}; - -tabSignal.connect("views[/project/{" + path_pk_key + "}/].afterInit", (obj) => { - obj.view.mixins = obj.view.mixins.concat(project_pk_mixin); -}); - -tabSignal.connect("models[OneProject].fields.beforeInit", (fields) => { - fields.execute_view_data.format = 'hidden'; -}); - -tabSignal.connect("models[OneModule].fields.beforeInit", (fields) => { - fields.data.format = 'ansible_json'; -}); - -/** - * Function, that adds signals to the AnsibleModule and AnsiblePlaybook models. - */ -function addSignalsForAnsibleModuleAndAnsiblePlaybookModels() { - Object.entries(project_connected_models_dict).map(item => { - if(['module', 'playbook'].includes(item[0])) { - return item[1]; - } - }).forEach(ansiblePlaybookAndAnsibleModuleModelsFieldsHandler); -} - -addSignalsForAnsibleModuleAndAnsiblePlaybookModels(); - -/** - * Changes 'status' filter type to 'choices'. - */ -tabSignal.connect("views[/project/].filters.beforeInit", filters => { - for(let key in filters) { - if(filters.hasOwnProperty(key)) { - let filter = filters[key]; - - if (filter.name == 'status' || filter.name == 'status__not') { - filter.type = 'choices'; - filter.enum = [''].concat(app.models.Project.fields.status.options.enum); - } - } - } -}); - -/** - * Variable, that stores pairs (key, value), where: - * - key - value of the 'key' field of ProjectVariable model; - * - value - value of the 'value' field of ProjectVariable model. - */ -const ProjectVariable_value_from_key = { - ci_template: { - additionalProperties: { - list_paths: ["/project/{" + path_pk_key + "}/template/"], - view_field: 'name', - value_field: 'id', - } - }, -}; - -/** - * Function - onchange callback of dynamic field - ProjectVariable.fields.value. - * @param {object} parent_values Values of parent fields. - */ -function ProjectVariable_value_callback(parent_values={}) { - if(parent_values.key && Object.keys(ProjectVariable_value_from_key).includes(parent_values.key)) { - return ProjectVariable_value_from_key[parent_values.key]; - } - - return {}; -} - -/** - * Adds callback for dynamic 'value' field of ProjectVariable model. - */ -tabSignal.connect("models[ProjectVariable].fields.beforeInit", (fields) => { - if(fields.value && fields.value.additionalProperties) { - fields.value.additionalProperties.callback = ProjectVariable_value_callback; - } -}); - -/** - * Hides 'pb_filter' filter on the playbook list view. - */ -tabSignal.connect("views[/project/{" + path_pk_key + "}/playbook/].filters.beforeInit", filters => { - for(let key in filters) { - if(filters.hasOwnProperty(key)) { - let filter = filters[key]; - - if (filter.name == 'pb_filter') { - filter.hidden = true; - } - } - } -}); diff --git a/polemarch/static/templates/pmFields.html b/polemarch/static/templates/pmFields.html deleted file mode 100644 index 96ce7d71..00000000 --- a/polemarch/static/templates/pmFields.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/polemarch/static/templates/pmHistory.html b/polemarch/static/templates/pmHistory.html deleted file mode 100644 index 5d5e41e5..00000000 --- a/polemarch/static/templates/pmHistory.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - diff --git a/polemarch/static/templates/pmItems.html b/polemarch/static/templates/pmItems.html deleted file mode 100644 index dba014e2..00000000 --- a/polemarch/static/templates/pmItems.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/polemarch/static/templates/pmProjects.html b/polemarch/static/templates/pmProjects.html deleted file mode 100644 index 4412cff3..00000000 --- a/polemarch/static/templates/pmProjects.html +++ /dev/null @@ -1,32 +0,0 @@ - - \ No newline at end of file diff --git a/requirements-doc.txt b/requirements-doc.txt index aa931f33..feed0e8c 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=3.0.5b1 +vstutils[doc]~=3.0.13 diff --git a/requirements.txt b/requirements.txt index b5a4f871..13ae2e76 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Main -vstutils[rpc,ldap,doc,prod]~=3.0.5b1 +vstutils[rpc,ldap,doc,prod]~=3.0.13 docutils==0.15.2 markdown2==2.3.8 diff --git a/tox.ini b/tox.ini index 75fb7ed2..d089d40e 100644 --- a/tox.ini +++ b/tox.ini @@ -60,7 +60,7 @@ commands = changedir = ./ deps = commands = - bash -c 'jshint polemarch/static/js/*.js' + bash -c 'jshint frontend_src/**/*.js' whitelist_externals = jshint bash diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..af550c83 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,110 @@ +const webpack = require("webpack"); +const TerserPlugin = require("terser-webpack-plugin"); +const BabelMinifyPlugin = require("babel-minify-webpack-plugin"); +const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); +const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); +const { CleanWebpackPlugin } = require("clean-webpack-plugin"); +const VueLoaderPlugin = require("vue-loader/lib/plugin"); + +require("dotenv").config(); +const ENV = process.env.APP_ENV; +const isProd = ENV === "prod"; + +const enableAnalyzer = process.env.BUNDLE_ANALYZER === "true"; + +const KB = 1024; +const entrypoints_dir = __dirname + "/frontend_src"; + +function setMode() { + if (isProd) { + return "production"; + } else { + return "development"; + } +} + +const config = { + mode: setMode(), + entry: { + pmlib: entrypoints_dir + "/main.js" + }, + output: { + path: __dirname + "/polemarch/static/polemarch", + filename: "[name].js", + chunkFilename: "[name].chunk.js", + publicPath: "/static/polemarch/", + library: "[name]", + libraryTarget: "var" + + }, + plugins: [ + new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + new CleanWebpackPlugin(), + new VueLoaderPlugin() + ], + module: { + rules: [ + { + test: /\.js$/, + use: { + loader: "babel-loader", + options: { + presets: [ + [ + "@babel/preset-env", + { + corejs: 3, + useBuiltIns: "usage" + } + ] + ] + } + }, + exclude: [/node_modules/] + }, + { + test: /\.((css)|(scss))$/i, + use: ["style-loader", "css-loader", "sass-loader"] + }, + { + test: /.woff2$/, + use: { + loader: "url-loader", + options: { + limit: 100 * KB + } + } + }, + { + test: /.(png|jpg|jpeg|gif|svg|woff|ttf|eot)$/, + use: { + loader: "url-loader", + options: { + limit: 10 * KB + } + } + }, + { + test: /\.vue$/, + loader: "vue-loader" + } + ] + }, + optimization: { + chunkIds: "natural", + minimize: true, + minimizer: [ + new TerserPlugin({ + parallel: true + }), + new BabelMinifyPlugin(), + new OptimizeCSSAssetsPlugin() + ] + } +}; + +if (enableAnalyzer) { + config.plugins.push(new BundleAnalyzerPlugin()); +} + +module.exports = config; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..49b5c66f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6761 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@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/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.8.7": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + 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-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.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", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + +"@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.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.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + 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", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@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-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@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.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + 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.8.3": + 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.8.3": + 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-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" + integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + 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-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@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.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.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-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@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.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-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + 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.8.3": + 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.8.3": + 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.8.3": + 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.8.3": + 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.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + 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.8.3": + 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.8.3": + 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.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + 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== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + 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== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + 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.8.3": + 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.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + 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.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + 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.8.3": + 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.8.3": + 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.8.3": + 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.8.3": + 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.8.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.8.3": + 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.8.7": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f" + integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.5" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.8.4": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@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/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.13.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.2.tgz#160d82623610db590a64e8ca81784e11117e5a54" + integrity sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A== + +"@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/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/tapable@*": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" + integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== + +"@types/uglify-js@*": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" + integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== + dependencies: + source-map "^0.6.1" + +"@types/webpack-sources@*": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" + integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@types/webpack@^4.4.31": + version "4.41.12" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.12.tgz#0386ee2a2814368e2f2397abb036c0bf173ff6c3" + integrity sha512-BpCtM4NnBen6W+KEhrL9jKuZCXVtiH6+0b6cxdvNt2EwU949Al334PjQSl2BeAyvAX9mgoNNG21wvjP3xZJJ5w== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@vue/component-compiler-utils@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz#8213a5ff3202f9f2137fe55370f9e8b9656081c3" + integrity sha512-QLq9z8m79mCinpaEeSURhnNCN6djxpHw0lpP/bodMlt5kALfONpryMthvnrQOlTcIKoF+VoPi+lPHUYeDFPXug== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.14" + postcss-selector-parser "^6.0.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@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== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +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== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +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@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +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@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + 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" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +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-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.0, 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" + +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== + +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" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + 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" + +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: + 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" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +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-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.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +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" + +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== + 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= + +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" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +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== + +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== + +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.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +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" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + 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-helper-evaluate-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz#2439545e0b6eae5b7f49b790acbebd6b9a73df20" + integrity sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw== + +babel-helper-flip-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz#f5b6394bd5219b43cf8f7b201535ed540c6e7fa2" + integrity sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw== + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= + +babel-helper-is-void-0@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz#95570d20bd27b2206f68083ae9980ee7003d8fe7" + integrity sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ== + +babel-helper-mark-eval-scopes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz#b4731314fdd7a89091271a5213b4e12d236e29e8" + integrity sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ== + +babel-helper-remove-or-void@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz#f43c86147c8fcc395a9528cbb31e7ff49d7e16e3" + integrity sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ== + +babel-helper-to-multiple-sequence-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz#8da2275ccc26995566118f7213abfd9af7214427" + integrity sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw== + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-minify-webpack-plugin@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.3.1.tgz#292aa240af190e2dcadf4f684d6d84d179b6d5a4" + integrity sha512-Johg6Ju0Gxevk2R55eutMqnyXwlyUzCtwunBpiyNzoxGnKum+x5nfNuYZYHGd5Bmc1gmhjwzb7GkxHWOtYWmtQ== + dependencies: + babel-core "^6.26.0" + babel-preset-minify "^0.3.0" + webpack-sources "^1.0.1" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-minify-builtins@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz#4740117a6a784063aaf8f092989cf9e4bd484860" + integrity sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-minify-constant-folding@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz#687e40336bd4ddd921e0e197f0006235ac184bb9" + integrity sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-minify-dead-code-elimination@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz#a323f686c404b824186ba5583cf7996cac81719e" + integrity sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw== + dependencies: + babel-helper-evaluate-path "^0.3.0" + babel-helper-mark-eval-scopes "^0.3.0" + babel-helper-remove-or-void "^0.3.0" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz#6627893a409c9f30ef7f2c89e0c6eea7ee97ddc4" + integrity sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw== + dependencies: + babel-helper-is-void-0 "^0.3.0" + +babel-plugin-minify-guarded-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz#2552d96189ef45d9a463f1a6b5e4fa110703ac8d" + integrity sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA== + dependencies: + babel-helper-flip-expressions "^0.3.0" + +babel-plugin-minify-infinity@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz#c5ec0edd433517cf31b3af17077c202beb48bbe7" + integrity sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ== + +babel-plugin-minify-mangle-names@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz#f28561bad0dd2f0380816816bb946e219b3b6135" + integrity sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q== + dependencies: + babel-helper-mark-eval-scopes "^0.3.0" + +babel-plugin-minify-numeric-literals@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz#b57734a612e8a592005407323c321119f27d4b40" + integrity sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg== + +babel-plugin-minify-replace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz#980125bbf7cbb5a637439de9d0b1b030a4693893" + integrity sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg== + +babel-plugin-minify-simplify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz#14574cc74d21c81d3060fafa041010028189f11b" + integrity sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q== + dependencies: + babel-helper-flip-expressions "^0.3.0" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.3.0" + +babel-plugin-minify-type-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz#7f5a86ef322c4746364e3c591b8514eeafea6ad4" + integrity sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q== + dependencies: + babel-helper-is-void-0 "^0.3.0" + +babel-plugin-transform-inline-consecutive-adds@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz#f07d93689c0002ed2b2b62969bdd99f734e03f57" + integrity sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA== + +babel-plugin-transform-member-expression-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" + integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= + +babel-plugin-transform-merge-sibling-variables@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" + integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= + +babel-plugin-transform-minify-booleans@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" + integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= + +babel-plugin-transform-property-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" + integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regexp-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz#9bb2c8dd082271a5cb1b3a441a7c52e8fd07e0f5" + integrity sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw== + +babel-plugin-transform-remove-console@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" + integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= + +babel-plugin-transform-remove-debugger@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" + integrity sha1-QrcnYxyXl44estGZp67IShgznvI= + +babel-plugin-transform-remove-undefined@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz#03f5f0071867781e9beabbc7b77bf8095fd3f3ec" + integrity sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-transform-simplify-comparison-operators@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" + integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= + +babel-plugin-transform-undefined-to-void@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" + integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= + +babel-preset-minify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz#7db64afa75f16f6e06c0aa5f25195f6f36784d77" + integrity sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ== + dependencies: + babel-plugin-minify-builtins "^0.3.0" + babel-plugin-minify-constant-folding "^0.3.0" + babel-plugin-minify-dead-code-elimination "^0.3.0" + babel-plugin-minify-flip-comparisons "^0.3.0" + babel-plugin-minify-guarded-expressions "^0.3.0" + babel-plugin-minify-infinity "^0.3.0" + babel-plugin-minify-mangle-names "^0.3.0" + babel-plugin-minify-numeric-literals "^0.3.0" + babel-plugin-minify-replace "^0.3.0" + babel-plugin-minify-simplify "^0.3.0" + babel-plugin-minify-type-constructors "^0.3.0" + babel-plugin-transform-inline-consecutive-adds "^0.3.0" + babel-plugin-transform-member-expression-literals "^6.9.0" + babel-plugin-transform-merge-sibling-variables "^6.9.0" + babel-plugin-transform-minify-booleans "^6.9.0" + babel-plugin-transform-property-literals "^6.9.0" + babel-plugin-transform-regexp-constructors "^0.3.0" + babel-plugin-transform-remove-console "^6.9.0" + babel-plugin-transform-remove-debugger "^6.9.0" + babel-plugin-transform-remove-undefined "^0.3.0" + babel-plugin-transform-simplify-comparison-operators "^6.9.0" + babel-plugin-transform-undefined-to-void "^6.9.0" + lodash.isplainobject "^4.0.6" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +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" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + 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.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + 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-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +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-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== + +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" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +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" + +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" + +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== + +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== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1, 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== + +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: + 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" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +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= + +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: + 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" + 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" + +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" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +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" + evp_bytestokey "^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" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +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" + +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" + 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@^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.0.0, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + +buffer-from@^1.0.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-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== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +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= + +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@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + 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" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +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" + 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" + +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" + +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" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^5.0.0, camelcase@^5.3.1: + 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.0, caniuse-lite@^1.0.30001043: + version "1.0.30001046" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001046.tgz#7a06d3e8fd8aa7f4d21c9a2e313f35f2d06b013e" + integrity sha512-CsGjBRYWG6FvgbyGy+hBbaezpwiqIOLkxQPY4A4Ea49g1eNsnQuESB+n4QM0BKii1j80MyJ26Ir5ywTQkbRE4g== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, 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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +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" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.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.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +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: + 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" + +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" + +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-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b" + integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A== + dependencies: + "@types/webpack" "^4.4.31" + del "^4.1.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.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== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +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" + +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= + +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== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +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" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.18.0, commander@^2.20.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== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +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== + +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: + 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" + +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== + +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" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +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.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +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: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +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.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +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" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^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= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-js@^3.6.4: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +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== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +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-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" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +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" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +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" + 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" + +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-loader@^3.4.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.2.tgz#6483ae56f48a7f901fbe07dde2fc96b01eafab3c" + integrity sha512-hDL0DPopg6zQQSRlZm0hyeaqIRnL0wbWjay9BZxoiJBpbfOW4WHfbaYQhwnDmEa0kZUc1CJ3IFo15ot1yULMIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.27" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.5" + semver "^6.3.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== + +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-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-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +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== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +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" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +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" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + 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" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +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= + +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= + +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" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + 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" + +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= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +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== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^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-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +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" + +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@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +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== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.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" + +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= + +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.413: + version "1.3.415" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.415.tgz#e50241c1e2553e46cfe956c9d95f9ab3fc9a9134" + integrity sha512-GbtYqKffx3sU8G0HxwXuJFfs58Q7+iwLa5rBwaULwET6jWW8IAQSrVnu7vEfiUIcMVfbYyFg7cw3zdm+EbBJmw== + +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== + dependencies: + 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" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +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= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +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== + dependencies: + once "^1.4.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== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +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== + +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.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, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + 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" + +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: + 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== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +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@^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== + +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== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^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== + +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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.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@^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" + 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" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + 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.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +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.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +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" + 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" + +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@^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: + 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== + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-loader@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8" + integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg== + dependencies: + loader-utils "^1.4.0" + schema-utils "^2.5.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== + +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@^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" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.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== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + 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" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +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== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +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= + +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.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +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-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" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +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: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +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== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + 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" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.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== + +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-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +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== + dependencies: + pump "^3.0.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-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@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +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== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +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" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" + integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== + dependencies: + glob "~7.1.1" + lodash "~4.17.12" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +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" + +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.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +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" + +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-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" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +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" + isobject "^2.0.0" + +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" + isobject "^3.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-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +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== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +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" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +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@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +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== + +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" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "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" + sshpk "^1.7.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= + +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== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +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== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +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-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^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= + +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +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= + +infer-owner@^1.0.3: + 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.0, 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.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= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +interpret@1.2.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, invariant@^2.2.4: + 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" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.1: + 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-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-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-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-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + 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" + +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" + kind-of "^5.0.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" + kind-of "^6.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-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@^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.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +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-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: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +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-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +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@^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@^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-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-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-resolvable@^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== + +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" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, 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= + +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= + +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= + +js-base64@^2.1.8: + version "2.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^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-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +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== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +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@~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.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.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= + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +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" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +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" + json-schema "0.2.3" + verror "1.10.0" + +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== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +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" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + 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-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== + +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== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +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.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +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@^4.0.0, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.12: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +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" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@^4.0.1, lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +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== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +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" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +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" + +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== + 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== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +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" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +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" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + 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" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + 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" + +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.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + 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" + 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@^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: + 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.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.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + 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: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +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: + 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@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + 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" + +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== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +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" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +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.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== + +nan@^2.12.1, nan@^2.13.2: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +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" + 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@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== + +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-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== + dependencies: + 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 "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + 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.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + +node-sass@^4.13.1: + version "4.14.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.0.tgz#a8e9d7720f8e15b4a1072719dcf04006f5648eeb" + integrity sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw== + 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" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + 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== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.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" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +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-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== + +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" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~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== + dependencies: + boolbase "~1.0.0" + +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.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: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +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-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.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== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.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" + +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" + +once@^1.3.0, once@^1.3.1, 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" + +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== + +optimize-css-assets-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.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" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + 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: + 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" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +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@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + 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" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + 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" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.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-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +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== + +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== + +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== + dependencies: + cyclist "^1.0.1" + 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== + 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-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + 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" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +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== + +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-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" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + 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-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + 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.2: + 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.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +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" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.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== + dependencies: + 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@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +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.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +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-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-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +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.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.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== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + 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@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: + 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.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + 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" + +prettier@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +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== + +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= + +proxy-addr@~2.0.5: + 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.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.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +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== + 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: + 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" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +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" + pump "^2.0.0" + +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: + 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.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +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.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== + +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= + +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== + 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.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.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +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" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.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" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + 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.0.6, 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: + 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== + 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" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +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" + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + 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== + +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= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.87.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== + dependencies: + 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.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.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +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-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" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +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-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.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.10.0, resolve@^1.3.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +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== + +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= + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +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" + +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" + +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.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, 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.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5: + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, 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@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +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@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + 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.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + 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== + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +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-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== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.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.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +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== + dependencies: + kind-of "^6.0.2" + +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= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +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= + +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" + snapdragon-util "^3.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" + 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" + +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== + +source-map-resolve@^0.5.0: + 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== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + 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-support@~0.5.12: + version "0.5.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.18.tgz#f5f33489e270bd7f7d7e7b8debf283f3a4066960" + integrity sha512-9luZr/BZ2QeU6tO2uG8N2aZpVSli4TSAOAqFOyTO51AJcD9P99c0K1h6dD6r6qo5dyT44BR5exweOaLLeldTkQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +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.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +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.6.0, source-map@^0.6.1, 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== + +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== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +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== + +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.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== + 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" + tweetnacl "~0.14.0" + +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" + +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.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= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + 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== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +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" + +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" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + 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== + +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@^1.0.2 || 2": + 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" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0: + 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: + 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" + +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.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +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= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +style-loader@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.4.tgz#1ad81283cefe51096756fd62697258edad933230" + integrity sha512-SbBHRD8fwK3pX+4UDF4ETxUF0+rCvk29LWTTI7Rt0cgsDjAj3SWM76ByTe6u2+4IlJ/WwluB7wuslWETCoPQdg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + +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== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +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: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.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" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +terser-webpack-plugin@^1.4.3: + 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== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.11" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.11.tgz#12ff99fdd62a26de2a82f508515407eb6ccd8a9f" + integrity sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +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== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +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== + 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= + +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@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +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-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@^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" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +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== + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +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-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +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== + +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== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +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== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +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.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + 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== + dependencies: + imurmurhash "^0.1.4" + +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" + +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: + 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-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-3.0.0.tgz#9f1f11b371acf6e51ed15a50db635e02eec18368" + integrity sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.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" + +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== + +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@~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== + 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.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +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== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +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== + +vue-hot-reload-api@^2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== + +vue-loader@^15.9.1: + version "15.9.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.1.tgz#bd2ab8f3d281e51d7b81d15390a58424d142243e" + integrity sha512-IaPU2KOPjs/QjMlxFs/TiTtQUSbftQ7lsAvoxe21rtcQohsMhx+1AltXCNhZIpIn46PtODiAgz+o8RbMpKtmJw== + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" + integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + +watchpack@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== + dependencies: + chokidar "^2.1.8" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webpack-bundle-analyzer@^3.6.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f" + integrity sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA== + dependencies: + 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" + opener "^1.5.1" + ws "^6.0.0" + +webpack-cli@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.42.1: + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + 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.3" + 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.3" + watchpack "^1.6.1" + webpack-sources "^1.4.1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +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, which@^1.2.14, which@^1.2.9, which@^1.3.1: + 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" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +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== + dependencies: + errno "~0.1.7" + +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" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.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.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +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== + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +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.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.0: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + 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" From 437a80c9a7dc6349b66e29cc29aea084d63a9299 Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Fri, 8 May 2020 10:27:12 +1000 Subject: [PATCH 12/16] Refactoring `.gitlab-ci.yml` for Gitlab >= 13.0 Migrate from only/except to rules. Replace checks for file changes for more security. --- .gitlab-ci.yml | 156 +++++++++++++++++++------------------------------ 1 file changed, 61 insertions(+), 95 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e4a59de..9a1dff91 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,28 +40,14 @@ stages: script: - make test ENVS=$TOX_ENVS - make build-clean - except: - refs: - - tags - only: - refs: - - merge_requests - - web - - master - changes: - - polemarch/main/**/* - - polemarch/api/**/* - - polemarch/__init__.py - - tests.py - - setup.{py,cfg} - - MANIFEST.in - - requirements.txt - - requirements-test.txt - - Makefile - - tox.ini - - .coveragerc - - .gitlab-ci.yml - retry: 2 + rules: + - if: '$CI_COMMIT_BRANCH == "master"' + when: on_success + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "external_pull_request_event"' + when: on_success + - if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_TAG == null' + when: on_success + - when: never # Branch tests ########################################### @@ -71,17 +57,8 @@ code_style: TOX_ARGS: "--workdir /cache/.tox_polemarch_code" script: - make test ENVS=flake,pylint,jshint - except: - refs: - - tags - - issue_building - only: - refs: - - merge_requests - - web - retry: 2 -py37-coverage: +py38-coverage: <<: *branch_tests variables: TOX_ENVS: "$CI_BUILD_NAME" @@ -93,47 +70,45 @@ py36-install: # Realese ########################################### -deploy_environment: - stage: release - image: vstconsulting/images:tox - services: - - name: "docker:19.03-dind" - alias: "docker_service_host" - script: - - tox -e deploy_env - environment: - name: review/$CI_COMMIT_REF_NAME - on_stop: delete_environment - url: http://polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN - only: - kubernetes: active - refs: - - branches - when: manual - -delete_environment: - stage: release - image: vstconsulting/images:tox - script: - - tox -e destroy_env - environment: - name: review/$CI_COMMIT_REF_NAME - action: stop - only: - kubernetes: active - refs: - - branches - when: manual +#deploy_environment: +# stage: release +# image: vstconsulting/images:tox +# services: +# - name: "docker:19.03-dind" +# alias: "docker_service_host" +# script: +# - tox -e deploy_env +# environment: +# name: review/$CI_COMMIT_REF_NAME +# on_stop: delete_environment +# url: http://polemarch-$KUBE_NAMESPACE.$KUBE_INGRESS_BASE_DOMAIN +# only: +# kubernetes: active +# refs: +# - branches +# when: manual +# +#delete_environment: +# stage: release +# image: vstconsulting/images:tox +# script: +# - tox -e destroy_env +# environment: +# name: review/$CI_COMMIT_REF_NAME +# action: stop +# only: +# kubernetes: active +# refs: +# - branches +# when: manual release: stage: release image: vstconsulting/images:tox - only: - refs: - - master - variables: - - $GIT_ACCESS_USER - - $GIT_ACCESS_PASSWORD + rules: + - if: '$CI_COMMIT_BRANCH == "master" && $GIT_ACCESS_USER && $GIT_ACCESS_PASSWORD' + when: on_success + - when: never before_script: - url_host=`echo "${CI_REPOSITORY_URL}" | sed -e "s/https:\/\/gitlab-ci-token:.*@//g"` - git config --global user.name "${GITLAB_USER_NAME}" @@ -150,27 +125,24 @@ pages: artifacts: paths: - public - only: - refs: - - developer - - tags - when: always + rules: + - if: '$CI_COMMIT_BRANCH == "developer" && $GIT_ACCESS_USER && $GIT_ACCESS_PASSWORD' + when: always + - when: never release_pypi: stage: release image: vstconsulting/images:build - only: - refs: - - tags - variables: - - $PYPI_UPLOAD_PASSWORD - - $PYPI_UPLOAD_NAME + rules: + - if: '$CI_COMMIT_TAG && $PYPI_UPLOAD_PASSWORD && $PYPI_UPLOAD_NAME' + when: on_success + allow_failure: true + - when: never variables: TOX_ARGS: "" script: - make test ENVS=build - twine upload -u ${PYPI_UPLOAD_NAME} -p ${PYPI_UPLOAD_PASSWORD} $(find dist/*.{tar.gz,whl}) - allow_failure: true artifacts: name: "release-packages-${CI_BUILD_REF_NAME}.${CI_BUILD_ID}" paths: @@ -185,26 +157,20 @@ publish_docker: script: - pip install tox - tox -e release-docker - only: - refs: - - tags - variables: - - $POLEMARCH_DOCKER_USER - - $POLEMARCH_DOCKER_PASSWORD - - $POLEMARCH_DOCKER_EMAIL - - $POLEMARCH_DOCKER_IMAGE_NAME + rules: + - if: '$CI_COMMIT_TAG && $POLEMARCH_DOCKER_USER && $POLEMARCH_DOCKER_PASSWORD && $POLEMARCH_DOCKER_EMAIL && $POLEMARCH_DOCKER_IMAGE_NAME' + when: on_success + - when: never publish_release: stage: publish image: vstconsulting/images:tox allow_failure: true needs: ["release_pypi"] - only: - refs: - - tags - variables: - - $PYPI_UPLOAD_PASSWORD - - $PYPI_UPLOAD_NAME + rules: + - if: '$CI_COMMIT_TAG && $PYPI_UPLOAD_PASSWORD && $PYPI_UPLOAD_NAME' + when: on_success + - when: never variables: TOX_ARGS: "" before_script: From c2c043a99ca82794b7084633949c9a3028e1bd42 Mon Sep 17 00:00:00 2001 From: dem Date: Fri, 8 May 2020 11:54:42 +1000 Subject: [PATCH 13/16] Fix documentation static --- doc/_static/custom.css | 6 ---- doc/polemarch-sphinx-theme/layout.html | 38 +++++++++++++++----------- frontend_src/doc.css | 16 +++++++++++ frontend_src/doc.js | 2 ++ webpack.config.js | 3 +- 5 files changed, 42 insertions(+), 23 deletions(-) delete mode 100644 doc/_static/custom.css create mode 100644 frontend_src/doc.css create mode 100644 frontend_src/doc.js diff --git a/doc/_static/custom.css b/doc/_static/custom.css deleted file mode 100644 index fac8cc4c..00000000 --- a/doc/_static/custom.css +++ /dev/null @@ -1,6 +0,0 @@ -#indices-and-tables > h1 { - font-size: 140%; -} -.post { - border-bottom: none; -} \ No newline at end of file diff --git a/doc/polemarch-sphinx-theme/layout.html b/doc/polemarch-sphinx-theme/layout.html index 84ed4085..e17e2ab5 100644 --- a/doc/polemarch-sphinx-theme/layout.html +++ b/doc/polemarch-sphinx-theme/layout.html @@ -1,9 +1,8 @@ {% extends "vst-sphinx-theme/layout.html" %} -{%- block css %} - {{ super() }} - - +{%- block scripts %} + {{- super() }} + {%- endblock %} {% block logo %} @@ -14,16 +13,23 @@ {% endblock %} -{% block additional_information %} - - - -| - - - -| - - - +{% block footer %} + {% endblock %} \ No newline at end of file diff --git a/frontend_src/doc.css b/frontend_src/doc.css new file mode 100644 index 00000000..e8308c20 --- /dev/null +++ b/frontend_src/doc.css @@ -0,0 +1,16 @@ +#indices-and-tables > h1 { + font-size: 140%; +} +.post { + border-bottom: none; +} + +.main-footer { + display: flex; + justify-content: space-between; +} + +.social { + font-size: 20px; +} + diff --git a/frontend_src/doc.js b/frontend_src/doc.js new file mode 100644 index 00000000..1d8ec72d --- /dev/null +++ b/frontend_src/doc.js @@ -0,0 +1,2 @@ +import './polemarch-gui.css'; +import './doc.css'; diff --git a/webpack.config.js b/webpack.config.js index af550c83..38d1d0fa 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -26,7 +26,8 @@ function setMode() { const config = { mode: setMode(), entry: { - pmlib: entrypoints_dir + "/main.js" + pmlib: entrypoints_dir + "/main.js", + doc: entrypoints_dir + "/doc.js" }, output: { path: __dirname + "/polemarch/static/polemarch", From e7dee8f6177d606d2a12141503608aec2475b1b1 Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Fri, 8 May 2020 12:34:32 +1000 Subject: [PATCH 14/16] Remove make dependency from tests --- .gitlab-ci.yml | 16 ++++++---------- tox.ini | 33 ++++++++++++--------------------- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a1dff91..2cc53ef2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,8 +38,7 @@ stages: before_script: - if [ "${CI_BUILD_REF_NAME}" != "master" -a "${CI_BUILD_REF_NAME}" != "developer" ]; then export TOX_ARGS="--workdir /tmp/.tox_polemarchplus_${CI_BUILD_REF_NAME}"; fi script: - - make test ENVS=$TOX_ENVS - - make build-clean + - tox -e $TOX_ENVS $TOX_ARGS rules: - if: '$CI_COMMIT_BRANCH == "master"' when: on_success @@ -52,11 +51,10 @@ stages: # Branch tests ########################################### code_style: + <<: *branch_tests stage: code_standarts variables: - TOX_ARGS: "--workdir /cache/.tox_polemarch_code" - script: - - make test ENVS=flake,pylint,jshint + TOX_ENVS: "flake,pylint,jshint" py38-coverage: <<: *branch_tests @@ -120,7 +118,7 @@ release: pages: stage: release script: - - make test ENVS=builddoc + - tox -e builddoc $TOX_ARGS - mv doc/_build/html public artifacts: paths: @@ -141,7 +139,7 @@ release_pypi: variables: TOX_ARGS: "" script: - - make test ENVS=build + - tox -e build $TOX_ARGS - twine upload -u ${PYPI_UPLOAD_NAME} -p ${PYPI_UPLOAD_PASSWORD} $(find dist/*.{tar.gz,whl}) artifacts: name: "release-packages-${CI_BUILD_REF_NAME}.${CI_BUILD_ID}" @@ -171,11 +169,9 @@ publish_release: - if: '$CI_COMMIT_TAG && $PYPI_UPLOAD_PASSWORD && $PYPI_UPLOAD_NAME' when: on_success - when: never - variables: - TOX_ARGS: "" before_script: - git config --global user.name "${GITLAB_USER_NAME}" - git config --global user.email "${GITLAB_USER_EMAIL}" - git push https://${GITHUB_USER}:${GITHUB_TOKEN}@github.com/vstconsulting/polemarch.git ${CI_COMMIT_TAG} || echo "Failed to upload to github." script: - - make test ENVS=release + - tox -e release diff --git a/tox.ini b/tox.ini index d089d40e..9690a70a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{35,36,37}-{coverage,install},flake,pylint +envlist = py3{6,7,8}-{coverage,install},flake,pylint,jshint skipsdist = True setenv = PIP_CONFIG_FILE=.pip.conf whitelist_externals = @@ -11,42 +11,33 @@ setenv = CCACHE_DIR = {envdir}/.ccache passenv = DJANGO_LOG_LEVEL CC + BUILD_COMPILE whitelist_externals = rm + ls + ln bash - echo - make + mkdir commands = - pip uninstall polemarch -y - install: make wheel PY=python COMPILE_DIR={envdir}/dist - install: bash -c "for i in `ls {envdir}/dist`; do pip install -U {envdir}/dist/$i; rm {envdir}/dist/$i; done" + install: rm -rfv {envdir}/dist/ + install: python setup.py bdist_wheel --dist-dir {envdir}/dist/ + install: bash -c "export BUILD_COMPILE=true; pip install -U {envdir}/dist/$(ls {envdir}/dist)[all]" coverage: python setup.py install_egg_info coverage: pip install -U -e . - bash -c 'echo -ne "try: from yaml import CLoader; print(\"YAML with CLoader\")\nexcept: print(\"YAML without CLoader\")\n" | python' - install: pip freeze install: rm -f {envdir}/tests.py {envdir}/tests.pyc - install: bash -c "cd {envdir} && ln -sv {toxinidir}/tests.py && polemarchctl test -v 2 --failfast --parallel=4" + install: bash -c "cd {envdir} && ln -s {toxinidir}/tests.py && python -m polemarch test -v 2 --failfast --parallel 8" coverage: coverage debug sys coverage: coverage erase - coverage: coverage run -m polemarch test -v 2 --failfast --parallel=4 {posargs} + coverage: coverage run -m polemarch test -v 2 --failfast --parallel 8 {posargs} coverage: coverage combine coverage: coverage report - rm -rf .eggs build polemarch.egg-info dist + rm -rf .eggs build polemarch.egg-info {envdir}/dist install: pip uninstall polemarch -y deps = - coverage: -rrequirements.txt - install: cython>=0.29.2 - -rrequirements-doc.txt + -rrequirements.txt -rrequirements-git.txt -rrequirements-test.txt -[testenv:pep] -basepython = python3 -deps = - pep8 -commands = - pep8 - [testenv:flake] basepython = python3.6 deps = From 0461b80552aeb29c713ba5fc3d1bcdca3b93a466 Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Fri, 8 May 2020 14:18:16 +1000 Subject: [PATCH 15/16] Update compilation block --- setup.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index a260d5d2..67f471ff 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,12 @@ # Compilation block ######################################################################################## +import re import os import sys import fnmatch import codecs import gzip +import glob import shutil # allow setup.py to be run from any path @@ -32,6 +34,8 @@ ignored_keys = ['-h', '--help', '--version'] is_help = any([a for a in ignored_keys if a in sys.argv]) +is_develop = 'develop' in sys.argv +is_build = (any([a for a in ['compile', 'bdist_wheel', 'bdist'] if a in sys.argv]) or is_develop) and not is_help def get_discription(file_path='README.rst', folder=os.getcwd()): @@ -117,7 +121,7 @@ def make_extensions(extensions_list, packages): '-g0', '-ggdb1', "-fno-strict-aliasing", "-fno-var-tracking-assignments", - "-pipe", "-std=c99" + "-pipe", "-std=c99", '-Werror=sign-compare' ] ext_modules = list( make_extention(m, f, extra_compile_args) @@ -161,23 +165,51 @@ def minify_static_files(base_dir, files, exclude=None): except: pass + regex_exclude = [re.compile(r, re.MULTILINE) for r in exclude] + for fnext, funcs in patterns.items(): for fext_file in filter(lambda f: fnmatch.fnmatch(f, fnext), files): if fnmatch.fnmatch(fext_file, '*.min.*'): continue - if any(filter(lambda fp: fext_file.endswith(fp), exclude)): - continue fext_file = os.path.join(base_dir, fext_file) if os.path.exists(fext_file): - func, subfunc = funcs - with codecs.open(fext_file, 'r', encoding='utf-8') as static_file_fd: - minified = func(static_file_fd.read(), subfunc) - with codecs.open(fext_file, 'w', encoding='utf-8') as static_file_fd: - static_file_fd.write(minified) + if not any(filter(lambda fp: bool(fp.search(fext_file)), regex_exclude)): + func, subfunc = funcs + with codecs.open(fext_file, 'r', encoding='utf-8') as static_file_fd: + minified = func(static_file_fd.read(), subfunc) + with codecs.open(fext_file, 'w', encoding='utf-8') as static_file_fd: + static_file_fd.write(minified) + print('Minfied file {fext_file}.'.format(fext_file=fext_file)) with open(fext_file, 'rb') as f_in: with gzip.open("{}.gz".format(fext_file), 'wb') as f_out: shutil.copyfileobj(f_in, f_out) - print('Minfied file {}.'.format(fext_file)) + print('Compressed file {fext_file}.'.format(fext_file=fext_file)) + + +def compile_py_func(fullname, compile_file_func): + if compile_file_func(fullname, ddir=os.path.dirname(fullname), legacy=True, optimize=0): + os.remove(fullname) + + +def compile_python_sources(base_dir, files, exclude=None): + exclude = exclude or [] + patterns = dict() + try: + from compileall import compile_file + patterns['*.py'] = (compile_py_func, compile_file) + except: + pass + + regex_exclude = [re.compile(r, re.MULTILINE) for r in exclude] + + for fnext, funcs in patterns.items(): + for fext_file in filter(lambda f: fnmatch.fnmatch(f, fnext), files): + fext_file = os.path.join(base_dir, fext_file) + if os.path.exists(fext_file): + if not any(filter(lambda fp: bool(fp.search(fext_file)), regex_exclude)): + func, subfunc = funcs + funcs[0](fext_file, funcs[1]) + print('Compiled {fext_file}.'.format(fext_file=fext_file)) class _Compile(_sdist): @@ -275,6 +307,7 @@ def find_package_modules(self, package, package_dir): class install_lib(_install_lib): exclude = [] static_exclude = [] + compile_exclude = [] def _filter_files_with_ext(self, filename): _filename, _fext = os.path.splitext(filename) @@ -292,6 +325,8 @@ def install(self): print('Removing extention sources [{}].'.format(source)) os.remove(source) minify_static_files('', files, self.static_exclude) + if os.getenv('BUILD_COMPILE', '') == 'true': + compile_python_sources('', files, self.compile_exclude) return result @@ -317,6 +352,7 @@ def make_setup(**opts): if has_cython: build_py.exclude = ext_modules_list install_lib.static_exclude = static_exclude + install_lib.compile_exclude = opts.pop('compile_modules_exclude', list()) cmdclass.update({ 'build_ext': _build_ext, 'build_py': build_py, @@ -326,6 +362,16 @@ def make_setup(**opts): cmdclass['build_sphinx'] = BuildDoc cmdclass['githubrelease'] = GithubRelease opts['cmdclass'] = cmdclass + + webpack_path = os.path.join(os.getcwd(), 'webpack.config.js') + if os.path.exists(webpack_path) and is_build and os.environ.get('DONT_YARN', "") != 'true': + yarn_build_command = 'devBuild' if is_develop else 'build' + try: + os.system('yarn install --pure-lockfile') + os.system('yarn ' + yarn_build_command) + except Extension as err: + print(err) + setup(**opts) ######################################################################################## From 09e8cf23e6b1e16d138b462f721342f81c8319cb Mon Sep 17 00:00:00 2001 From: Sergey Kulukov Date: Fri, 8 May 2020 14:20:36 +1000 Subject: [PATCH 16/16] Bump version to 1.7.2 --- polemarch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polemarch/__init__.py b/polemarch/__init__.py index 55783a1e..84ca7a3d 100644 --- a/polemarch/__init__.py +++ b/polemarch/__init__.py @@ -31,6 +31,6 @@ "VST_ROOT_URLCONF": os.getenv("VST_ROOT_URLCONF", 'vstutils.urls'), } -__version__ = "1.7.1b1" +__version__ = "1.7.2" prepare_environment(**default_settings)