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/.gitlab-ci.yml b/.gitlab-ci.yml index 76741761..2cc53ef2 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,57 +32,31 @@ stages: ########################################### .branch_tests_template: &branch_tests stage: test - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox variables: TOX_ENVS: "" 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 - 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 + - tox -e $TOX_ENVS $TOX_ARGS + 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 ########################################### code_style: + <<: *branch_tests stage: code_standarts - image: onegreyonewhite/tox:tox variables: - 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 + TOX_ENVS: "flake,pylint,jshint" -py37-coverage: +py38-coverage: <<: *branch_tests variables: TOX_ENVS: "$CI_BUILD_NAME" @@ -93,47 +68,45 @@ py36-install: # Realese ########################################### -deploy_environment: - stage: release - image: onegreyonewhite/tox: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: onegreyonewhite/tox: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: onegreyonewhite/tox:tox - only: - refs: - - master - variables: - - $GIT_ACCESS_USER - - $GIT_ACCESS_PASSWORD + image: vstconsulting/images:tox + 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}" @@ -145,32 +118,29 @@ release: pages: stage: release script: - - make test ENVS=builddoc + - tox -e builddoc $TOX_ARGS - mv doc/_build/html public 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: onegreyonewhite/tox:centos6 - only: - refs: - - tags - variables: - - $PYPI_UPLOAD_PASSWORD - - $PYPI_UPLOAD_NAME + image: vstconsulting/images:build + 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 + - tox -e build $TOX_ARGS - 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: @@ -178,38 +148,30 @@ release_pypi: publish_docker: stage: publish - image: onegreyonewhite/tox:tox + image: vstconsulting/images:tox services: - name: 'docker:19.03-dind' alias: 'docker_service_host' 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: onegreyonewhite/tox:ubuntu + image: vstconsulting/images:tox allow_failure: true needs: ["release_pypi"] - only: - refs: - - tags - variables: - - $PYPI_UPLOAD_PASSWORD - - $PYPI_UPLOAD_NAME - variables: - TOX_ARGS: "" + rules: + - if: '$CI_COMMIT_TAG && $PYPI_UPLOAD_PASSWORD && $PYPI_UPLOAD_NAME' + when: on_success + - when: never 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/.jshintrc b/.jshintrc index 18ff280c..79c8a8ab 100644 --- a/.jshintrc +++ b/.jshintrc @@ -17,54 +17,15 @@ "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 + "$": true, + "spa": true } } \ No newline at end of file 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." 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/api_schema.yaml b/doc/api_schema.yaml index 4df54f38..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 @@ -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 - 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 schemes: - http diff --git a/doc/installation.rst b/doc/installation.rst index 3472cf49..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` @@ -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 ~~~~~~~~~~~ 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/.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 @@ + + + + {{ $t('quick playbook execution form') | capitalize }} + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + {{ $t('statistic') | capitalize }} + + + + {{ $t(line.name) }} + + + + + {{ progressBarsData[line.name].sum }} + + + + / + + + {{ progressBarsData[line.name].all }} + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + {{ $t('period') | capitalize }} + + + + {{ $t(option.title) }} + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + {{ $t('error') | capitalize }} {{ error.status }} + + + + + + + + + + + + + + + + + + + + {{ error_data }} + + + + + + + + + + + + + {{ $t(title.toLowerCase()) | capitalize }} + + + + + + + + + + + + + + + + + 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/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/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 @@ + + {{ value }} + + + + + 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 @@ + + {{ value }} + + + + + 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 c120b069..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, 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'); } - }; /** * 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 @@ + + + + {{ $t('stdout') }} + ( + + {{ $t('full raw stdout') | capitalize }} + + ) + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + Error {{ error.status }} + + + + + + + + + + + + + + + + + {{ error_data }} + + + + + + + + + + + + + + + + + {{ title | capitalize | split }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('execution output') | capitalize }} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('detail') | capitalize }} + + + + + + + + + + + + + + + + + + + + + + + + + + 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 76% rename from polemarch/static/css/polemarch-gui.css rename to frontend_src/polemarch-gui.css index cc41bdf6..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; @@ -319,19 +307,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; @@ -339,7 +314,7 @@ body { .chart-period-select { width: 100%; - height: 30px!important; + height: 30px !important; line-height: 30px; padding: 3px 12px; display: inline-block; @@ -348,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; } @@ -381,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 4ed032e6..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/' + 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; - 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/__init__.py b/polemarch/__init__.py index 2030adcf..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.6.2" +__version__ = "1.7.2" prepare_environment(**default_settings) 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 94ecd1de..24c2bda0 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', }, ] }, @@ -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/_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..a8686082 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( @@ -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/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..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) @@ -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/js/common.js b/polemarch/static/js/common.js deleted file mode 100644 index 474d63c2..00000000 --- a/polemarch/static/js/common.js +++ /dev/null @@ -1,23 +0,0 @@ -if(window.moment && window.moment.tz) -{ - window.moment.tz.setDefault(window.timeZone); -} - -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'); 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 6080cb1a..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/' + my_user_id + '/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(window.timeZone).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(window.timeZone).format("x"); - time = moment(time).tz(window.timeZone).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(window.timeZone).format("x"); - time = moment(time).tz(window.timeZone).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/" + my_user_id + "/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]: my_user_id}).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 ca9d1807..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/' + api_version + '/' + url + '/raw'; /* globals api_version */ - }, - /** - * 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 b3aace6a..00000000 --- a/polemarch/static/js/pmItems.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Redefinition of logo Vue component. - */ -vst_vue_components.items.logo = Vue.component('logo', { - props: ['title'], - 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/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/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 09df5123..feed0e8c 100644 --- a/requirements-doc.txt +++ b/requirements-doc.txt @@ -1,2 +1,2 @@ # Docs -vstutils[doc]~=2.15.2 +vstutils[doc]~=3.0.13 diff --git a/requirements.txt b/requirements.txt index 5788d91e..13ae2e76 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,11 @@ # Main -vstutils[rpc,ldap,doc,prod]~=2.15.2 +vstutils[rpc,ldap,doc,prod]~=3.0.13 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 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 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) ######################################################################################## diff --git a/tox.ini b/tox.ini index cafc088a..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,41 +11,33 @@ setenv = CCACHE_DIR = {envdir}/.ccache passenv = DJANGO_LOG_LEVEL CC + BUILD_COMPILE whitelist_externals = rm + ls + ln bash - echo + 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 = @@ -59,7 +51,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/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] diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..38d1d0fa --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,111 @@ +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", + doc: entrypoints_dir + "/doc.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"
{{ error_data }}