From 2e76d5dd327a09ae7e9b0283ae85c4d1b8790e80 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 22 Apr 2021 14:39:51 -0700 Subject: [PATCH] Removed Angular UI --- ui/.browserslistrc | 12 - ui/.editorconfig | 13 - ui/.nvmrc | 1 - ui/README.md | 111 - ui/angular.json | 138 - ui/build.gradle | 36 - ui/build.js | 20 - ui/e2e/app.e2e-spec.ts | 14 - ui/e2e/app.po.ts | 11 - ui/e2e/tsconfig.e2e.json | 14 - ui/karma.conf.js | 52 - ui/package-lock.json | 20035 ---------------- ui/package.json | 79 - ui/protractor.conf.js | 28 - ui/proxy.conf.json | 22 - .../admin/action/admin-collection.action.ts | 117 - .../action/metadata-collection.action.ts | 90 - ui/src/app/admin/admin.component.html | 1 - ui/src/app/admin/admin.component.spec.ts | 36 - ui/src/app/admin/admin.component.ts | 10 - ui/src/app/admin/admin.module.ts | 55 - .../component/access-request.component.html | 53 - .../access-request.component.spec.ts | 65 - .../component/access-request.component.ts | 19 - .../delete-user-dialog.component.html | 16 - .../delete-user-dialog.component.spec.ts | 55 - .../component/delete-user-dialog.component.ts | 14 - .../component/enable-metadata.component.html | 4 - .../enable-metadata.component.spec.ts | 65 - .../component/enable-metadata.component.ts | 60 - .../component/user-management.component.html | 42 - .../user-management.component.spec.ts | 64 - .../component/user-management.component.ts | 67 - .../container/action-required.component.html | 27 - .../container/action-required.component.ts | 12 - .../container/admin-management.component.html | 15 - .../admin-management.component.spec.ts | 68 - .../container/admin-management.component.ts | 12 - .../effect/admin-collection.effect.spec.ts | 84 - .../admin/effect/admin-collection.effect.ts | 93 - .../effect/metadata-collection.effect.spec.ts | 80 - .../effect/metadata-collection.effect.ts | 143 - ui/src/app/admin/model/admin.ts | 11 - .../reducer/admin-collection.reducer.spec.ts | 79 - .../admin/reducer/admin-collection.reducer.ts | 54 - ui/src/app/admin/reducer/index.spec.ts | 54 - ui/src/app/admin/reducer/index.ts | 64 - .../metadata-collection.reducer.spec.ts | 72 - .../reducer/metadata-collection.reducer.ts | 59 - .../app/admin/service/admin.service.spec.ts | 77 - ui/src/app/admin/service/admin.service.ts | 44 - ui/src/app/app.brand.ts | 45 - ui/src/app/app.component.html | 96 - ui/src/app/app.component.scss | 27 - ui/src/app/app.component.spec.ts | 87 - ui/src/app/app.component.ts | 61 - ui/src/app/app.constant.ts | 2 - ui/src/app/app.module.ts | 97 - ui/src/app/app.reducer.ts | 14 - ui/src/app/app.routing.ts | 27 - .../contention/action/contention.action.ts | 31 - .../component/change-item.component.html | 41 - .../component/change-item.component.scss | 12 - .../component/change-item.component.spec.ts | 0 .../component/change-item.component.ts | 81 - .../contention-dialog.component.html | 51 - .../contention-dialog.component.scss | 0 .../contention-dialog.component.spec.ts | 0 .../component/contention-dialog.component.ts | 40 - ui/src/app/contention/contention.module.ts | 34 - .../contention/effect/contention.effect.ts | 53 - ui/src/app/contention/model/contention.ts | 71 - .../reducer/contention.reducer.spec.ts | 59 - .../contention/reducer/contention.reducer.ts | 32 - ui/src/app/contention/reducer/index.spec.ts | 0 ui/src/app/contention/reducer/index.ts | 22 - .../contention/service/contention.service.ts | 36 - .../app/core/action/configuration.action.ts | 29 - ui/src/app/core/action/location.action.ts | 14 - ui/src/app/core/action/user.action.ts | 43 - ui/src/app/core/action/version.action.ts | 31 - .../component/page-title.component.spec.ts | 65 - .../core/component/page-title.component.ts | 80 - ui/src/app/core/core.module.spec.ts | 23 - ui/src/app/core/core.module.ts | 58 - ui/src/app/core/effect/user.effect.spec.ts | 54 - ui/src/app/core/effect/user.effect.ts | 62 - ui/src/app/core/effect/version.effect.spec.ts | 59 - ui/src/app/core/effect/version.effect.ts | 35 - ui/src/app/core/model/action.ts | 8 - ui/src/app/core/model/brand.ts | 29 - ui/src/app/core/model/query.ts | 6 - ui/src/app/core/model/user.ts | 7 - ui/src/app/core/model/version.ts | 16 - .../reducer/configuration.reducer.spec.ts | 35 - .../app/core/reducer/configuration.reducer.ts | 25 - ui/src/app/core/reducer/index.spec.ts | 42 - ui/src/app/core/reducer/index.ts | 58 - ui/src/app/core/reducer/location.reducer.ts | 23 - ui/src/app/core/reducer/user.reducer.spec.ts | 76 - ui/src/app/core/reducer/user.reducer.ts | 51 - .../app/core/reducer/version.reducer.spec.ts | 98 - ui/src/app/core/reducer/version.reducer.ts | 47 - ui/src/app/core/service/admin.guard.ts | 37 - .../core/service/api-path.interceptor.spec.ts | 41 - .../app/core/service/api-path.interceptor.ts | 15 - .../core/service/authorized.interceptor.ts | 27 - ui/src/app/core/service/cache.interceptor.ts | 50 - .../core/service/can-deactivate.guard.spec.ts | 49 - .../app/core/service/can-deactivate.guard.ts | 27 - .../app/core/service/differential.service.ts | 25 - ui/src/app/core/service/error.interceptor.ts | 48 - ui/src/app/core/service/file.service.spec.ts | 33 - ui/src/app/core/service/file.service.ts | 22 - ui/src/app/core/service/modal.service.spec.ts | 51 - ui/src/app/core/service/modal.service.ts | 26 - .../core/service/navigation.service.spec.ts | 50 - ui/src/app/core/service/navigation.service.ts | 30 - ui/src/app/core/service/navigator.service.ts | 10 - ui/src/app/core/service/user.service.spec.ts | 23 - ui/src/app/core/service/user.service.ts | 27 - .../container/dashboard.component.html | 37 - .../container/dashboard.component.scss | 15 - .../container/dashboard.component.ts | 36 - ui/src/app/dashboard/dashboard.module.ts | 29 - ui/src/app/dashboard/dashboard.routing.ts | 76 - ui/src/app/i18n/action/message.action.ts | 39 - .../i18n/component/i18n-text.component.html | 69 - .../component/i18n-text.component.spec.ts | 76 - .../app/i18n/component/i18n-text.component.ts | 11 - .../component/translate.component.spec.ts | 75 - .../app/i18n/component/translate.component.ts | 66 - ui/src/app/i18n/effect/message.effect.spec.ts | 76 - ui/src/app/i18n/effect/message.effect.ts | 51 - ui/src/app/i18n/i18n.module.spec.ts | 25 - ui/src/app/i18n/i18n.module.ts | 58 - ui/src/app/i18n/model/Messages.ts | 3 - ui/src/app/i18n/pipe/i18n.pipe.spec.ts | 69 - ui/src/app/i18n/pipe/i18n.pipe.ts | 35 - ui/src/app/i18n/reducer/index.ts | 30 - ui/src/app/i18n/reducer/message.reducer.ts | 60 - ui/src/app/i18n/service/i18n.service.spec.ts | 81 - ui/src/app/i18n/service/i18n.service.ts | 48 - .../configuration/action/compare.action.ts | 52 - .../action/configuration.action.ts | 112 - .../configuration/action/filter.action.ts | 62 - .../configuration/action/history.action.ts | 52 - .../configuration/action/restore.action.ts | 70 - .../configuration/action/version.action.ts | 40 - .../component/editor.component.html | 14 - .../component/editor.component.ts | 29 - ...ter-configuration-list-item.component.html | 46 - ...ilter-configuration-list-item.component.ts | 53 - .../filter-configuration-list.component.html | 18 - .../filter-configuration-list.component.ts | 10 - .../filter-version-list.component.html | 51 - .../filter-version-list.component.spec.ts | 80 - .../filter-version-list.component.ts | 40 - .../component/history-list.component.html | 43 - .../component/history-list.component.spec.ts | 94 - .../component/history-list.component.ts | 38 - .../metadata-configuration.component.html | 40 - .../metadata-configuration.component.scss | 18 - .../metadata-configuration.component.spec.ts | 92 - .../metadata-configuration.component.ts | 46 - .../component/metadata-header.component.html | 22 - .../metadata-header.component.spec.ts | 56 - .../component/metadata-header.component.ts | 21 - .../property/array-property.component.html | 90 - .../property/array-property.component.scss | 0 .../property/array-property.component.spec.ts | 91 - .../property/array-property.component.ts | 40 - .../configuration-property.component.spec.ts | 70 - .../configuration-property.component.ts | 29 - .../filter-target-property.component.html | 9 - .../filter-target-property.component.spec.ts | 63 - .../filter-target-property.component.ts | 26 - .../property/object-property.component.html | 18 - .../object-property.component.spec.ts | 62 - .../property/object-property.component.ts | 19 - .../primitive-property.component.html | 18 - .../primitive-property.component.spec.ts | 61 - .../property/primitive-property.component.ts | 14 - .../configuration/configuration.module.ts | 124 - .../configuration/configuration.routing.ts | 79 - .../configuration/configuration.values.ts | 17 - .../container/configuration.component.html | 21 - .../container/configuration.component.spec.ts | 56 - .../container/configuration.component.ts | 46 - .../metadata-comparison.component.html | 55 - .../metadata-comparison.component.spec.ts | 0 .../metadata-comparison.component.ts | 62 - .../container/metadata-history.component.html | 13 - .../metadata-history.component.spec.ts | 126 - .../container/metadata-history.component.ts | 80 - .../container/metadata-options.component.html | 84 - .../metadata-options.component.spec.ts | 151 - .../container/metadata-options.component.ts | 148 - .../container/metadata-xml.component.html | 32 - .../container/metadata-xml.component.spec.ts | 66 - .../container/metadata-xml.component.ts | 33 - .../restore-edit-step.component.html | 9 - .../restore-edit-step.component.spec.ts | 107 - .../container/restore-edit-step.component.ts | 84 - .../container/restore-edit.component.html | 50 - .../container/restore-edit.component.spec.ts | 79 - .../container/restore-edit.component.ts | 49 - .../container/restore.component.html | 25 - .../container/restore.component.spec.ts | 79 - .../container/restore.component.ts | 42 - .../container/version-options.component.html | 46 - .../version-options.component.spec.ts | 82 - .../container/version-options.component.ts | 73 - .../container/version.component.html | 1 - .../container/version.component.spec.ts | 56 - .../container/version.component.ts | 42 - .../configuration/effect/compare.effect.ts | 48 - .../effect/configuration.effect.ts | 154 - .../configuration/effect/filter.effect.ts | 63 - .../configuration/effect/history.effect.ts | 34 - .../configuration/effect/restore.effect.ts | 161 - .../configuration/effect/version.effect.ts | 32 - .../metadata/configuration/model/compare.ts | 8 - .../metadata/configuration/model/history.ts | 5 - .../model/metadata-configuration.ts | 12 - .../metadata/configuration/model/request.ts | 5 - .../metadata/configuration/model/schema.ts | 3 - .../metadata/configuration/model/section.ts | 21 - .../metadata/configuration/model/version.ts | 12 - .../reducer/compare.reducer.spec.ts | 53 - .../configuration/reducer/compare.reducer.ts | 58 - .../reducer/configuration.reducer.spec.ts | 107 - .../reducer/configuration.reducer.ts | 61 - .../reducer/filter.reducer.spec.ts | 93 - .../configuration/reducer/filter.reducer.ts | 57 - .../reducer/history.reducer.spec.ts | 70 - .../configuration/reducer/history.reducer.ts | 65 - .../configuration/reducer/index.spec.ts | 56 - .../metadata/configuration/reducer/index.ts | 323 - .../reducer/restore.reducer.spec.ts | 98 - .../configuration/reducer/restore.reducer.ts | 54 - .../configuration/reducer/utilities.spec.ts | 120 - .../configuration/reducer/utilities.ts | 138 - .../reducer/version.reducer.spec.ts | 108 - .../configuration/reducer/version.reducer.ts | 62 - .../service/configuration.service.spec.ts | 117 - .../service/configuration.service.ts | 49 - .../service/history.service.spec.ts | 83 - .../configuration/service/history.service.ts | 47 - .../service/index-resolver.service.ts | 14 - .../metadata/domain/action/entity.action.ts | 16 - .../component/editor-nav.component.html | 50 - .../component/editor-nav.component.spec.ts | 93 - .../domain/component/editor-nav.component.ts | 50 - .../component/preview-dialog.component.html | 16 - .../preview-dialog.component.spec.ts | 48 - .../component/preview-dialog.component.ts | 25 - .../component/summary-property.component.html | 88 - .../summary-property.component.spec.ts | 129 - .../component/summary-property.component.ts | 37 - .../component/unsaved-entity.dialog.html | 32 - .../component/unsaved-entity.dialog.spec.ts | 47 - .../domain/component/unsaved-entity.dialog.ts | 26 - ui/src/app/metadata/domain/domain.module.ts | 77 - ui/src/app/metadata/domain/domain.type.ts | 38 - .../app/metadata/domain/domain.util.spec.ts | 56 - ui/src/app/metadata/domain/domain.util.ts | 27 - .../domain/effect/entity.effect.spec.ts | 72 - .../metadata/domain/effect/entity.effect.ts | 61 - .../filter/entity-attributes-filter.spec.ts | 21 - .../entity/filter/entity-attributes-filter.ts | 83 - .../filter/nameid-format-filter.spec.ts | 21 - .../entity/filter/nameid-format-filter.ts | 66 - ui/src/app/metadata/domain/entity/index.ts | 2 - ...file-backed-http-metadata-resolver.spec.ts | 134 - .../file-backed-http-metadata-resolver.ts | 89 - ui/src/app/metadata/domain/model/index.ts | 15 - .../metadata/domain/model/metadata-base.ts | 7 - .../metadata/domain/model/metadata-entity.ts | 14 - .../metadata/domain/model/metadata-filter.ts | 10 - .../domain/model/metadata-provider.ts | 15 - .../domain/model/metadata-resolver.ts | 30 - .../domain/model/properties/certificate.ts | 5 - .../domain/model/properties/contact.ts | 5 - .../domain/model/properties/filter-target.ts | 4 - .../model/properties/logout-endpoint.ts | 4 - .../metadata/domain/model/properties/mdui.ts | 9 - .../domain/model/properties/organization.ts | 5 - .../model/properties/release-attribute.ts | 4 - .../properties/relying-party-overrides.ts | 11 - .../domain/model/properties/security-info.ts | 8 - .../domain/model/properties/sso-descriptor.ts | 4 - .../domain/model/properties/sso-service.ts | 5 - ui/src/app/metadata/domain/model/property.ts | 16 - .../model/providers/base-metadata-provider.ts | 5 - .../dynamic-http-metadata-provider.ts | 51 - .../file-backed-http-metadata-provider.ts | 7 - .../file-system-metadata-provider.ts | 7 - .../metadata/domain/model/providers/index.ts | 2 - .../local-dynamic-metadata-provider.ts | 7 - .../wizards/metadata-source-base.spec.ts | 99 - .../model/wizards/metadata-source-base.ts | 126 - .../model/wizards/metadata-source-editor.ts | 129 - .../model/wizards/metadata-source-wizard.ts | 152 - .../domain/service/attributes.service.spec.ts | 42 - .../domain/service/attributes.service.ts | 39 - .../domain/service/draft.service.spec.ts | 106 - .../metadata/domain/service/draft.service.ts | 59 - .../domain/service/entity-id.service.spec.ts | 39 - .../domain/service/entity-id.service.ts | 51 - .../service/entity-validators.service.spec.ts | 111 - .../service/entity-validators.service.ts | 55 - .../domain/service/filter.service.spec.ts | 76 - .../metadata/domain/service/filter.service.ts | 46 - .../service/list-values.service.spec.ts | 51 - .../domain/service/list-values.service.ts | 50 - .../provider-change-emitter.service.spec.ts | 40 - .../provider-change-emitter.service.ts | 25 - .../domain/service/provider.service.spec.ts | 74 - .../domain/service/provider.service.ts | 50 - .../domain/service/resolver.service.spec.ts | 179 - .../domain/service/resolver.service.ts | 74 - .../domain/utility/configuration.spec.ts | 62 - .../metadata/domain/utility/configuration.ts | 45 - .../filter/action/collection.action.ts | 240 - .../metadata/filter/action/editor.action.ts | 20 - .../filter/action/filter.action.spec.ts | 8 - .../metadata/filter/action/filter.action.ts | 75 - .../filter/action/search.action.spec.ts | 0 .../metadata/filter/action/search.action.ts | 52 - .../component/filter-list.component.html | 62 - .../component/filter-list.component.scss | 17 - .../component/filter-list.component.spec.ts | 30 - .../filter/component/filter-list.component.ts | 25 - .../component/search-dialog.component.html | 54 - .../component/search-dialog.component.scss | 6 - .../component/search-dialog.component.spec.ts | 62 - .../component/search-dialog.component.ts | 55 - .../container/edit-filter-step.component.html | 16 - .../container/edit-filter-step.component.ts | 141 - .../container/edit-filter.component.html | 54 - .../container/edit-filter.component.spec.ts | 90 - .../filter/container/edit-filter.component.ts | 114 - .../filter/container/filter.component.html | 3 - .../filter/container/filter.component.spec.ts | 0 .../filter/container/filter.component.ts | 39 - .../container/new-filter-step.component.html | 15 - .../container/new-filter-step.component.ts | 104 - .../container/new-filter.component.html | 63 - .../container/new-filter.component.spec.ts | 79 - .../filter/container/new-filter.component.ts | 127 - .../container/select-filter.component.html | 3 - .../container/select-filter.component.scss | 0 .../container/select-filter.component.spec.ts | 0 .../container/select-filter.component.ts | 53 - .../filter/effect/collection.effect.spec.ts | 38 - .../filter/effect/collection.effect.ts | 333 - .../metadata/filter/effect/editor.effect.ts | 52 - .../metadata/filter/effect/filter.effect.ts | 83 - .../metadata/filter/effect/search.effect.ts | 66 - ui/src/app/metadata/filter/filter.module.ts | 77 - .../filter/guard/filter-exists.guard.ts | 66 - .../entity-attributes-configuration.filter.ts | 38 - .../model/entity-attributes.filter.spec.ts | 45 - .../filter/model/entity-attributes.filter.ts | 82 - ui/src/app/metadata/filter/model/index.ts | 17 - .../model/nameid-configuration.filter.ts | 31 - .../filter/model/nameid.filter.spec.ts | 44 - .../metadata/filter/model/nameid.filter.ts | 62 - .../filter/reducer/collection.reducer.spec.ts | 170 - .../filter/reducer/collection.reducer.ts | 119 - .../metadata/filter/reducer/editor.reducer.ts | 40 - .../filter/reducer/filter.reducer.spec.ts | 76 - .../metadata/filter/reducer/filter.reducer.ts | 65 - .../app/metadata/filter/reducer/index.spec.ts | 107 - ui/src/app/metadata/filter/reducer/index.ts | 108 - .../filter/reducer/search.reducer.spec.ts | 137 - .../metadata/filter/reducer/search.reducer.ts | 75 - .../metadata/manager/action/search.action.ts | 34 - .../component/delete-dialog.component.html | 10 - .../component/delete-dialog.component.spec.ts | 55 - .../component/delete-dialog.component.ts | 15 - .../component/provider-search.component.html | 25 - .../component/provider-search.component.ts | 26 - .../component/resolvers-list.component.html | 68 - .../resolvers-list.component.spec.ts | 0 .../component/resolvers-list.component.ts | 18 - .../dashboard-providers-list.component.html | 69 - .../dashboard-providers-list.component.scss | 14 - ...dashboard-providers-list.component.spec.ts | 121 - .../dashboard-providers-list.component.ts | 100 - .../dashboard-resolvers-list.component.html | 19 - ...dashboard-resolvers-list.component.spec.ts | 144 - .../dashboard-resolvers-list.component.ts | 107 - .../manager/container/manager.component.html | 1 - .../manager/container/manager.component.scss | 15 - .../container/manager.component.spec.ts | 43 - .../manager/container/manager.component.ts | 21 - .../metadata/manager/effect/search.effects.ts | 51 - ui/src/app/metadata/manager/manager.module.ts | 68 - .../app/metadata/manager/manager.routing.ts | 3 - ui/src/app/metadata/manager/reducer/index.ts | 34 - .../manager/reducer/search.reducer.ts | 44 - ui/src/app/metadata/metadata.component.html | 1 - .../app/metadata/metadata.component.spec.ts | 54 - ui/src/app/metadata/metadata.component.ts | 11 - ui/src/app/metadata/metadata.module.ts | 72 - ui/src/app/metadata/metadata.routing.ts | 29 - .../provider/action/collection.action.ts | 214 - .../metadata/provider/action/editor.action.ts | 28 - .../metadata/provider/action/entity.action.ts | 27 - .../component/delete-filter.component.html | 10 - .../component/delete-filter.component.spec.ts | 55 - .../component/delete-filter.component.ts | 14 - .../provider-edit-step.component.html | 16 - .../provider-edit-step.component.spec.ts | 100 - .../container/provider-edit-step.component.ts | 141 - .../container/provider-edit.component.html | 74 - .../container/provider-edit.component.spec.ts | 151 - .../container/provider-edit.component.ts | 124 - .../provider-filter-list.component.html | 67 - .../provider-filter-list.component.scss | 17 - .../provider-filter-list.component.spec.ts | 76 - .../provider-filter-list.component.ts | 97 - .../container/provider-select.component.html | 3 - .../provider-select.component.spec.ts | 68 - .../container/provider-select.component.ts | 59 - .../provider-wizard-step.component.html | 9 - .../provider-wizard-step.component.spec.ts | 98 - .../provider-wizard-step.component.ts | 130 - .../container/provider-wizard.component.html | 31 - .../provider-wizard.component.spec.ts | 70 - .../container/provider-wizard.component.ts | 96 - .../provider/effect/collection.effect.ts | 282 - .../metadata/provider/effect/editor.effect.ts | 54 - .../provider/model/base.provider.form.spec.ts | 143 - .../provider/model/base.provider.form.ts | 69 - .../model/dynamic-http.provider.form.spec.ts | 210 - .../model/dynamic-http.provider.form.ts | 208 - .../file-backed-http.provider.form.spec.ts | 130 - .../model/file-backed-http.provider.form.ts | 132 - .../model/file-system.provider.form.spec.ts | 120 - .../model/file-system.provider.form.ts | 138 - ui/src/app/metadata/provider/model/index.ts | 28 - .../model/local-dynamic.provider.form.spec.ts | 120 - .../model/local-dynamic.provider.form.ts | 125 - .../metadata/provider/model/provider.form.ts | 32 - .../metadata/provider/model/utilities.spec.ts | 33 - .../app/metadata/provider/model/utilities.ts | 23 - .../metadata/provider/provider.component.ts | 20 - .../app/metadata/provider/provider.module.ts | 79 - .../app/metadata/provider/provider.routing.ts | 108 - .../reducer/collection.reducer.spec.ts | 63 - .../provider/reducer/collection.reducer.ts | 70 - .../provider/reducer/editor.reducer.spec.ts | 28 - .../provider/reducer/editor.reducer.ts | 47 - .../provider/reducer/entity.reducer.spec.ts | 82 - .../provider/reducer/entity.reducer.ts | 66 - .../metadata/provider/reducer/index.spec.ts | 24 - ui/src/app/metadata/provider/reducer/index.ts | 91 - .../resolver/action/collection.action.ts | 172 - .../metadata/resolver/action/copy.action.ts | 53 - .../metadata/resolver/action/draft.action.ts | 129 - .../metadata/resolver/action/entity.action.ts | 54 - .../metadata/resolver/action/search.action.ts | 28 - .../component/finish-form.component.html | 17 - .../component/finish-form.component.scss | 9 - .../component/finish-form.component.spec.ts | 91 - .../component/finish-form.component.ts | 42 - .../provider-form-fragment.component.spec.ts | 35 - .../provider-form-fragment.component.ts | 59 - .../container/confirm-copy.component.html | 52 - .../container/confirm-copy.component.scss | 5 - .../container/confirm-copy.component.spec.ts | 0 .../container/confirm-copy.component.ts | 72 - .../container/copy-resolver.component.html | 146 - .../container/copy-resolver.component.spec.ts | 75 - .../container/copy-resolver.component.ts | 96 - .../container/new-resolver.component.html | 67 - .../container/new-resolver.component.scss | 6 - .../container/new-resolver.component.spec.ts | 61 - .../container/new-resolver.component.ts | 46 - .../resolver-edit-step.component.html | 9 - .../container/resolver-edit-step.component.ts | 143 - .../container/resolver-edit.component.html | 62 - .../container/resolver-edit.component.ts | 106 - .../container/resolver-select.component.html | 3 - .../container/resolver-select.component.ts | 55 - .../resolver-wizard-step.component.html | 9 - .../resolver-wizard-step.component.spec.ts | 112 - .../resolver-wizard-step.component.ts | 113 - .../container/resolver-wizard.component.html | 13 - .../container/resolver-wizard.component.scss | 0 .../resolver-wizard.component.spec.ts | 184 - .../container/resolver-wizard.component.ts | 184 - .../container/upload-resolver.component.html | 67 - .../upload-resolver.component.spec.ts | 140 - .../container/upload-resolver.component.ts | 93 - .../resolver/effect/collection.effect.spec.ts | 42 - .../resolver/effect/collection.effects.ts | 229 - .../metadata/resolver/effect/copy.effect.ts | 65 - .../effect/draft-collection.effect.spec.ts | 55 - .../effect/draft-collection.effects.ts | 128 - .../metadata/resolver/effect/entity.effect.ts | 91 - .../metadata/resolver/effect/search.effect.ts | 33 - .../metadata/resolver/effect/wizard.effect.ts | 44 - .../resolver/guard/copy-isset.guard.ts | 27 - .../reducer/collection.reducer.spec.ts | 79 - .../resolver/reducer/collection.reducer.ts | 87 - .../resolver/reducer/copy.reducer.spec.ts | 106 - .../metadata/resolver/reducer/copy.reducer.ts | 82 - .../resolver/reducer/draft.reducer.spec.ts | 114 - .../resolver/reducer/draft.reducer.ts | 55 - .../resolver/reducer/entity.reducer.spec.ts | 116 - .../resolver/reducer/entity.reducer.ts | 56 - .../metadata/resolver/reducer/index.spec.ts | 40 - ui/src/app/metadata/resolver/reducer/index.ts | 142 - .../resolver/reducer/search.reducer.spec.ts | 72 - .../resolver/reducer/search.reducer.ts | 46 - .../metadata/resolver/resolver.component.ts | 25 - .../app/metadata/resolver/resolver.module.ts | 104 - .../app/metadata/resolver/resolver.routing.ts | 89 - .../metadata/resolver/wizard-definition.ts | 6 - .../action/notification.action.ts | 21 - .../notification-item.component.html | 6 - .../notification-item.component.scss | 3 - .../notification-item.component.spec.ts | 62 - .../component/notification-item.component.ts | 25 - .../notification-list.component.html | 7 - .../notification-list.component.scss | 7 - .../notification-list.component.spec.ts | 87 - .../component/notification-list.component.ts | 42 - ui/src/app/notification/model/notification.ts | 16 - .../app/notification/notification.module.ts | 25 - ui/src/app/notification/reducer/index.ts | 22 - .../reducer/notification.reducer.spec.ts | 63 - .../reducer/notification.reducer.ts | 36 - ui/src/app/schema-form/model/messages.ts | 3 - ui/src/app/schema-form/model/one-of.ts | 4 - ui/src/app/schema-form/registry.ts | 79 - ui/src/app/schema-form/schema-form.module.ts | 80 - .../service/schema.service.spec.ts | 261 - .../app/schema-form/service/schema.service.ts | 68 - .../widget/array/array.component.html | 70 - .../widget/array/array.component.ts | 55 - .../array/inline-obj-list.component.html | 56 - .../widget/array/inline-obj-list.component.ts | 10 - .../boolean-radio.component.html | 29 - .../boolean-radio.component.scss | 5 - .../boolean-radio.component.spec.ts | 0 .../boolean-radio/boolean-radio.component.ts | 18 - .../widget/button/icon-button.component.html | 9 - .../widget/button/icon-button.component.ts | 35 - .../widget/check/checkbox.component.html | 38 - .../widget/check/checkbox.component.ts | 9 - .../widget/check/checklist.component.html | 57 - .../widget/check/checklist.component.ts | 61 - .../widget/datalist/datalist.component.html | 44 - .../widget/datalist/datalist.component.ts | 53 - .../widget/fieldset/fieldset.component.html | 23 - .../widget/fieldset/fieldset.component.scss | 8 - .../widget/fieldset/fieldset.component.ts | 10 - .../filter-target.component.html | 124 - .../filter-target.component.scss | 3 - .../filter-target/filter-target.component.ts | 172 - .../widget/number/float.component.html | 43 - .../widget/number/float.component.ts | 74 - .../widget/number/number.component.html | 45 - .../widget/number/number.component.ts | 34 - .../widget/object/inline-obj.component.html | 9 - .../widget/object/inline-obj.component.ts | 10 - .../widget/object/object.component.html | 29 - .../widget/object/object.component.ts | 35 - .../widget/radio/radio.component.html | 19 - .../widget/radio/radio.component.ts | 8 - .../widget/select/select.component.html | 69 - .../widget/select/select.component.ts | 76 - .../widget/string/string.component.html | 46 - .../widget/string/string.component.scss | 0 .../widget/string/string.component.ts | 61 - .../widget/textarea/textarea.component.html | 43 - .../widget/textarea/textarea.component.ts | 43 - .../schema-form/widget/widget.component.scss | 0 .../autocomplete/autocomplete.component.html | 61 - .../autocomplete/autocomplete.component.scss | 33 - .../autocomplete.component.spec.ts | 386 - .../autocomplete/autocomplete.component.ts | 377 - .../autocomplete/autocomplete.model.spec.ts | 20 - .../shared/autocomplete/autocomplete.model.ts | 42 - .../app/shared/autocomplete/keys.service.ts | 4 - ui/src/app/shared/client.ts | 3 - .../shared/component/info-icon.component.html | 13 - .../shared/component/info-icon.component.scss | 11 - .../component/info-icon.component.spec.ts | 49 - .../shared/component/info-icon.component.ts | 26 - .../component/valid-form-icon.component.html | 6 - .../valid-form-icon.component.spec.ts | 49 - .../component/valid-form-icon.component.ts | 12 - ui/src/app/shared/constant.ts | 1 - .../contenteditable.directive.spec.ts | 69 - .../contenteditable.directive.ts | 64 - ui/src/app/shared/keycodes.spec.ts | 55 - ui/src/app/shared/keycodes.ts | 18 - ui/src/app/shared/memo.spec.ts | 21 - ui/src/app/shared/memo.ts | 15 - ui/src/app/shared/pipe/date.pipe.ts | 19 - ui/src/app/shared/pipe/highlight.pipe.spec.ts | 28 - ui/src/app/shared/pipe/highlight.pipe.ts | 20 - .../app/shared/pipe/pretty-xml.pipe.spec.ts | 20 - ui/src/app/shared/pipe/pretty-xml.pipe.ts | 12 - ui/src/app/shared/regex.ts | 3 - ui/src/app/shared/shared.module.ts | 49 - ui/src/app/shared/storage.spec.ts | 107 - ui/src/app/shared/storage.ts | 36 - .../app/shared/switch/switch.component.html | 4 - .../app/shared/switch/switch.component.scss | 62 - .../shared/switch/switch.component.spec.ts | 61 - ui/src/app/shared/switch/switch.component.ts | 48 - ui/src/app/shared/util.spec.ts | 30 - ui/src/app/shared/util.ts | 114 - .../shared/validation/regex.validator.spec.ts | 18 - .../app/shared/validation/regex.validator.ts | 16 - .../shared/validation/uri.validator.spec.ts | 26 - ui/src/app/shared/validation/uri.validator.ts | 18 - .../validation-class.directive.spec.ts | 61 - .../validation/validation-class.directive.ts | 30 - ui/src/app/wizard/action/wizard.action.ts | 103 - .../wizard/component/wizard.component.html | 63 - .../wizard/component/wizard.component.scss | 13 - .../wizard/component/wizard.component.spec.ts | 60 - .../app/wizard/component/wizard.component.ts | 55 - ui/src/app/wizard/model/form-definition.ts | 14 - ui/src/app/wizard/model/index.ts | 2 - ui/src/app/wizard/model/wizard.ts | 35 - ui/src/app/wizard/reducer/index.spec.ts | 165 - ui/src/app/wizard/reducer/index.ts | 144 - .../app/wizard/reducer/wizard.reducer.spec.ts | 109 - ui/src/app/wizard/reducer/wizard.reducer.ts | 109 - .../app/wizard/service/wizard.service.spec.ts | 26 - ui/src/app/wizard/service/wizard.service.ts | 19 - ui/src/app/wizard/wizard.module.spec.ts | 21 - ui/src/app/wizard/wizard.module.ts | 40 - ui/src/assets/favicon-96x96.png | Bin 12383 -> 0 bytes ui/src/assets/logo_internet2.png | Bin 1723 -> 0 bytes ui/src/assets/logo_unicon.png | Bin 20861 -> 0 bytes .../filter/entity-attributes.schema.json | 226 - .../assets/schema/filter/nameid.schema.json | 149 - .../schema/provider/dynamic-http.schema.json | 678 - .../schema/provider/file-system.schema.json | 143 - .../provider/filebacked-http.schema.json | 653 - .../schema/provider/local-dynamic.schema.json | 188 - .../metadata-provider-summary.schema.json | 11 - .../provider/metadata-provider.schema.json | 32 - .../assets/schema/source/metadata-source.json | 619 - .../assets/shibboleth_icon_color_130x130.png | Bin 11665 -> 0 bytes .../assets/shibboleth_logowordmark_color.png | Bin 20845 -> 0 bytes ui/src/brand.scss | 44 - ui/src/brand.ts | 21 - ui/src/data/descriptors.mock.ts | 52 - ui/src/data/entities.json | 94 - ui/src/data/ids.mock.ts | 18 - ui/src/environments/environment.prod.ts | 3 - ui/src/environments/environment.ts | 8 - ui/src/error.html | 30 - ui/src/favicon.ico | Bin 1150 -> 0 bytes ui/src/index.html | 15 - ui/src/main.ts | 11 - ui/src/polyfills.ts | 62 - ui/src/static.scss | 28 - ui/src/styles.scss | 58 - ui/src/test.ts | 34 - ui/src/testing/activated-route.stub.ts | 61 - ui/src/testing/attributes.stub.ts | 16 - ui/src/testing/descriptor.service.stub.ts | 0 ui/src/testing/effect.util.ts | 16 - ui/src/testing/file.service.stub.ts | 11 - ui/src/testing/filter-list.stub.ts | 27 - ui/src/testing/form-schema.stub.ts | 129 - ui/src/testing/i18n.stub.ts | 102 - ui/src/testing/list-values.stub.ts | 47 - ui/src/testing/metadata-configuration.stub.ts | 23 - ui/src/testing/mock-module.stub.ts | 15 - ui/src/testing/mockMetadataWizard.ts | 78 - ui/src/testing/modal.stub.ts | 18 - ui/src/testing/navigation-service.stub.ts | 10 - ui/src/testing/page-title-component.stub.ts | 8 - ui/src/testing/property-component.stub.ts | 57 - ui/src/testing/provider.stub.ts | 49 - ui/src/testing/resolver.stub.ts | 49 - .../testing/resolvers-list.component.stub.ts | 18 - ui/src/testing/router.stub.ts | 27 - ui/src/testing/sample-fbhttp-provider.json | 94 - ui/src/testing/shared.stub.ts | 68 - ui/src/testing/utility.ts | 15 - ui/src/testing/wizard.stub.ts | 43 - ui/src/theme/_mixins.scss | 17 - ui/src/theme/_palette.scss | 84 - ui/src/theme/_variables.scss | 2 - ui/src/theme/alert.scss | 5 - ui/src/theme/bootstrap.scss | 43 - ui/src/theme/breadcrumb.scss | 13 - ui/src/theme/buttons.scss | 112 - ui/src/theme/forms.scss | 95 - ui/src/theme/list.scss | 24 - ui/src/theme/modal.scss | 42 - ui/src/theme/tags.scss | 97 - ui/src/theme/typography.scss | 9 - ui/src/theme/utility.scss | 41 - ui/src/tsconfig.app.json | 15 - ui/src/tsconfig.spec.json | 19 - ui/src/typings.d.ts | 10 - ui/tsconfig.json | 22 - ui/tslint.json | 144 - 713 files changed, 60015 deletions(-) delete mode 100644 ui/.browserslistrc delete mode 100644 ui/.editorconfig delete mode 100644 ui/.nvmrc delete mode 100644 ui/README.md delete mode 100644 ui/angular.json delete mode 100644 ui/build.gradle delete mode 100644 ui/build.js delete mode 100644 ui/e2e/app.e2e-spec.ts delete mode 100644 ui/e2e/app.po.ts delete mode 100644 ui/e2e/tsconfig.e2e.json delete mode 100644 ui/karma.conf.js delete mode 100644 ui/package-lock.json delete mode 100644 ui/package.json delete mode 100644 ui/protractor.conf.js delete mode 100644 ui/proxy.conf.json delete mode 100644 ui/src/app/admin/action/admin-collection.action.ts delete mode 100644 ui/src/app/admin/action/metadata-collection.action.ts delete mode 100644 ui/src/app/admin/admin.component.html delete mode 100644 ui/src/app/admin/admin.component.spec.ts delete mode 100644 ui/src/app/admin/admin.component.ts delete mode 100644 ui/src/app/admin/admin.module.ts delete mode 100644 ui/src/app/admin/component/access-request.component.html delete mode 100644 ui/src/app/admin/component/access-request.component.spec.ts delete mode 100644 ui/src/app/admin/component/access-request.component.ts delete mode 100644 ui/src/app/admin/component/delete-user-dialog.component.html delete mode 100644 ui/src/app/admin/component/delete-user-dialog.component.spec.ts delete mode 100644 ui/src/app/admin/component/delete-user-dialog.component.ts delete mode 100644 ui/src/app/admin/component/enable-metadata.component.html delete mode 100644 ui/src/app/admin/component/enable-metadata.component.spec.ts delete mode 100644 ui/src/app/admin/component/enable-metadata.component.ts delete mode 100644 ui/src/app/admin/component/user-management.component.html delete mode 100644 ui/src/app/admin/component/user-management.component.spec.ts delete mode 100644 ui/src/app/admin/component/user-management.component.ts delete mode 100644 ui/src/app/admin/container/action-required.component.html delete mode 100644 ui/src/app/admin/container/action-required.component.ts delete mode 100644 ui/src/app/admin/container/admin-management.component.html delete mode 100644 ui/src/app/admin/container/admin-management.component.spec.ts delete mode 100644 ui/src/app/admin/container/admin-management.component.ts delete mode 100644 ui/src/app/admin/effect/admin-collection.effect.spec.ts delete mode 100644 ui/src/app/admin/effect/admin-collection.effect.ts delete mode 100644 ui/src/app/admin/effect/metadata-collection.effect.spec.ts delete mode 100644 ui/src/app/admin/effect/metadata-collection.effect.ts delete mode 100644 ui/src/app/admin/model/admin.ts delete mode 100644 ui/src/app/admin/reducer/admin-collection.reducer.spec.ts delete mode 100644 ui/src/app/admin/reducer/admin-collection.reducer.ts delete mode 100644 ui/src/app/admin/reducer/index.spec.ts delete mode 100644 ui/src/app/admin/reducer/index.ts delete mode 100644 ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts delete mode 100644 ui/src/app/admin/reducer/metadata-collection.reducer.ts delete mode 100644 ui/src/app/admin/service/admin.service.spec.ts delete mode 100644 ui/src/app/admin/service/admin.service.ts delete mode 100644 ui/src/app/app.brand.ts delete mode 100644 ui/src/app/app.component.html delete mode 100644 ui/src/app/app.component.scss delete mode 100644 ui/src/app/app.component.spec.ts delete mode 100644 ui/src/app/app.component.ts delete mode 100644 ui/src/app/app.constant.ts delete mode 100644 ui/src/app/app.module.ts delete mode 100644 ui/src/app/app.reducer.ts delete mode 100644 ui/src/app/app.routing.ts delete mode 100644 ui/src/app/contention/action/contention.action.ts delete mode 100644 ui/src/app/contention/component/change-item.component.html delete mode 100644 ui/src/app/contention/component/change-item.component.scss delete mode 100644 ui/src/app/contention/component/change-item.component.spec.ts delete mode 100644 ui/src/app/contention/component/change-item.component.ts delete mode 100644 ui/src/app/contention/component/contention-dialog.component.html delete mode 100644 ui/src/app/contention/component/contention-dialog.component.scss delete mode 100644 ui/src/app/contention/component/contention-dialog.component.spec.ts delete mode 100644 ui/src/app/contention/component/contention-dialog.component.ts delete mode 100644 ui/src/app/contention/contention.module.ts delete mode 100644 ui/src/app/contention/effect/contention.effect.ts delete mode 100644 ui/src/app/contention/model/contention.ts delete mode 100644 ui/src/app/contention/reducer/contention.reducer.spec.ts delete mode 100644 ui/src/app/contention/reducer/contention.reducer.ts delete mode 100644 ui/src/app/contention/reducer/index.spec.ts delete mode 100644 ui/src/app/contention/reducer/index.ts delete mode 100644 ui/src/app/contention/service/contention.service.ts delete mode 100644 ui/src/app/core/action/configuration.action.ts delete mode 100644 ui/src/app/core/action/location.action.ts delete mode 100644 ui/src/app/core/action/user.action.ts delete mode 100644 ui/src/app/core/action/version.action.ts delete mode 100644 ui/src/app/core/component/page-title.component.spec.ts delete mode 100644 ui/src/app/core/component/page-title.component.ts delete mode 100644 ui/src/app/core/core.module.spec.ts delete mode 100644 ui/src/app/core/core.module.ts delete mode 100644 ui/src/app/core/effect/user.effect.spec.ts delete mode 100644 ui/src/app/core/effect/user.effect.ts delete mode 100644 ui/src/app/core/effect/version.effect.spec.ts delete mode 100644 ui/src/app/core/effect/version.effect.ts delete mode 100644 ui/src/app/core/model/action.ts delete mode 100644 ui/src/app/core/model/brand.ts delete mode 100644 ui/src/app/core/model/query.ts delete mode 100644 ui/src/app/core/model/user.ts delete mode 100644 ui/src/app/core/model/version.ts delete mode 100644 ui/src/app/core/reducer/configuration.reducer.spec.ts delete mode 100644 ui/src/app/core/reducer/configuration.reducer.ts delete mode 100644 ui/src/app/core/reducer/index.spec.ts delete mode 100644 ui/src/app/core/reducer/index.ts delete mode 100644 ui/src/app/core/reducer/location.reducer.ts delete mode 100644 ui/src/app/core/reducer/user.reducer.spec.ts delete mode 100644 ui/src/app/core/reducer/user.reducer.ts delete mode 100644 ui/src/app/core/reducer/version.reducer.spec.ts delete mode 100644 ui/src/app/core/reducer/version.reducer.ts delete mode 100644 ui/src/app/core/service/admin.guard.ts delete mode 100644 ui/src/app/core/service/api-path.interceptor.spec.ts delete mode 100644 ui/src/app/core/service/api-path.interceptor.ts delete mode 100644 ui/src/app/core/service/authorized.interceptor.ts delete mode 100644 ui/src/app/core/service/cache.interceptor.ts delete mode 100644 ui/src/app/core/service/can-deactivate.guard.spec.ts delete mode 100644 ui/src/app/core/service/can-deactivate.guard.ts delete mode 100644 ui/src/app/core/service/differential.service.ts delete mode 100644 ui/src/app/core/service/error.interceptor.ts delete mode 100644 ui/src/app/core/service/file.service.spec.ts delete mode 100644 ui/src/app/core/service/file.service.ts delete mode 100644 ui/src/app/core/service/modal.service.spec.ts delete mode 100644 ui/src/app/core/service/modal.service.ts delete mode 100644 ui/src/app/core/service/navigation.service.spec.ts delete mode 100644 ui/src/app/core/service/navigation.service.ts delete mode 100644 ui/src/app/core/service/navigator.service.ts delete mode 100644 ui/src/app/core/service/user.service.spec.ts delete mode 100644 ui/src/app/core/service/user.service.ts delete mode 100644 ui/src/app/dashboard/container/dashboard.component.html delete mode 100644 ui/src/app/dashboard/container/dashboard.component.scss delete mode 100644 ui/src/app/dashboard/container/dashboard.component.ts delete mode 100644 ui/src/app/dashboard/dashboard.module.ts delete mode 100644 ui/src/app/dashboard/dashboard.routing.ts delete mode 100644 ui/src/app/i18n/action/message.action.ts delete mode 100644 ui/src/app/i18n/component/i18n-text.component.html delete mode 100644 ui/src/app/i18n/component/i18n-text.component.spec.ts delete mode 100644 ui/src/app/i18n/component/i18n-text.component.ts delete mode 100644 ui/src/app/i18n/component/translate.component.spec.ts delete mode 100644 ui/src/app/i18n/component/translate.component.ts delete mode 100644 ui/src/app/i18n/effect/message.effect.spec.ts delete mode 100644 ui/src/app/i18n/effect/message.effect.ts delete mode 100644 ui/src/app/i18n/i18n.module.spec.ts delete mode 100644 ui/src/app/i18n/i18n.module.ts delete mode 100644 ui/src/app/i18n/model/Messages.ts delete mode 100644 ui/src/app/i18n/pipe/i18n.pipe.spec.ts delete mode 100644 ui/src/app/i18n/pipe/i18n.pipe.ts delete mode 100644 ui/src/app/i18n/reducer/index.ts delete mode 100644 ui/src/app/i18n/reducer/message.reducer.ts delete mode 100644 ui/src/app/i18n/service/i18n.service.spec.ts delete mode 100644 ui/src/app/i18n/service/i18n.service.ts delete mode 100644 ui/src/app/metadata/configuration/action/compare.action.ts delete mode 100644 ui/src/app/metadata/configuration/action/configuration.action.ts delete mode 100644 ui/src/app/metadata/configuration/action/filter.action.ts delete mode 100644 ui/src/app/metadata/configuration/action/history.action.ts delete mode 100644 ui/src/app/metadata/configuration/action/restore.action.ts delete mode 100644 ui/src/app/metadata/configuration/action/version.action.ts delete mode 100644 ui/src/app/metadata/configuration/component/editor.component.html delete mode 100644 ui/src/app/metadata/configuration/component/editor.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html delete mode 100644 ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/filter-configuration-list.component.html delete mode 100644 ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/filter-version-list.component.html delete mode 100644 ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/filter-version-list.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/history-list.component.html delete mode 100644 ui/src/app/metadata/configuration/component/history-list.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/history-list.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/metadata-configuration.component.html delete mode 100644 ui/src/app/metadata/configuration/component/metadata-configuration.component.scss delete mode 100644 ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/metadata-configuration.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/metadata-header.component.html delete mode 100644 ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/metadata-header.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/array-property.component.html delete mode 100644 ui/src/app/metadata/configuration/component/property/array-property.component.scss delete mode 100644 ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/array-property.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/configuration-property.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/filter-target-property.component.html delete mode 100644 ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/object-property.component.html delete mode 100644 ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/object-property.component.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/primitive-property.component.html delete mode 100644 ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/component/property/primitive-property.component.ts delete mode 100644 ui/src/app/metadata/configuration/configuration.module.ts delete mode 100644 ui/src/app/metadata/configuration/configuration.routing.ts delete mode 100644 ui/src/app/metadata/configuration/configuration.values.ts delete mode 100644 ui/src/app/metadata/configuration/container/configuration.component.html delete mode 100644 ui/src/app/metadata/configuration/container/configuration.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/configuration.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-comparison.component.html delete mode 100644 ui/src/app/metadata/configuration/container/metadata-comparison.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-comparison.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-history.component.html delete mode 100644 ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-history.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-options.component.html delete mode 100644 ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-options.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-xml.component.html delete mode 100644 ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/metadata-xml.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit-step.component.html delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit-step.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit.component.html delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore-edit.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore.component.html delete mode 100644 ui/src/app/metadata/configuration/container/restore.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/restore.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/version-options.component.html delete mode 100644 ui/src/app/metadata/configuration/container/version-options.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/version-options.component.ts delete mode 100644 ui/src/app/metadata/configuration/container/version.component.html delete mode 100644 ui/src/app/metadata/configuration/container/version.component.spec.ts delete mode 100644 ui/src/app/metadata/configuration/container/version.component.ts delete mode 100644 ui/src/app/metadata/configuration/effect/compare.effect.ts delete mode 100644 ui/src/app/metadata/configuration/effect/configuration.effect.ts delete mode 100644 ui/src/app/metadata/configuration/effect/filter.effect.ts delete mode 100644 ui/src/app/metadata/configuration/effect/history.effect.ts delete mode 100644 ui/src/app/metadata/configuration/effect/restore.effect.ts delete mode 100644 ui/src/app/metadata/configuration/effect/version.effect.ts delete mode 100644 ui/src/app/metadata/configuration/model/compare.ts delete mode 100644 ui/src/app/metadata/configuration/model/history.ts delete mode 100644 ui/src/app/metadata/configuration/model/metadata-configuration.ts delete mode 100644 ui/src/app/metadata/configuration/model/request.ts delete mode 100644 ui/src/app/metadata/configuration/model/schema.ts delete mode 100644 ui/src/app/metadata/configuration/model/section.ts delete mode 100644 ui/src/app/metadata/configuration/model/version.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/compare.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/configuration.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/filter.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/history.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/index.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/index.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/restore.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/utilities.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/utilities.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts delete mode 100644 ui/src/app/metadata/configuration/reducer/version.reducer.ts delete mode 100644 ui/src/app/metadata/configuration/service/configuration.service.spec.ts delete mode 100644 ui/src/app/metadata/configuration/service/configuration.service.ts delete mode 100644 ui/src/app/metadata/configuration/service/history.service.spec.ts delete mode 100644 ui/src/app/metadata/configuration/service/history.service.ts delete mode 100644 ui/src/app/metadata/configuration/service/index-resolver.service.ts delete mode 100644 ui/src/app/metadata/domain/action/entity.action.ts delete mode 100644 ui/src/app/metadata/domain/component/editor-nav.component.html delete mode 100644 ui/src/app/metadata/domain/component/editor-nav.component.spec.ts delete mode 100644 ui/src/app/metadata/domain/component/editor-nav.component.ts delete mode 100644 ui/src/app/metadata/domain/component/preview-dialog.component.html delete mode 100644 ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts delete mode 100644 ui/src/app/metadata/domain/component/preview-dialog.component.ts delete mode 100644 ui/src/app/metadata/domain/component/summary-property.component.html delete mode 100644 ui/src/app/metadata/domain/component/summary-property.component.spec.ts delete mode 100644 ui/src/app/metadata/domain/component/summary-property.component.ts delete mode 100644 ui/src/app/metadata/domain/component/unsaved-entity.dialog.html delete mode 100644 ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts delete mode 100644 ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts delete mode 100644 ui/src/app/metadata/domain/domain.module.ts delete mode 100644 ui/src/app/metadata/domain/domain.type.ts delete mode 100644 ui/src/app/metadata/domain/domain.util.spec.ts delete mode 100644 ui/src/app/metadata/domain/domain.util.ts delete mode 100644 ui/src/app/metadata/domain/effect/entity.effect.spec.ts delete mode 100644 ui/src/app/metadata/domain/effect/entity.effect.ts delete mode 100644 ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts delete mode 100644 ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts delete mode 100644 ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts delete mode 100644 ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts delete mode 100644 ui/src/app/metadata/domain/entity/index.ts delete mode 100644 ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts delete mode 100644 ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts delete mode 100644 ui/src/app/metadata/domain/model/index.ts delete mode 100644 ui/src/app/metadata/domain/model/metadata-base.ts delete mode 100644 ui/src/app/metadata/domain/model/metadata-entity.ts delete mode 100644 ui/src/app/metadata/domain/model/metadata-filter.ts delete mode 100644 ui/src/app/metadata/domain/model/metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/metadata-resolver.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/certificate.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/contact.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/filter-target.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/logout-endpoint.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/mdui.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/organization.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/release-attribute.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/security-info.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/sso-descriptor.ts delete mode 100644 ui/src/app/metadata/domain/model/properties/sso-service.ts delete mode 100644 ui/src/app/metadata/domain/model/property.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/index.ts delete mode 100644 ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts delete mode 100644 ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts delete mode 100644 ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts delete mode 100644 ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts delete mode 100644 ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts delete mode 100644 ui/src/app/metadata/domain/service/attributes.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/attributes.service.ts delete mode 100644 ui/src/app/metadata/domain/service/draft.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/draft.service.ts delete mode 100644 ui/src/app/metadata/domain/service/entity-id.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/entity-id.service.ts delete mode 100644 ui/src/app/metadata/domain/service/entity-validators.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/entity-validators.service.ts delete mode 100644 ui/src/app/metadata/domain/service/filter.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/filter.service.ts delete mode 100644 ui/src/app/metadata/domain/service/list-values.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/list-values.service.ts delete mode 100644 ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/provider-change-emitter.service.ts delete mode 100644 ui/src/app/metadata/domain/service/provider.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/provider.service.ts delete mode 100644 ui/src/app/metadata/domain/service/resolver.service.spec.ts delete mode 100644 ui/src/app/metadata/domain/service/resolver.service.ts delete mode 100644 ui/src/app/metadata/domain/utility/configuration.spec.ts delete mode 100644 ui/src/app/metadata/domain/utility/configuration.ts delete mode 100644 ui/src/app/metadata/filter/action/collection.action.ts delete mode 100644 ui/src/app/metadata/filter/action/editor.action.ts delete mode 100644 ui/src/app/metadata/filter/action/filter.action.spec.ts delete mode 100644 ui/src/app/metadata/filter/action/filter.action.ts delete mode 100644 ui/src/app/metadata/filter/action/search.action.spec.ts delete mode 100644 ui/src/app/metadata/filter/action/search.action.ts delete mode 100644 ui/src/app/metadata/filter/component/filter-list.component.html delete mode 100644 ui/src/app/metadata/filter/component/filter-list.component.scss delete mode 100644 ui/src/app/metadata/filter/component/filter-list.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/component/filter-list.component.ts delete mode 100644 ui/src/app/metadata/filter/component/search-dialog.component.html delete mode 100644 ui/src/app/metadata/filter/component/search-dialog.component.scss delete mode 100644 ui/src/app/metadata/filter/component/search-dialog.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/component/search-dialog.component.ts delete mode 100644 ui/src/app/metadata/filter/container/edit-filter-step.component.html delete mode 100644 ui/src/app/metadata/filter/container/edit-filter-step.component.ts delete mode 100644 ui/src/app/metadata/filter/container/edit-filter.component.html delete mode 100644 ui/src/app/metadata/filter/container/edit-filter.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/container/edit-filter.component.ts delete mode 100644 ui/src/app/metadata/filter/container/filter.component.html delete mode 100644 ui/src/app/metadata/filter/container/filter.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/container/filter.component.ts delete mode 100644 ui/src/app/metadata/filter/container/new-filter-step.component.html delete mode 100644 ui/src/app/metadata/filter/container/new-filter-step.component.ts delete mode 100644 ui/src/app/metadata/filter/container/new-filter.component.html delete mode 100644 ui/src/app/metadata/filter/container/new-filter.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/container/new-filter.component.ts delete mode 100644 ui/src/app/metadata/filter/container/select-filter.component.html delete mode 100644 ui/src/app/metadata/filter/container/select-filter.component.scss delete mode 100644 ui/src/app/metadata/filter/container/select-filter.component.spec.ts delete mode 100644 ui/src/app/metadata/filter/container/select-filter.component.ts delete mode 100644 ui/src/app/metadata/filter/effect/collection.effect.spec.ts delete mode 100644 ui/src/app/metadata/filter/effect/collection.effect.ts delete mode 100644 ui/src/app/metadata/filter/effect/editor.effect.ts delete mode 100644 ui/src/app/metadata/filter/effect/filter.effect.ts delete mode 100644 ui/src/app/metadata/filter/effect/search.effect.ts delete mode 100644 ui/src/app/metadata/filter/filter.module.ts delete mode 100644 ui/src/app/metadata/filter/guard/filter-exists.guard.ts delete mode 100644 ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts delete mode 100644 ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts delete mode 100644 ui/src/app/metadata/filter/model/entity-attributes.filter.ts delete mode 100644 ui/src/app/metadata/filter/model/index.ts delete mode 100644 ui/src/app/metadata/filter/model/nameid-configuration.filter.ts delete mode 100644 ui/src/app/metadata/filter/model/nameid.filter.spec.ts delete mode 100644 ui/src/app/metadata/filter/model/nameid.filter.ts delete mode 100644 ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts delete mode 100644 ui/src/app/metadata/filter/reducer/collection.reducer.ts delete mode 100644 ui/src/app/metadata/filter/reducer/editor.reducer.ts delete mode 100644 ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts delete mode 100644 ui/src/app/metadata/filter/reducer/filter.reducer.ts delete mode 100644 ui/src/app/metadata/filter/reducer/index.spec.ts delete mode 100644 ui/src/app/metadata/filter/reducer/index.ts delete mode 100644 ui/src/app/metadata/filter/reducer/search.reducer.spec.ts delete mode 100644 ui/src/app/metadata/filter/reducer/search.reducer.ts delete mode 100644 ui/src/app/metadata/manager/action/search.action.ts delete mode 100644 ui/src/app/metadata/manager/component/delete-dialog.component.html delete mode 100644 ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts delete mode 100644 ui/src/app/metadata/manager/component/delete-dialog.component.ts delete mode 100644 ui/src/app/metadata/manager/component/provider-search.component.html delete mode 100644 ui/src/app/metadata/manager/component/provider-search.component.ts delete mode 100644 ui/src/app/metadata/manager/component/resolvers-list.component.html delete mode 100644 ui/src/app/metadata/manager/component/resolvers-list.component.spec.ts delete mode 100644 ui/src/app/metadata/manager/component/resolvers-list.component.ts delete mode 100644 ui/src/app/metadata/manager/container/dashboard-providers-list.component.html delete mode 100644 ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss delete mode 100644 ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts delete mode 100644 ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts delete mode 100644 ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html delete mode 100644 ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts delete mode 100644 ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts delete mode 100644 ui/src/app/metadata/manager/container/manager.component.html delete mode 100644 ui/src/app/metadata/manager/container/manager.component.scss delete mode 100644 ui/src/app/metadata/manager/container/manager.component.spec.ts delete mode 100644 ui/src/app/metadata/manager/container/manager.component.ts delete mode 100644 ui/src/app/metadata/manager/effect/search.effects.ts delete mode 100644 ui/src/app/metadata/manager/manager.module.ts delete mode 100644 ui/src/app/metadata/manager/manager.routing.ts delete mode 100644 ui/src/app/metadata/manager/reducer/index.ts delete mode 100644 ui/src/app/metadata/manager/reducer/search.reducer.ts delete mode 100644 ui/src/app/metadata/metadata.component.html delete mode 100644 ui/src/app/metadata/metadata.component.spec.ts delete mode 100644 ui/src/app/metadata/metadata.component.ts delete mode 100644 ui/src/app/metadata/metadata.module.ts delete mode 100644 ui/src/app/metadata/metadata.routing.ts delete mode 100644 ui/src/app/metadata/provider/action/collection.action.ts delete mode 100644 ui/src/app/metadata/provider/action/editor.action.ts delete mode 100644 ui/src/app/metadata/provider/action/entity.action.ts delete mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.html delete mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-edit-step.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-edit-step.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-edit.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-edit.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-edit.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-filter-list.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-filter-list.component.scss delete mode 100644 ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-filter-list.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-select.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-select.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-select.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard-step.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard-step.component.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard.component.html delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts delete mode 100644 ui/src/app/metadata/provider/container/provider-wizard.component.ts delete mode 100644 ui/src/app/metadata/provider/effect/collection.effect.ts delete mode 100644 ui/src/app/metadata/provider/effect/editor.effect.ts delete mode 100644 ui/src/app/metadata/provider/model/base.provider.form.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/base.provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/file-system.provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/index.ts delete mode 100644 ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/provider.form.ts delete mode 100644 ui/src/app/metadata/provider/model/utilities.spec.ts delete mode 100644 ui/src/app/metadata/provider/model/utilities.ts delete mode 100644 ui/src/app/metadata/provider/provider.component.ts delete mode 100644 ui/src/app/metadata/provider/provider.module.ts delete mode 100644 ui/src/app/metadata/provider/provider.routing.ts delete mode 100644 ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts delete mode 100644 ui/src/app/metadata/provider/reducer/collection.reducer.ts delete mode 100644 ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts delete mode 100644 ui/src/app/metadata/provider/reducer/editor.reducer.ts delete mode 100644 ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts delete mode 100644 ui/src/app/metadata/provider/reducer/entity.reducer.ts delete mode 100644 ui/src/app/metadata/provider/reducer/index.spec.ts delete mode 100644 ui/src/app/metadata/provider/reducer/index.ts delete mode 100644 ui/src/app/metadata/resolver/action/collection.action.ts delete mode 100644 ui/src/app/metadata/resolver/action/copy.action.ts delete mode 100644 ui/src/app/metadata/resolver/action/draft.action.ts delete mode 100644 ui/src/app/metadata/resolver/action/entity.action.ts delete mode 100644 ui/src/app/metadata/resolver/action/search.action.ts delete mode 100644 ui/src/app/metadata/resolver/component/finish-form.component.html delete mode 100644 ui/src/app/metadata/resolver/component/finish-form.component.scss delete mode 100644 ui/src/app/metadata/resolver/component/finish-form.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/component/finish-form.component.ts delete mode 100644 ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/confirm-copy.component.html delete mode 100644 ui/src/app/metadata/resolver/container/confirm-copy.component.scss delete mode 100644 ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/confirm-copy.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/copy-resolver.component.html delete mode 100644 ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/copy-resolver.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.html delete mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.scss delete mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-edit-step.component.html delete mode 100644 ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-edit.component.html delete mode 100644 ui/src/app/metadata/resolver/container/resolver-edit.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-select.component.html delete mode 100644 ui/src/app/metadata/resolver/container/resolver-select.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard.component.html delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard.component.scss delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/resolver-wizard.component.ts delete mode 100644 ui/src/app/metadata/resolver/container/upload-resolver.component.html delete mode 100644 ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts delete mode 100644 ui/src/app/metadata/resolver/container/upload-resolver.component.ts delete mode 100644 ui/src/app/metadata/resolver/effect/collection.effect.spec.ts delete mode 100644 ui/src/app/metadata/resolver/effect/collection.effects.ts delete mode 100644 ui/src/app/metadata/resolver/effect/copy.effect.ts delete mode 100644 ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts delete mode 100644 ui/src/app/metadata/resolver/effect/draft-collection.effects.ts delete mode 100644 ui/src/app/metadata/resolver/effect/entity.effect.ts delete mode 100644 ui/src/app/metadata/resolver/effect/search.effect.ts delete mode 100644 ui/src/app/metadata/resolver/effect/wizard.effect.ts delete mode 100644 ui/src/app/metadata/resolver/guard/copy-isset.guard.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/collection.reducer.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/copy.reducer.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/draft.reducer.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/entity.reducer.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/index.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/index.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts delete mode 100644 ui/src/app/metadata/resolver/reducer/search.reducer.ts delete mode 100644 ui/src/app/metadata/resolver/resolver.component.ts delete mode 100644 ui/src/app/metadata/resolver/resolver.module.ts delete mode 100644 ui/src/app/metadata/resolver/resolver.routing.ts delete mode 100644 ui/src/app/metadata/resolver/wizard-definition.ts delete mode 100644 ui/src/app/notification/action/notification.action.ts delete mode 100644 ui/src/app/notification/component/notification-item.component.html delete mode 100644 ui/src/app/notification/component/notification-item.component.scss delete mode 100644 ui/src/app/notification/component/notification-item.component.spec.ts delete mode 100644 ui/src/app/notification/component/notification-item.component.ts delete mode 100644 ui/src/app/notification/component/notification-list.component.html delete mode 100644 ui/src/app/notification/component/notification-list.component.scss delete mode 100644 ui/src/app/notification/component/notification-list.component.spec.ts delete mode 100644 ui/src/app/notification/component/notification-list.component.ts delete mode 100644 ui/src/app/notification/model/notification.ts delete mode 100644 ui/src/app/notification/notification.module.ts delete mode 100644 ui/src/app/notification/reducer/index.ts delete mode 100644 ui/src/app/notification/reducer/notification.reducer.spec.ts delete mode 100644 ui/src/app/notification/reducer/notification.reducer.ts delete mode 100644 ui/src/app/schema-form/model/messages.ts delete mode 100644 ui/src/app/schema-form/model/one-of.ts delete mode 100644 ui/src/app/schema-form/registry.ts delete mode 100644 ui/src/app/schema-form/schema-form.module.ts delete mode 100644 ui/src/app/schema-form/service/schema.service.spec.ts delete mode 100644 ui/src/app/schema-form/service/schema.service.ts delete mode 100644 ui/src/app/schema-form/widget/array/array.component.html delete mode 100644 ui/src/app/schema-form/widget/array/array.component.ts delete mode 100644 ui/src/app/schema-form/widget/array/inline-obj-list.component.html delete mode 100644 ui/src/app/schema-form/widget/array/inline-obj-list.component.ts delete mode 100644 ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html delete mode 100644 ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss delete mode 100644 ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.spec.ts delete mode 100644 ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts delete mode 100644 ui/src/app/schema-form/widget/button/icon-button.component.html delete mode 100644 ui/src/app/schema-form/widget/button/icon-button.component.ts delete mode 100644 ui/src/app/schema-form/widget/check/checkbox.component.html delete mode 100644 ui/src/app/schema-form/widget/check/checkbox.component.ts delete mode 100644 ui/src/app/schema-form/widget/check/checklist.component.html delete mode 100644 ui/src/app/schema-form/widget/check/checklist.component.ts delete mode 100644 ui/src/app/schema-form/widget/datalist/datalist.component.html delete mode 100644 ui/src/app/schema-form/widget/datalist/datalist.component.ts delete mode 100644 ui/src/app/schema-form/widget/fieldset/fieldset.component.html delete mode 100644 ui/src/app/schema-form/widget/fieldset/fieldset.component.scss delete mode 100644 ui/src/app/schema-form/widget/fieldset/fieldset.component.ts delete mode 100644 ui/src/app/schema-form/widget/filter-target/filter-target.component.html delete mode 100644 ui/src/app/schema-form/widget/filter-target/filter-target.component.scss delete mode 100644 ui/src/app/schema-form/widget/filter-target/filter-target.component.ts delete mode 100644 ui/src/app/schema-form/widget/number/float.component.html delete mode 100644 ui/src/app/schema-form/widget/number/float.component.ts delete mode 100644 ui/src/app/schema-form/widget/number/number.component.html delete mode 100644 ui/src/app/schema-form/widget/number/number.component.ts delete mode 100644 ui/src/app/schema-form/widget/object/inline-obj.component.html delete mode 100644 ui/src/app/schema-form/widget/object/inline-obj.component.ts delete mode 100644 ui/src/app/schema-form/widget/object/object.component.html delete mode 100644 ui/src/app/schema-form/widget/object/object.component.ts delete mode 100644 ui/src/app/schema-form/widget/radio/radio.component.html delete mode 100644 ui/src/app/schema-form/widget/radio/radio.component.ts delete mode 100644 ui/src/app/schema-form/widget/select/select.component.html delete mode 100644 ui/src/app/schema-form/widget/select/select.component.ts delete mode 100644 ui/src/app/schema-form/widget/string/string.component.html delete mode 100644 ui/src/app/schema-form/widget/string/string.component.scss delete mode 100644 ui/src/app/schema-form/widget/string/string.component.ts delete mode 100644 ui/src/app/schema-form/widget/textarea/textarea.component.html delete mode 100644 ui/src/app/schema-form/widget/textarea/textarea.component.ts delete mode 100644 ui/src/app/schema-form/widget/widget.component.scss delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.component.html delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.component.scss delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.component.spec.ts delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.component.ts delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.model.spec.ts delete mode 100644 ui/src/app/shared/autocomplete/autocomplete.model.ts delete mode 100644 ui/src/app/shared/autocomplete/keys.service.ts delete mode 100644 ui/src/app/shared/client.ts delete mode 100644 ui/src/app/shared/component/info-icon.component.html delete mode 100644 ui/src/app/shared/component/info-icon.component.scss delete mode 100644 ui/src/app/shared/component/info-icon.component.spec.ts delete mode 100644 ui/src/app/shared/component/info-icon.component.ts delete mode 100644 ui/src/app/shared/component/valid-form-icon.component.html delete mode 100644 ui/src/app/shared/component/valid-form-icon.component.spec.ts delete mode 100644 ui/src/app/shared/component/valid-form-icon.component.ts delete mode 100644 ui/src/app/shared/constant.ts delete mode 100644 ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts delete mode 100644 ui/src/app/shared/contenteditable/contenteditable.directive.ts delete mode 100644 ui/src/app/shared/keycodes.spec.ts delete mode 100644 ui/src/app/shared/keycodes.ts delete mode 100644 ui/src/app/shared/memo.spec.ts delete mode 100644 ui/src/app/shared/memo.ts delete mode 100644 ui/src/app/shared/pipe/date.pipe.ts delete mode 100644 ui/src/app/shared/pipe/highlight.pipe.spec.ts delete mode 100644 ui/src/app/shared/pipe/highlight.pipe.ts delete mode 100644 ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts delete mode 100644 ui/src/app/shared/pipe/pretty-xml.pipe.ts delete mode 100644 ui/src/app/shared/regex.ts delete mode 100644 ui/src/app/shared/shared.module.ts delete mode 100644 ui/src/app/shared/storage.spec.ts delete mode 100644 ui/src/app/shared/storage.ts delete mode 100644 ui/src/app/shared/switch/switch.component.html delete mode 100644 ui/src/app/shared/switch/switch.component.scss delete mode 100644 ui/src/app/shared/switch/switch.component.spec.ts delete mode 100644 ui/src/app/shared/switch/switch.component.ts delete mode 100644 ui/src/app/shared/util.spec.ts delete mode 100644 ui/src/app/shared/util.ts delete mode 100644 ui/src/app/shared/validation/regex.validator.spec.ts delete mode 100644 ui/src/app/shared/validation/regex.validator.ts delete mode 100644 ui/src/app/shared/validation/uri.validator.spec.ts delete mode 100644 ui/src/app/shared/validation/uri.validator.ts delete mode 100644 ui/src/app/shared/validation/validation-class.directive.spec.ts delete mode 100644 ui/src/app/shared/validation/validation-class.directive.ts delete mode 100644 ui/src/app/wizard/action/wizard.action.ts delete mode 100644 ui/src/app/wizard/component/wizard.component.html delete mode 100644 ui/src/app/wizard/component/wizard.component.scss delete mode 100644 ui/src/app/wizard/component/wizard.component.spec.ts delete mode 100644 ui/src/app/wizard/component/wizard.component.ts delete mode 100644 ui/src/app/wizard/model/form-definition.ts delete mode 100644 ui/src/app/wizard/model/index.ts delete mode 100644 ui/src/app/wizard/model/wizard.ts delete mode 100644 ui/src/app/wizard/reducer/index.spec.ts delete mode 100644 ui/src/app/wizard/reducer/index.ts delete mode 100644 ui/src/app/wizard/reducer/wizard.reducer.spec.ts delete mode 100644 ui/src/app/wizard/reducer/wizard.reducer.ts delete mode 100644 ui/src/app/wizard/service/wizard.service.spec.ts delete mode 100644 ui/src/app/wizard/service/wizard.service.ts delete mode 100644 ui/src/app/wizard/wizard.module.spec.ts delete mode 100644 ui/src/app/wizard/wizard.module.ts delete mode 100644 ui/src/assets/favicon-96x96.png delete mode 100644 ui/src/assets/logo_internet2.png delete mode 100644 ui/src/assets/logo_unicon.png delete mode 100644 ui/src/assets/schema/filter/entity-attributes.schema.json delete mode 100644 ui/src/assets/schema/filter/nameid.schema.json delete mode 100644 ui/src/assets/schema/provider/dynamic-http.schema.json delete mode 100644 ui/src/assets/schema/provider/file-system.schema.json delete mode 100644 ui/src/assets/schema/provider/filebacked-http.schema.json delete mode 100644 ui/src/assets/schema/provider/local-dynamic.schema.json delete mode 100644 ui/src/assets/schema/provider/metadata-provider-summary.schema.json delete mode 100644 ui/src/assets/schema/provider/metadata-provider.schema.json delete mode 100644 ui/src/assets/schema/source/metadata-source.json delete mode 100644 ui/src/assets/shibboleth_icon_color_130x130.png delete mode 100644 ui/src/assets/shibboleth_logowordmark_color.png delete mode 100644 ui/src/brand.scss delete mode 100644 ui/src/brand.ts delete mode 100644 ui/src/data/descriptors.mock.ts delete mode 100644 ui/src/data/entities.json delete mode 100644 ui/src/data/ids.mock.ts delete mode 100644 ui/src/environments/environment.prod.ts delete mode 100644 ui/src/environments/environment.ts delete mode 100644 ui/src/error.html delete mode 100644 ui/src/favicon.ico delete mode 100644 ui/src/index.html delete mode 100644 ui/src/main.ts delete mode 100644 ui/src/polyfills.ts delete mode 100644 ui/src/static.scss delete mode 100644 ui/src/styles.scss delete mode 100644 ui/src/test.ts delete mode 100644 ui/src/testing/activated-route.stub.ts delete mode 100644 ui/src/testing/attributes.stub.ts delete mode 100644 ui/src/testing/descriptor.service.stub.ts delete mode 100644 ui/src/testing/effect.util.ts delete mode 100644 ui/src/testing/file.service.stub.ts delete mode 100644 ui/src/testing/filter-list.stub.ts delete mode 100644 ui/src/testing/form-schema.stub.ts delete mode 100644 ui/src/testing/i18n.stub.ts delete mode 100644 ui/src/testing/list-values.stub.ts delete mode 100644 ui/src/testing/metadata-configuration.stub.ts delete mode 100644 ui/src/testing/mock-module.stub.ts delete mode 100644 ui/src/testing/mockMetadataWizard.ts delete mode 100644 ui/src/testing/modal.stub.ts delete mode 100644 ui/src/testing/navigation-service.stub.ts delete mode 100644 ui/src/testing/page-title-component.stub.ts delete mode 100644 ui/src/testing/property-component.stub.ts delete mode 100644 ui/src/testing/provider.stub.ts delete mode 100644 ui/src/testing/resolver.stub.ts delete mode 100644 ui/src/testing/resolvers-list.component.stub.ts delete mode 100644 ui/src/testing/router.stub.ts delete mode 100644 ui/src/testing/sample-fbhttp-provider.json delete mode 100644 ui/src/testing/shared.stub.ts delete mode 100644 ui/src/testing/utility.ts delete mode 100644 ui/src/testing/wizard.stub.ts delete mode 100644 ui/src/theme/_mixins.scss delete mode 100644 ui/src/theme/_palette.scss delete mode 100644 ui/src/theme/_variables.scss delete mode 100644 ui/src/theme/alert.scss delete mode 100644 ui/src/theme/bootstrap.scss delete mode 100644 ui/src/theme/breadcrumb.scss delete mode 100644 ui/src/theme/buttons.scss delete mode 100644 ui/src/theme/forms.scss delete mode 100644 ui/src/theme/list.scss delete mode 100644 ui/src/theme/modal.scss delete mode 100644 ui/src/theme/tags.scss delete mode 100644 ui/src/theme/typography.scss delete mode 100644 ui/src/theme/utility.scss delete mode 100644 ui/src/tsconfig.app.json delete mode 100644 ui/src/tsconfig.spec.json delete mode 100644 ui/src/typings.d.ts delete mode 100644 ui/tsconfig.json delete mode 100644 ui/tslint.json diff --git a/ui/.browserslistrc b/ui/.browserslistrc deleted file mode 100644 index 3e39f66bd..000000000 --- a/ui/.browserslistrc +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -IE 11 -not IE 9-10 diff --git a/ui/.editorconfig b/ui/.editorconfig deleted file mode 100644 index 9b7352176..000000000 --- a/ui/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Editor configuration, see http://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/ui/.nvmrc b/ui/.nvmrc deleted file mode 100644 index d16c3a34a..000000000 --- a/ui/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -10.15.3 \ No newline at end of file diff --git a/ui/README.md b/ui/README.md deleted file mode 100644 index 5e86acade..000000000 --- a/ui/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Angular - -Angular is a complete framework for UI development, meaning that in addition to rendering a web application in a browser, it also provides additional tools for other important UI considerations such as Internationalization (i18n), Accessibility (a11y), HTML 5 push state routing, an http library for connecting with our REST endpoints, a tool for scaffolding new services, components, pages, etc, and extensive end-to-end and unit testing toolset. In comparison to other frameworks, we rely on fewer 3rd party libraries or frameworks to handle these other concerns. The Angular community provides an extensive documentation website with full API documentation, as well as examples/tutorials. This includes a style-guide with rules for formatting code, which we follow on the SHIB-UI project.Angular is actively maintained by Google and has a large community and ecosystem. - -## License - -Angular is [licensed](https://angular.io/license) under the MIT license. - -## Performance - -Angular was designed for mobile from the ground up. Aside from limited processing power, mobile devices have other features and limitations that separate them from traditional computers. Touch interfaces, limited screen real estate, and mobile hardware have all been considered when developing the Angular framework. This has resulted in performance gains in Angular across the board, and makes it competitive with the many other UI frameworks available. - -## Typescript - -Angular uses [TypeScript](https://www.typescriptlang.org/), a superset of JavaScript that implements many new ESNext features as well as making JavaScript strongly typed. This makes errors and exceptions more likely to happen during compilation, resulting in fewer defects. - -By focusing on making the framework easier for computers to process, Angular and TypeScript allow for a much richer development process. Tooling for TypeScript and Angular allows for immediate Angular-specific help and feedback with nearly every IDE and editor. Strong typing enables developers to use more productive development tools and practices like static checking when developing JavaScript applications. - -However, developers can still write vanilla JavaScript for Angular that runs without transpilation. - -## NGRX - -The popular Redux state management system is implemented in SHIB-UI via the framework [NgRx](http://ngrx.github.io/). This provides reliable uni-directional data-flow in the UI which organizes the UI state in a clear and predictable way. One of NgRx's most important features is its simple testability since it is based primarily on pure functions. - -# JSON-Schema - -For Providers and Filters, the forms in SHIB-UI are built based on the standard [JSON-Schema](http://json-schema.org/). This makes the generation of forms in the editors and wizards of the application dynamic, so that if new properties are added to the specification for a Metadata Provider type, it can be added to the JSON-schema of the application without ever having to re-deploy the javascript code. Rendering of the forms is handled using [ngx-schema-form](https://github.com/makinacorpus/ngx-schema-form), a component library for connecting to a JSON-Schema to render Angular form components, and provides extensibility through support of custom components and validation rules. - -# Bootstrap - -[Bootstrap](http://getbootstrap.com/) 4 is used for the css framework in SHIB-UI, and provides our base theme, a responsive grid system, consistent styling across all major browsers, and pre-styled components which are connected to Angular using ng-bootstrap, a 3rd party framework. - -# Customizing UI - -Within the `ui > src` folder, there are two files which can be used to customize the user interface quickly. - -### Color Scheme -The `Brand.scss` contains the palette information used by bootstrap to color the user interface buttons and other components. Uncomment the color you wish to override and change the hex value accordingly and rebuild the user interface. - -For example: - -`// $blue: #00355f;` - -change to... - -`$blue: #0000FF;` - -If you wish to change the __"primary"__ color or any other mapping according to Bootstrap's conventions, there is a block of mappings at the bottom of the `Brand.scss` file to accomodate this as well. Uncomment and change the value allocated to the corresponding aspect of the theme you wish to change. - -The supported values are: - -`$brand-primary: $blue;` - The primary color used throughout the site. Default: dark blue. - -`$brand-secondary: $gray-700;` - An accept color used throughout the site. Default: dark gray. - -`$brand-success: $green;` - Indicates success or some other positive action. Default: green. - -`$brand-info: $light-blue;` - Indicates some sort of informative text or action for the user. Default: light blue. - -`$brand-warning: $yellow;` - Indicates a warning to the user. Default: yellow. - -`$brand-danger: $red;` - Indicates a dangerous action or error. Default: red. - -`$brand-light: $light-grey;` - Color used for accents, text, etc throughout application. Default: light grey. - -`$brand-dark: $dark-grey;` - Color used for accents, text, etc throughout application. Default: dark grey. - -### Logos / Footer -The `Brand.ts` contains the links, text, and image paths to modify the logos, text, and links found within the header and footer. Override the values within this Typescript file and rebuild the user interface to view changes. If the local server should host these files, they should be added to the assets folder. - -For example: - -`export const brand = {};` - -change to... - -`export const brand = { - header: 'Metadata Management' -};` - - -# Development - -## Scaffolding - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.1. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). -Before running the tests make sure you are serving the app via `ng serve`. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/ui/angular.json b/ui/angular.json deleted file mode 100644 index d987a8f82..000000000 --- a/ui/angular.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "ui": { - "root": "", - "projectType": "application", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist", - "index": "src/index.html", - "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", - "polyfills": "src/polyfills.ts", - "assets": [ - { - "glob": "**/*", - "input": "src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "src", - "output": "/" - } - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [], - "aot": true, - "allowedCommonJsDependencies": [ - "deep-object-diff", - "file-saver", - "jexl", - "z-schema" - ] - }, - "configurations": { - "production": { - "optimization": true, - "outputHashing": "bundles", - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "budgets": [ - { - "type": "anyComponentStyle", - "maximumWarning": "6kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "ui:build" - }, - "configurations": { - "production": { - "browserTarget": "ui:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "ui:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "karmaConfig": "./karma.conf.js", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "scripts": [], - "styles": [ - "src/styles.scss" - ], - "assets": [ - { - "glob": "**/*", - "input": "src/assets", - "output": "/assets" - }, - { - "glob": "favicon.ico", - "input": "src", - "output": "/" - } - ], - "codeCoverageExclude": [ - "src/polyfills.ts", - "**/*.stub.ts" - ] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - } - } - } - }, - "cli": {}, - "schematics": { - "@schematics/angular:component": { - "prefix": "app", - "styleext": "scss", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "app" - } - } -} \ No newline at end of file diff --git a/ui/build.gradle b/ui/build.gradle deleted file mode 100644 index 34827354e..000000000 --- a/ui/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - id 'base' - id 'com.github.node-gradle.node' version '2.2.4' -} - -node { - version = '10.15.3' - npmVersion = '6.4.1' - download = true -} - -npmInstall.setNpmCommand('ci') - -npm_run_build { - inputs.dir 'src' - outputs.dir 'dist' - if (project.hasProperty('npm-args')) { - args = project.'npm-args'.tokenize() - } -} - -npm_run_buildProd { - inputs.dir 'src' - outputs.dir 'dist' -} - -npm_run_start { - if (project.hasProperty('npm-args')) { - args = project.'npm-args'.tokenize() - } -} - -clean.doFirst { - file('node_modules').deleteDir() - file('dist').deleteDir() -} diff --git a/ui/build.js b/ui/build.js deleted file mode 100644 index e68d3d848..000000000 --- a/ui/build.js +++ /dev/null @@ -1,20 +0,0 @@ -const fs = require('fs-extra'); - -fs.ensureDir('./dist/unsecured').then(function () { - try { - fs.copySync('./src/error.html', './dist/unsecured/error.html') - console.log('copy error page success!') - } catch (err) { - console.error(err) - } - - try { - fs.copySync('./node_modules/font-awesome/fonts', './dist/unsecured'); - console.log('copy fonts success!') - } catch (err) { - console.log(err); - } -}); - - - diff --git a/ui/e2e/app.e2e-spec.ts b/ui/e2e/app.e2e-spec.ts deleted file mode 100644 index 0721bdae1..000000000 --- a/ui/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AppPage } from './app.po'; - -describe('ui App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getParagraphText()).toEqual('Welcome to app!'); - }); -}); diff --git a/ui/e2e/app.po.ts b/ui/e2e/app.po.ts deleted file mode 100644 index 82ea75ba5..000000000 --- a/ui/e2e/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get('/'); - } - - getParagraphText() { - return element(by.css('app-root h1')).getText(); - } -} diff --git a/ui/e2e/tsconfig.e2e.json b/ui/e2e/tsconfig.e2e.json deleted file mode 100644 index 1d9e5edf0..000000000 --- a/ui/e2e/tsconfig.e2e.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "baseUrl": "./", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/ui/karma.conf.js b/ui/karma.conf.js deleted file mode 100644 index 347949dd4..000000000 --- a/ui/karma.conf.js +++ /dev/null @@ -1,52 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html -const path = require('path'); - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage'), - require('karma-spec-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageReporter: { - dir: require('path').join(__dirname, 'coverage'), reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - skipFilesWithNoCoverage: false, - thresholds: { - emitWarning: true, - global: { - statements: 80, - branches: 80, - functions: 80, - lines: 80 - }, - each: { - statements: 30, - branches: 30, - functions: 30, - lines: 30, - overrides: {} - } - } - }, - angularCli: { - environment: 'dev' - }, - reporters: ['spec', 'coverage'], - port: 9876, - colors: true, - logLevel: config.LOG_WARN, - autoWatch: false, - browsers: ['ChromeHeadless'], - singleRun: true - }); -}; diff --git a/ui/package-lock.json b/ui/package-lock.json deleted file mode 100644 index 516c84556..000000000 --- a/ui/package-lock.json +++ /dev/null @@ -1,20035 +0,0 @@ -{ - "name": "ui", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - } - } - }, - "@angular-devkit/build-angular": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1101.1.tgz", - "integrity": "sha512-ftGjlk1qkOGhjeusYhgKhZ6EejrLVTKsvuNdygCNyK/RjISsgXowgolFdm1Yysgxdr859QAIZzMQoArnWZ2+rQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/build-optimizer": "0.1101.1", - "@angular-devkit/build-webpack": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "@babel/core": "7.12.10", - "@babel/generator": "7.12.11", - "@babel/plugin-transform-runtime": "7.12.10", - "@babel/preset-env": "7.12.11", - "@babel/runtime": "7.12.5", - "@babel/template": "7.12.7", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "11.1.1", - "ansi-colors": "4.1.1", - "autoprefixer": "10.2.1", - "babel-loader": "8.2.2", - "browserslist": "^4.9.1", - "cacache": "15.0.5", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "6.3.2", - "core-js": "3.8.2", - "critters": "0.0.6", - "css-loader": "5.0.1", - "cssnano": "4.1.10", - "file-loader": "6.2.0", - "find-cache-dir": "3.3.1", - "glob": "7.1.6", - "inquirer": "7.3.3", - "jest-worker": "26.6.2", - "karma-source-map-support": "1.4.0", - "less": "4.1.0", - "less-loader": "7.3.0", - "license-webpack-plugin": "2.3.11", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.3.3", - "minimatch": "3.0.4", - "open": "7.3.1", - "ora": "5.2.0", - "parse5-html-rewriting-stream": "6.0.1", - "pnp-webpack-plugin": "1.6.4", - "postcss": "8.2.4", - "postcss-import": "14.0.0", - "postcss-loader": "4.2.0", - "raw-loader": "4.0.2", - "regenerator-runtime": "0.13.7", - "resolve-url-loader": "3.1.2", - "rimraf": "3.0.2", - "rollup": "2.36.1", - "rxjs": "6.6.3", - "sass": "1.32.4", - "sass-loader": "10.1.1", - "semver": "7.3.4", - "source-map": "0.7.3", - "source-map-loader": "1.1.3", - "source-map-support": "0.5.19", - "speed-measure-webpack-plugin": "1.3.3", - "style-loader": "2.0.0", - "stylus": "0.54.8", - "stylus-loader": "4.3.2", - "terser": "5.5.1", - "terser-webpack-plugin": "4.2.3", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "webpack": "4.44.2", - "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.1", - "webpack-merge": "5.7.3", - "webpack-sources": "2.2.0", - "webpack-subresource-integrity": "1.5.2", - "worker-plugin": "5.0.0" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "core-js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz", - "integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "open": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", - "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1101.1.tgz", - "integrity": "sha512-kmzXmmjAOB0MdYFkx9gx+U80ZpVeKOHUCNPsR7/fNptP+O+anamSlT1vqQFkB+ykqYblXOzgJ06jMG7bFzTuxA==", - "dev": true, - "requires": { - "loader-utils": "2.0.0", - "source-map": "0.7.3", - "tslib": "2.1.0", - "typescript": "4.1.3", - "webpack-sources": "2.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1101.1.tgz", - "integrity": "sha512-IiZPM4Brs76fOar8WodXYChvKXW5fMbLKlxvTzFFfdhKukpXXNwmuAWRl4PZ/Xt6tpEASG/r4BgN6/iu4DtJ9w==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.1.tgz", - "integrity": "sha512-oyzDIzI5owzYmgwGQLBbKOkTDc49dPosI2BiBf0oWtKH2L2sQ6jiad1k/Oq4/k7TYEN8neb/eZ1dpsHmZdYqaw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.1.1.tgz", - "integrity": "sha512-XYbC0cGPChdXg0LD9EA08W24Rv5GPxGNGJNRQhUwlcU9L/szhOw9NEhr/l/DLijAxKv0J2eM5CuzKI1O/3tZYg==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "ora": "5.2.0", - "rxjs": "6.6.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - } - } - }, - "@angular/animations": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.1.0.tgz", - "integrity": "sha512-VgpknW33WJiqnNtQwNVWrpiSxkgoChIZLpYLlijSTvFwZOHiraFKApohaW8X61mwL0HuK1RB7Z36B+Q11cw3aw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/cdk": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.1.0.tgz", - "integrity": "sha512-yFEHtdp0o/xGnYebrU/PQqWVIlB7SaP3cSviq/LTv/h2EINn3PzU/Zhdhg0k0fk09BrKoS+o8AVIddduIdDpYw==", - "requires": { - "parse5": "^5.0.0", - "tslib": "^2.0.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/cli": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.1.1.tgz", - "integrity": "sha512-2nRx9KYzLVCtJA4pgDmxubHOp54O/74BYt3WGHAA7QcnSATEL7jF5a9SMoEAJ2sUtKUVVS+2dKbmYKwW6oL3Bw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1101.1", - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "@schematics/angular": "11.1.1", - "@schematics/update": "0.1101.1", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.1", - "ini": "2.0.0", - "inquirer": "7.3.3", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.0", - "npm-pick-manifest": "6.1.0", - "open": "7.3.1", - "pacote": "11.1.14", - "resolve": "1.19.0", - "rimraf": "3.0.2", - "semver": "7.3.4", - "symbol-observable": "3.0.0", - "universal-analytics": "0.4.23", - "uuid": "8.3.2" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@angular/common": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.1.0.tgz", - "integrity": "sha512-jR9fnhzvvpdilyhPnyRlRRFRJ9vf/OhUFJrL42Knaj7uknmjgeu168JhwVdq6uj+v1208suXW+nOXhKNIpH38Q==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/compiler": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.1.0.tgz", - "integrity": "sha512-XW+McH/RVjpLtNkft6UYZQbjhXwX/hvLgUa9jGlTuIFM5o7W4XRPnq5sfn3+QvzdROF0j8S5sy47mGVNQOYMNg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/compiler-cli": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.1.0.tgz", - "integrity": "sha512-PLeVrqBpn43G7DeBkDQqH38Y+VMlCIbxiP4Vv1rFAmKVNIm9J8m8jdC3EQSTXVV+L3oDCVP5/ERSCZ8Jqx6UoA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.1.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "@angular/core": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.1.0.tgz", - "integrity": "sha512-VhiRWZEj9Q/OvbbSDcgQ4f53oVcMnDB4uNL8xaWnK0Sb3lZA4aQW3VOlROBITS5n2g7D1zRhvUzdfzVuyuMIaQ==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/forms": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.1.0.tgz", - "integrity": "sha512-pHwLPGDHk3JOoK2nA3wJoDCJF2bn8NmVqv8Lh5Pd8NYqLFRIIDiHSjNkqr1eM0JUmExqfU5tCrLrPz4YChdYBA==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/language-service": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.1.0.tgz", - "integrity": "sha512-7NQcwNHgUGOdqQsyp1Xw/WFbYvC4WA+Et2DJJvkitmg2ejndtm45FALUu1Z2X6bbKzdJOuNGU5vNh1ZJ/IyGRQ==", - "dev": true - }, - "@angular/localize": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-11.1.0.tgz", - "integrity": "sha512-hF0c+EeorSWiGTB+rzQn+KSewLb7LTyCN4IjezFF05pIAwyw1cLN+3fhiTmJ/KNp8PFpR7dbW3gPwUKkLwn3rg==", - "dev": true, - "requires": { - "@babel/core": "7.8.3", - "glob": "7.1.2", - "yargs": "^16.1.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "@angular/platform-browser": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.1.0.tgz", - "integrity": "sha512-wdinsRiKC5mGWWSA5RqferFvpe3Wr9YIVK2Gaj50DlJGOJ/8yWvux3BYjsCd5B44PC8+6dxUEZMgvA6CmhXgpw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/platform-browser-dynamic": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.1.0.tgz", - "integrity": "sha512-1MFRvjbkogtEQO/bWkNm2xOIl8CeIJuRWoXYE00VKShmq4o+2kTHBRQD0NydPQYwqo9o4XpgmIrJXHgwp3S2Qw==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@angular/router": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.1.0.tgz", - "integrity": "sha512-jsGuyt/QNxtN2eHrkk6lqRnTf3NeuaxBWJSrwuoqrjLCZH2elg3r1GXDTII1Ih3E1zIwuOlK59O78dXW2eQVBg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", - "dev": true - }, - "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" - }, - "dependencies": { - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "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": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz", - "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "requires": { - "@babel/types": "^7.12.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", - "requires": { - "@babel/types": "^7.12.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", - "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", - "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "requires": { - "@babel/types": "^7.12.11" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", - "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@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": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", - "dev": true, - "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - } - } - }, - "@ng-bootstrap/ng-bootstrap": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.0.2.tgz", - "integrity": "sha512-MFtpBFKOtLZWFE8JnJWOnYLxXK3GVmVP16vhJsikdxiDVl7CtrnO+YmCYqK30WdS5eIvYKRBJF/hwOH8WvwYFQ==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/effects": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-10.1.2.tgz", - "integrity": "sha512-6pX6FEzLlqdbtFVMbCvscsaL6QC/L95e72JKj76Xz+8V77UTlpVsxWyMo7YU9pM4EXNpBGmOpMs2xKjfBfK05Q==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/entity": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-10.1.2.tgz", - "integrity": "sha512-peit/zjLUxl8zQgNuPlPXDf4FmNZYMMNGsKQHiFpShIpWjLFTnR1wCeeLw8LMrqSy9vxLO3JpXwkDFZb8a+FDg==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/router-store": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-10.1.2.tgz", - "integrity": "sha512-IBsZee5ZUmLbXkY/O4OjhJP1Q6mdu4lcLcQ9jeXsdCMH/Vvc0EGK+MlhsZrxv5+v2ZXb1bhtKsLBUsTovanLWA==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/store": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-10.1.2.tgz", - "integrity": "sha512-FUjN786ch4Qt9WgJ78ef7Yquq3mPCekgcWgZrs4ycZw1f+KdfTHLTk1bGDtO8A8CzOya5yTT7KhxbdVjbOS5ng==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngrx/store-devtools": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-10.1.2.tgz", - "integrity": "sha512-HE681GuZ+lRgSXpgt7y7LKzsfu/+Tgy9yPZpaitvkhg+eCIjnN5Uvs1rWqETHYWnsKliW25yoqFUAVw+xb7hug==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ngtools/webpack": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.1.1.tgz", - "integrity": "sha512-SoqZU8qNESwuJbiYJoRhp/aMyWeK4HClkwotqkM/bPUnnOOCRvDYP20vYhATivF8Y8xOL7wktdd1HOtFvtbvlA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "enhanced-resolve": "5.6.0", - "webpack-sources": "2.2.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.1.tgz", - "integrity": "sha512-eQTRmcuVCgGE7mR3qyabjlvXlQCMDI+gDCkcAlzn161pJY9Yxmw0Q1rXN2sZlUdfZuc9sSg0m2MaQQFBSGp+XA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@npmcli/ci-detect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", - "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", - "dev": true - }, - "@npmcli/git": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.4.tgz", - "integrity": "sha512-OJZCmJ9DNn1cz9HPXXsPmUBnqaArot3CGYo63CyajHQk+g87rPXVOJByGsskQJhPsUUEXJcsZ2Q6bWd2jSwnBA==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^1.1.0", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.3", - "npm-pick-manifest": "^6.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "semver": "^7.3.2", - "unique-filename": "^1.1.1", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", - "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1", - "read-package-json-fast": "^1.1.1", - "readdir-scoped-modules": "^1.1.0" - } - }, - "@npmcli/move-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.0.tgz", - "integrity": "sha512-Iv2iq0JuyYjKeFkSR4LPaCdDZwlGK9X2cP/01nJcp3yMJ1FjNd9vpiEYvLUgzBxKPg2SFmaOhizoQsPc0LWeOQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^2.7.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@npmcli/node-gyp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.1.tgz", - "integrity": "sha512-pBqoKPWmuk9iaEcXlLBVRIA6I1kG9JiICU+sG0NuD6NAR461F+02elHJS4WkQxHW2W5rnsfvP/ClKwmsZ9RaaA==", - "dev": true - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.1.tgz", - "integrity": "sha512-G8c86g9cQHyRINosIcpovzv0BkXQc3urhL1ORf3KTe4TS4UBsg2O4Z2feca/W3pfzdHEJzc83ETBW4aKbb3SaA==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^1.0.0", - "@npmcli/promise-spawn": "^1.3.0", - "infer-owner": "^1.0.4", - "node-gyp": "^7.1.0", - "puka": "^1.0.1", - "read-package-json-fast": "^1.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@schematics/angular": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.1.1.tgz", - "integrity": "sha512-K4G+PwCIGYE6aw28ZcqAhw+qI6I8d8qtE3D1Vd4MPVuguDWpNEaB0Y+TIYWzukh5bmOqdl9m/fkw6eZeOglUuQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "jsonc-parser": "3.0.0" - } - }, - "@schematics/update": { - "version": "0.1101.1", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1101.1.tgz", - "integrity": "sha512-BmGxxAH05ey8rc0gQpMJ7hAJyr7bM172MStpIws+MLugxZ6a6jH8vI1+MpnrqE0TK1PIPx6vclCMgf3RbQEzIw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.1.1", - "@angular-devkit/schematics": "11.1.1", - "@yarnpkg/lockfile": "1.1.0", - "ini": "2.0.0", - "npm-package-arg": "^8.0.0", - "pacote": "11.1.14", - "semver": "7.3.4", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/file-saver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", - "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/jasmine": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", - "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", - "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "12.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz", - "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@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": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "dev": true, - "requires": { - "mime-types": "~2.1.16", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "agentkeepalive": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", - "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", - "dev": true, - "requires": { - "type-fest": "^0.5.2" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "autoprefixer": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.1.tgz", - "integrity": "sha512-dwP0UjyYvROUvtU+boBx8ff5pPWami1NGTrJs9YUsS/oZVbRAcdNHOOuXSA1fc46tgKqe072cVaKD69rvCc3QQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.1", - "caniuse-lite": "^1.0.30001173", - "colorette": "^1.2.1", - "fraction.js": "^4.0.13", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", - "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "hoopy": "^0.1.2", - "tryer": "^1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "bootstrap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", - "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001173", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.634", - "escalade": "^3.1.1", - "node-releases": "^1.1.69" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001179", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", - "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", - "dev": true - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", - "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", - "dev": true - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-dependency-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", - "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codelyzer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", - "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", - "dev": true, - "requires": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "dependencies": { - "@angular/compiler": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", - "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true - }, - "@angular/core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", - "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-anything": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz", - "integrity": "sha512-lA57e7viQHOdPQcrytv5jFeudZZOXuyk47lZym279FiDQ8jeZomXiGuVf6ffMKkJ+3TIai3J1J3yi6M+/4U35g==", - "dev": true, - "requires": { - "is-what": "^3.7.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", - "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", - "dev": true, - "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.2.tgz", - "integrity": "sha1-vEZIZW59ydyA19PHu8Fy2W50TmM=" - }, - "core-js-compat": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", - "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", - "dev": true, - "requires": { - "browserslist": "^4.16.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "critters": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.6.tgz", - "integrity": "sha512-NUB3Om7tkf+XWi9+2kJ2A3l4/tHORDI1UT+nHxUqay2B/tJvMpiXcklDDLBH3fPn9Pe23uu0we/08Ukjy4cLCQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css": "^3.0.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "pretty-bytes": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - }, - "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz", - "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==", - "dev": true, - "requires": { - "camelcase": "^6.2.0", - "cssesc": "^3.0.0", - "icss-utils": "^5.0.0", - "loader-utils": "^2.0.0", - "postcss": "^8.1.4", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - }, - "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-object-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", - "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==" - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.645", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.645.tgz", - "integrity": "sha512-T7mYop3aDpRHIQaUYcmzmh6j9MAe560n6ukqjJMbVC6bVTau7dSpvB18bcsBPPtOSe10cKxhJFtlbEzLa0LL1g==", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", - "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.6.0.tgz", - "integrity": "sha512-C3GGDfFZmqUa21o10YRKbZN60DPl0HyXKXxoEnQMWso9u7KMU23L7CBHfr/rVxORddY/8YQZaU2MZ1ewTS8Pcw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "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" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "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" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fastq": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", - "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "file-saver": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", - "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "follow-redirects": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", - "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", - "dev": true - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - } - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fraction.js": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", - "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "gzip-size": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.0.tgz", - "integrity": "sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true, - "optional": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "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-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-what": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", - "integrity": "sha512-2ilQz5/f/o9V7WRWJQmpFYNmQFZ9iM+OXRonZKcYgTkCzjb949Vi4h282PD1UfmgHk666rcWonbRJ++KI41VGw==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", - "dev": true - }, - "jasmine-marbles": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.5.0.tgz", - "integrity": "sha512-hkSYy7VJpcxaKE48s/CasVpGyheElp5ZegguFi5kpYAaUWsyOko6RnMZS1kv14ThMtlJVNqCW5z16f1q6HqbEg==", - "dev": true, - "requires": { - "lodash": "^4.5.0" - } - }, - "jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", - "dev": true, - "requires": { - "colors": "1.4.0" - }, - "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - } - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jexl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jexl/-/jexl-2.3.0.tgz", - "integrity": "sha512-ecqln4kTWNkMwbFvTukOMDq1jy1GcPzvshhMp/s4pxU86xdLDq7HbDRa87DfMfbSAOS8V6EwvCdfs0S+w/iycA==", - "requires": { - "@babel/runtime": "^7.10.2" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "karma": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", - "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", - "dev": true, - "requires": { - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.4.0", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "flatted": "^2.0.2", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.15", - "log4js": "^6.2.1", - "mime": "^2.4.5", - "minimatch": "^3.0.4", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^2.3.0", - "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", - "dev": true - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", - "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", - "dev": true, - "requires": { - "resolve": "^1.3.3" - } - }, - "karma-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", - "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.1", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - } - }, - "karma-jasmine": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", - "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", - "dev": true, - "requires": { - "jasmine-core": "^3.6.0" - }, - "dependencies": { - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", - "dev": true - } - } - }, - "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", - "dev": true - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", - "dev": true, - "requires": { - "colors": "^1.1.2" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", - "dev": true - }, - "less": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.0.tgz", - "integrity": "sha512-w1Ag/f34g7LwtQ/sMVSGWIyZx+gG9ZOAEtyxeX1fG75is6BMyC2lD5kG+1RueX7PkAvlQBm2Lf2aN2j0JbVr2A==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^2.5.2", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "less-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", - "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "license-webpack-plugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz", - "integrity": "sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw==", - "dev": true, - "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", - "dev": true - }, - "make-fetch-happen": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.13.tgz", - "integrity": "sha512-rQ5NijwwdU8tIaBrpTtSVrNCcAJfyDRcKBC76vOQlyJX588/88+TE+UpjWl4BgG7gCkp29wER7xcRqkeg+x64Q==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.0.5", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" - }, - "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, - "requires": { - "mime-db": "~1.30.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz", - "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-fetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", - "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "optional": true - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "ngx-infinite-scroll": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-7.2.0.tgz", - "integrity": "sha512-EcqjKpU1ukRV3YXOW8cTVtbzPpa9UPaRtYBCg0ZQH3ceCDm+xzLbd4pXy6oKAIN4zN1r/pyGuf5XOJkA8vr6yg==", - "requires": { - "opencollective-postinstall": "^2.0.2" - } - }, - "ngx-schema-form": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ngx-schema-form/-/ngx-schema-form-2.6.0.tgz", - "integrity": "sha512-+RuWhI9ZhHtlNYfZDj/q7+IEFH1xeTi0XsQHUzh5vz/vWhGth6iQke0GaKUYvZup8ukz8tnQC8eFOPPzZC9VCw==", - "requires": { - "tslib": "^2.0.0" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^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" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "requires": { - "semver": "^7.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", - "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz", - "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "npm-pick-manifest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", - "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-registry-fetch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz", - "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", - "dev": true, - "requires": { - "@npmcli/ci-detect": "^1.0.0", - "lru-cache": "^6.0.0", - "make-fetch-happen": "^8.0.9", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", - "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "ora": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.2.0.tgz", - "integrity": "sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pacote": { - "version": "11.1.14", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.14.tgz", - "integrity": "sha512-6c5OhQelaJFDfiw/Zd8MfGCvvFHurSdeGzufZMPvRFImdbNOYFciOINf3DtUNUaU3h98eCb749UyHDsgvL19+A==", - "dev": true, - "requires": { - "@npmcli/git": "^2.0.1", - "@npmcli/installed-package-contents": "^1.0.5", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.3.0", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^9.0.0", - "promise-retry": "^1.1.1", - "read-package-json-fast": "^1.1.3", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.1.0" - }, - "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "dev": true, - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.4.tgz", - "integrity": "sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg==", - "dev": true, - "requires": { - "colorette": "^1.2.1", - "nanoid": "^3.1.20", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-import": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz", - "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", - "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - } - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "pretty-bytes": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.5.0.tgz", - "integrity": "sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "puka": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/puka/-/puka-1.0.1.tgz", - "integrity": "sha512-ssjRZxBd7BT3dte1RR3VoeT2cT/ODH8x+h0rUF1rMqB0srHYf48stSDWfiYakTp5UBZMxroZhB2+ExLDHm7W3g==", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", - "dev": true, - "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-package-json-fast": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.2.1.tgz", - "integrity": "sha512-OFbpwnHcv74Oa5YN5WvbOBfLw6yPmPcwvyJJw/tj9cWFBF7juQUDLDSZiOjEcgzfweWeeROOmbPpNN1qm4hcRg==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rfdc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", - "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.1.tgz", - "integrity": "sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - }, - "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - } - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.32.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz", - "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==", - "dev": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", - "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "socks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.5.1.tgz", - "integrity": "sha512-oZCsJJxapULAYJaEYBSzMcz8m3jqgGrHaGhkmU/o/PQfFWYWxkAaA0UMGImb6s6tEXfKi959X6VJjMMQ3P6TTQ==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", - "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.6.1", - "whatwg-mimetype": "^2.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "speed-measure-webpack-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", - "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", - "dev": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "stylus-loader": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.2.tgz", - "integrity": "sha512-xXVKHY+J7GBlOmqjCL1VvQfc+pFkBdWGtcpJSvBGE49nWWHaukox7KCjRdLTEzjrmHODm4+rLpqkYWzfJteMXQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.4", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "^2.0.0" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", - "dev": true - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "terser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", - "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - } - } - }, - "terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", - "dev": true, - "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true - }, - "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "chalk": "^2.0.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.0", - "tsconfig": "^6.0.0", - "v8flags": "^3.0.0", - "yn": "^2.0.0" - } - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", - "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - } - } - } - } - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "v8flags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "validator": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", - "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "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" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", - "dev": true, - "requires": { - "@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.3.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.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", - "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-walk": "^6.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.10", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "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" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-subresource-integrity": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", - "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", - "dev": true, - "requires": { - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", - "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true - }, - "xml-formatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-1.0.1.tgz", - "integrity": "sha1-OAgz3dC86iwJht7+u6cfhDhPNT0=", - "requires": { - "xml-parser-xo": "^2.1.1" - } - }, - "xml-parser-xo": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-2.1.3.tgz", - "integrity": "sha1-TqjrhW36TddcSrVLJRVY3grcHGE=", - "requires": { - "debug": "^2.2.0" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "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.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "z-schema": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.0.tgz", - "integrity": "sha512-58TxNEurHQEEgbrNbQnoUHXgh6tiplSvKb7D3o4K6KzICQk9vFyl8B0zycC/p3gW92qBZCmq5NJIhJODKrV7JQ==", - "requires": { - "commander": "^2.7.1", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^12.0.0" - } - }, - "zone.js": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.3.tgz", - "integrity": "sha512-Y4hTHoh4VcxU5BDGAqEoOnOiyT254w6CiHtpQxAJUSMZPyVgdbKf+5R7Mwz6xsPhMIeBXk5rTopRZDpjssTCUg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - } - } -} diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index 9dd290529..000000000 --- a/ui/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "ui", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve --proxy-config proxy.conf.json", - "build": "ng build", - "test": "ng test --code-coverage --source-map=true", - "lint": "ng lint", - "e2e": "ng e2e", - "build:static": "sass src/static.scss ./dist/unsecured/static.css", - "copy:static": "node ./build", - "copy": "npm run copy:static && npm run build:static", - "buildProd": "ng build --prod && npm run copy", - "bundle-report": "webpack-bundle-analyzer dist/stats.json" - }, - "private": true, - "dependencies": { - "@angular/animations": "11.1.0", - "@angular/cdk": "^11.1.0", - "@angular/common": "11.1.0", - "@angular/compiler": "11.1.0", - "@angular/core": "11.1.0", - "@angular/forms": "11.1.0", - "@angular/platform-browser": "11.1.0", - "@angular/platform-browser-dynamic": "11.1.0", - "@angular/router": "11.1.0", - "@ng-bootstrap/ng-bootstrap": "9.0.2", - "@ngrx/effects": "10.1.2", - "@ngrx/entity": "10.1.2", - "@ngrx/router-store": "10.1.2", - "@ngrx/store": "10.1.2", - "@ngrx/store-devtools": "10.1.2", - "bootstrap": "^4.6.0", - "core-js": "^2.4.1", - "deep-object-diff": "^1.1.0", - "deepmerge": "^2.2.1", - "file-saver": "^1.3.3", - "font-awesome": "^4.7.0", - "jexl": "^2.3.0", - "ngx-infinite-scroll": "^7.2.0", - "ngx-schema-form": "2.6.0", - "rxjs": "^6.6.3", - "tslib": "^2.0.0", - "xml-formatter": "^1.0.1", - "z-schema": "^5.0.0", - "zone.js": "~0.11.3" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.1101.1", - "@angular/cli": "^11.1.1", - "@angular/compiler-cli": "^11.1.0", - "@angular/language-service": "^11.1.0", - "@angular/localize": "^11.1.0", - "@types/file-saver": "^1.3.0", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.6", - "@types/node": "^12.11.1", - "codelyzer": "^6.0.1", - "fs-extra": "^7.0.1", - "jasmine-core": "~3.6.0", - "jasmine-marbles": "^0.5.0", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~5.0.0", - "karma-chrome-launcher": "~3.1.0", - "karma-cli": "^2.0.0", - "karma-jasmine": "~4.0.0", - "karma-jasmine-html-reporter": "^1.5.0", - "karma-coverage": "^2.0.3", - "karma-spec-reporter": "0.0.32", - "ncp": "^2.0.0", - "path": "^0.12.7", - "ts-node": "~3.2.0", - "tslint": "~6.1.0", - "typescript": "4.1.3", - "webpack-bundle-analyzer": "^3.3.2" - } -} diff --git a/ui/protractor.conf.js b/ui/protractor.conf.js deleted file mode 100644 index cc76abe2f..000000000 --- a/ui/protractor.conf.js +++ /dev/null @@ -1,28 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function () { } - }, - onPrepare() { - require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/ui/proxy.conf.json b/ui/proxy.conf.json deleted file mode 100644 index be9b3e364..000000000 --- a/ui/proxy.conf.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "/api": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/actuator": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/login": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - }, - "/logout": { - "target": "http://localhost:8080", - "secure": false, - "logLevel": "debug" - } -} diff --git a/ui/src/app/admin/action/admin-collection.action.ts b/ui/src/app/admin/action/admin-collection.action.ts deleted file mode 100644 index f9dacfd34..000000000 --- a/ui/src/app/admin/action/admin-collection.action.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; -import { Admin } from '../model/admin'; - -export enum AdminCollectionActionTypes { - - UPDATE_ADMIN_REQUEST = '[Admin Collection] Update Admin Request', - UPDATE_ADMIN_SUCCESS = '[Admin Collection] Update Admin Success', - UPDATE_ADMIN_FAIL = '[Admin Collection] Update Admin Fail', - - LOAD_ADMIN_REQUEST = '[Admin Collection] Load Admin Request', - LOAD_ADMIN_SUCCESS = '[Admin Collection] Load Admin Success', - LOAD_ADMIN_ERROR = '[Admin Collection] Load Admin Error', - - ADD_ADMIN_REQUEST = '[Admin Collection] Add Admin Request', - ADD_ADMIN_SUCCESS = '[Admin Collection] Add Admin Success', - ADD_ADMIN_FAIL = '[Admin Collection] Add Admin Fail', - - REMOVE_ADMIN_REQUEST = '[Admin Collection] Remove Admin Request', - REMOVE_ADMIN_SUCCESS = '[Admin Collection] Remove Admin Success', - REMOVE_ADMIN_FAIL = '[Admin Collection] Remove Admin Fail', - - CLEAR_ADMINS = '[Admin Collection] Clear Admins' - -} - -export class LoadAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_REQUEST; - - constructor() { } -} - -export class LoadAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS; - - constructor(public payload: Admin[]) { } -} - -export class LoadAdminError implements Action { - readonly type = AdminCollectionActionTypes.LOAD_ADMIN_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_REQUEST; - - constructor(public payload: Admin) { } -} - -export class UpdateAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateAdminFail implements Action { - readonly type = AdminCollectionActionTypes.UPDATE_ADMIN_FAIL; - - constructor(public payload: Admin) { } -} - -export class AddAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_REQUEST; - - constructor(public payload: Admin) { } -} - -export class AddAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_SUCCESS; - - constructor(public payload: Admin) { } -} - -export class AddAdminFail implements Action { - readonly type = AdminCollectionActionTypes.ADD_ADMIN_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveAdminRequest implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_REQUEST; - - constructor(public payload: string) { } -} - -export class RemoveAdminSuccess implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveAdminFail implements Action { - readonly type = AdminCollectionActionTypes.REMOVE_ADMIN_FAIL; - - constructor(public error: Error) { } -} - -export class ClearAdmins implements Action { - readonly type = AdminCollectionActionTypes.CLEAR_ADMINS; -} - - -export type AdminCollectionActionsUnion = - | LoadAdminRequest - | LoadAdminSuccess - | LoadAdminError - | AddAdminRequest - | AddAdminSuccess - | AddAdminFail - | RemoveAdminRequest - | RemoveAdminSuccess - | RemoveAdminFail - | UpdateAdminRequest - | UpdateAdminSuccess - | UpdateAdminFail - | ClearAdmins; diff --git a/ui/src/app/admin/action/metadata-collection.action.ts b/ui/src/app/admin/action/metadata-collection.action.ts deleted file mode 100644 index 07565cb6a..000000000 --- a/ui/src/app/admin/action/metadata-collection.action.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { Update } from '@ngrx/entity'; - -export enum MetadataCollectionActionTypes { - UPDATE_METADATA_REQUEST = '[Admin Metadata Collection] Update Request', - UPDATE_METADATA_SUCCESS = '[Admin Metadata Collection] Update Success', - UPDATE_METADATA_FAIL = '[Admin Metadata Collection] Update Fail', - UPDATE_METADATA_CONFLICT = '[Admin Metadata Collection] Update Conflict', - - LOAD_METADATA_REQUEST = '[Admin Metadata Collection] Load Metadata REQUEST', - LOAD_METADATA_SUCCESS = '[Admin Metadata Collection] Load Metadata SUCCESS', - LOAD_METADATA_ERROR = '[Admin Metadata Collection] Load Metadata ERROR', - - REMOVE_METADATA = '[Admin Metadata Collection] Remove Metadata', - REMOVE_METADATA_SUCCESS = '[Admin Metadata Collection] Remove Metadata Success', - REMOVE_METADATA_FAIL = '[Admin Metadata Collection] Remove Metadata Fail', -} - -export class LoadMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_REQUEST; - - constructor() { } -} - -export class LoadMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadMetadataError implements Action { - readonly type = MetadataCollectionActionTypes.LOAD_METADATA_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateMetadataFail implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateMetadataConflict implements Action { - readonly type = MetadataCollectionActionTypes.UPDATE_METADATA_CONFLICT; - - constructor(public payload: MetadataResolver) { } -} - -export class RemoveMetadataRequest implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA; - - constructor(public payload: string) { } -} - -export class RemoveMetadataSuccess implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveMetadataFail implements Action { - readonly type = MetadataCollectionActionTypes.REMOVE_METADATA_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export type MetadataCollectionActionsUnion = - | LoadMetadataRequest - | LoadMetadataSuccess - | LoadMetadataError - | RemoveMetadataRequest - | RemoveMetadataSuccess - | RemoveMetadataFail - | UpdateMetadataRequest - | UpdateMetadataSuccess - | UpdateMetadataFail - | UpdateMetadataConflict; diff --git a/ui/src/app/admin/admin.component.html b/ui/src/app/admin/admin.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/admin/admin.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/admin/admin.component.spec.ts b/ui/src/app/admin/admin.component.spec.ts deleted file mode 100644 index 79f45c1bd..000000000 --- a/ui/src/app/admin/admin.component.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { AdminComponent } from './admin.component'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import * as fromAdmin from './reducer'; - -describe('Admin Root Component', () => { - let fixture: ComponentFixture; - let instance: AdminComponent; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers) - }) - ], - declarations: [ - AdminComponent - ], - }); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(AdminComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/admin/admin.component.ts b/ui/src/app/admin/admin.component.ts deleted file mode 100644 index ae1469443..000000000 --- a/ui/src/app/admin/admin.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'admin-page', - templateUrl: './admin.component.html', - styleUrls: [] -}) -export class AdminComponent { - constructor() {} -} diff --git a/ui/src/app/admin/admin.module.ts b/ui/src/app/admin/admin.module.ts deleted file mode 100644 index fd25105a4..000000000 --- a/ui/src/app/admin/admin.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgModule } from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; - -import { SharedModule } from '../shared/shared.module'; -import { I18nModule } from '../i18n/i18n.module'; -import { AdminManagementPageComponent } from './container/admin-management.component'; -import { AdminComponent } from './admin.component'; -import { reducers } from './reducer'; -import { AdminService } from './service/admin.service'; -import { AdminCollectionEffects } from './effect/admin-collection.effect'; -import { EffectsModule } from '@ngrx/effects'; -import { DeleteUserDialogComponent } from './component/delete-user-dialog.component'; -import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import { ActionRequiredPageComponent } from './container/action-required.component'; -import { AccessRequestComponent } from './component/access-request.component'; -import { UserManagementComponent } from './component/user-management.component'; -import { EnableMetadataComponent } from './component/enable-metadata.component'; -import { ManagerModule } from '../metadata/manager/manager.module'; -import { MetadataCollectionEffects } from './effect/metadata-collection.effect'; - -@NgModule({ - declarations: [ - AdminManagementPageComponent, - AdminComponent, - DeleteUserDialogComponent, - UserManagementComponent, - ActionRequiredPageComponent, - AccessRequestComponent, - EnableMetadataComponent - ], - entryComponents: [ - DeleteUserDialogComponent - ], - imports: [ - CommonModule, - I18nModule, - StoreModule.forFeature('admin', reducers), - EffectsModule.forFeature([AdminCollectionEffects, MetadataCollectionEffects]), - FormsModule, - RouterModule, - HttpClientModule, - SharedModule, - I18nModule, - NgbModalModule, - ManagerModule - ], - providers: [ - AdminService - ] -}) -export class AdminModule { } diff --git a/ui/src/app/admin/component/access-request.component.html b/ui/src/app/admin/component/access-request.component.html deleted file mode 100644 index 85bfefab7..000000000 --- a/ui/src/app/admin/component/access-request.component.html +++ /dev/null @@ -1,53 +0,0 @@ - - -
-
-

There are no new user requests at this time.

-
-
-
- -
-
-
-
-
-
- UserId -
-
{{ user.username }}
-
- Email -
-
{{ user.emailAddress }}
-
-
-
-
- Name -
-
{{ user.firstName }} {{ user.lastName }}
- -
- -
-
-
-
- -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/admin/component/access-request.component.spec.ts b/ui/src/app/admin/component/access-request.component.spec.ts deleted file mode 100644 index 257239997..000000000 --- a/ui/src/app/admin/component/access-request.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { FormsModule } from '@angular/forms'; - -import { NgbModalStub } from '../../../testing/modal.stub'; -import { AccessRequestComponent } from './access-request.component'; -import * as fromAdmin from '../reducer'; -import * as fromCore from '../../core/reducer'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(AccessRequestComponent, { static: true }) - public componentUnderTest: AccessRequestComponent; -} - -describe('Access Request Component', () => { - - let app: AccessRequestComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers), - core: combineReducers(fromCore.reducers) - }) - ], - declarations: [ - AccessRequestComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/access-request.component.ts b/ui/src/app/admin/component/access-request.component.ts deleted file mode 100644 index e082761de..000000000 --- a/ui/src/app/admin/component/access-request.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { UserManagementComponent } from './user-management.component'; -import * as fromAdmin from '../reducer'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -@Component({ - selector: 'access-request-component', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './access-request.component.html', - styleUrls: [] -}) -export class AccessRequestComponent extends UserManagementComponent implements OnInit { - - ngOnInit(): void { - this.users$ = this.store.select(fromAdmin.getAllNewUsers); - this.hasUsers$ = this.users$.pipe(map(userList => userList.length > 0)); - } -} diff --git a/ui/src/app/admin/component/delete-user-dialog.component.html b/ui/src/app/admin/component/delete-user-dialog.component.html deleted file mode 100644 index 9255aa55e..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/admin/component/delete-user-dialog.component.spec.ts b/ui/src/app/admin/component/delete-user-dialog.component.spec.ts deleted file mode 100644 index 92677d126..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteUserDialogComponent } from './delete-user-dialog.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteUserDialogComponent, { static: true }) - public componentUnderTest: DeleteUserDialogComponent; -} - -describe('Delete Dialog (modal) Component', () => { - - let app: DeleteUserDialogComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteUserDialogComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/delete-user-dialog.component.ts b/ui/src/app/admin/component/delete-user-dialog.component.ts deleted file mode 100644 index 64a5e26ac..000000000 --- a/ui/src/app/admin/component/delete-user-dialog.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-user-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-user-dialog.component.html' -}) -export class DeleteUserDialogComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/admin/component/enable-metadata.component.html b/ui/src/app/admin/component/enable-metadata.component.html deleted file mode 100644 index dfe16220c..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/ui/src/app/admin/component/enable-metadata.component.spec.ts b/ui/src/app/admin/component/enable-metadata.component.spec.ts deleted file mode 100644 index afe962011..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { EnableMetadataComponent } from './enable-metadata.component'; - -import * as fromAdmin from '../reducer'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { NgbModalStub } from '../../../testing/modal.stub'; -import { MockResolversListComponent } from '../../../testing/resolvers-list.component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(EnableMetadataComponent, { static: true }) - public componentUnderTest: EnableMetadataComponent; -} - -describe('Enable Metadata (modal) Component', () => { - - let app: EnableMetadataComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers) - }) - ], - declarations: [ - EnableMetadataComponent, - TestHostComponent, - MockResolversListComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/enable-metadata.component.ts b/ui/src/app/admin/component/enable-metadata.component.ts deleted file mode 100644 index e6d49b958..000000000 --- a/ui/src/app/admin/component/enable-metadata.component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataEntity, MetadataResolver } from '../../metadata/domain/model'; -import * as fromDashboard from '../../metadata/manager/reducer'; -import * as fromMetadata from '../reducer'; -import { DeleteDialogComponent } from '../../metadata/manager/component/delete-dialog.component'; -import { PreviewEntity } from '../../metadata/domain/action/entity.action'; -import { FileBackedHttpMetadataResolver } from '../../metadata/domain/entity'; -import { RemoveMetadataRequest, UpdateMetadataRequest } from '../action/metadata-collection.action'; - -@Component({ - selector: 'enable-metadata', - templateUrl: './enable-metadata.component.html' -}) - -export class EnableMetadataComponent { - resolvers$: Observable = this.store - .select(fromMetadata.getMetadataCollection) - .pipe( - map(resolvers => resolvers.map(r => new FileBackedHttpMetadataResolver(r))) - ); - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal - ) {} - - edit(entity: MetadataEntity): void { - this.router.navigate(['metadata', 'resolver', entity.getId(), 'edit']); - } - - openPreviewDialog(entity: MetadataEntity): void { - this.store.dispatch(new PreviewEntity({ id: entity.getId(), entity })); - } - - toggleResolverEnabled(entity: MetadataResolver): void { - let update = { ...entity, serviceEnabled: !entity.serviceEnabled }; - this.store.dispatch(new UpdateMetadataRequest(update)); - } - - deleteResolver(entity: MetadataResolver): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveMetadataRequest(entity.id)); - }, - err => { - console.log('Cancelled'); - } - ); - } -} diff --git a/ui/src/app/admin/component/user-management.component.html b/ui/src/app/admin/component/user-management.component.html deleted file mode 100644 index d06fb8637..000000000 --- a/ui/src/app/admin/component/user-management.component.html +++ /dev/null @@ -1,42 +0,0 @@ -
-

There are no users configured in the system for you to manage.

-
- - - - - - - - - - - - - - - - - - - -
UserIdNameEmailRoleDelete?
{{ user.username }}{{ user.firstName }} {{ user.lastName }}{{ user.emailAddress }} - - - - -
\ No newline at end of file diff --git a/ui/src/app/admin/component/user-management.component.spec.ts b/ui/src/app/admin/component/user-management.component.spec.ts deleted file mode 100644 index 6a6c9aa27..000000000 --- a/ui/src/app/admin/component/user-management.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Store, StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { FormsModule } from '@angular/forms'; -import { UserManagementComponent } from './user-management.component'; -import { NgbModalStub } from '../../../testing/modal.stub'; -import * as fromAdmin from '../reducer'; -import * as fromCore from '../../core/reducer'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(UserManagementComponent, { static: true }) - public componentUnderTest: UserManagementComponent; -} - -describe('User Management Component', () => { - - let app: UserManagementComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - admin: combineReducers(fromAdmin.reducers), - core: combineReducers(fromCore.reducers) - }) - ], - declarations: [ - UserManagementComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/admin/component/user-management.component.ts b/ui/src/app/admin/component/user-management.component.ts deleted file mode 100644 index 3231050ae..000000000 --- a/ui/src/app/admin/component/user-management.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; - -import * as fromRoot from '../../app.reducer'; -import * as fromCore from '../../core/reducer'; -import * as fromAdmin from '../reducer'; - -import { UpdateAdminRequest, RemoveAdminRequest } from '../action/admin-collection.action'; -import { Admin } from '../model/admin'; -import { DeleteUserDialogComponent } from '../component/delete-user-dialog.component'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { map } from 'rxjs/operators'; - -@Component({ - selector: 'user-management', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './user-management.component.html', - styleUrls: [] -}) -export class UserManagementComponent implements OnInit, OnDestroy { - - users$: Observable; - currentUser: Admin; - userSub: Subscription; - roles$: Observable; - - hasUsers$: Observable; - - constructor( - protected store: Store, - protected modal: NgbModal - ) { - this.roles$ = this.store.select(fromCore.getUserRoles); - let user$ = this.store.select(fromCore.getUser); - this.userSub = user$.subscribe(u => this.currentUser = u); - } - - ngOnInit(): void { - this.users$ = this.store.select(fromAdmin.getAllConfiguredAdmins); - this.hasUsers$ = this.users$.pipe(map(userList => userList.length > 0)); - this.users$ = this.store.select(fromAdmin.getAllAdmins); - } - - ngOnDestroy(): void { - this.userSub.unsubscribe(); - } - - setUserRole(user: Admin, change: string): void { - this.store.dispatch(new UpdateAdminRequest({ - ...user, - role: change - })); - } - - deleteUser(user: string): void { - this.modal - .open(DeleteUserDialogComponent) - .result - .then( - result => this.store.dispatch(new RemoveAdminRequest(user)) - ) - .catch( - err => err - ); - } -} diff --git a/ui/src/app/admin/container/action-required.component.html b/ui/src/app/admin/container/action-required.component.html deleted file mode 100644 index 12da8aede..000000000 --- a/ui/src/app/admin/container/action-required.component.html +++ /dev/null @@ -1,27 +0,0 @@ -
-
-
-
-
- Enable Metadata Sources -
-
-
-
- -
-
-
-
-
-
-
-
- User Access Request -
-
-
- -
-
- diff --git a/ui/src/app/admin/container/action-required.component.ts b/ui/src/app/admin/container/action-required.component.ts deleted file mode 100644 index 7631c963b..000000000 --- a/ui/src/app/admin/container/action-required.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'action-required-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './action-required.component.html', - styleUrls: [] -}) -export class ActionRequiredPageComponent { - - constructor() {} -} diff --git a/ui/src/app/admin/container/admin-management.component.html b/ui/src/app/admin/container/admin-management.component.html deleted file mode 100644 index ebcca2e3b..000000000 --- a/ui/src/app/admin/container/admin-management.component.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
-
- User Maintenance -
-
-
-
- -
-
-
- diff --git a/ui/src/app/admin/container/admin-management.component.spec.ts b/ui/src/app/admin/container/admin-management.component.spec.ts deleted file mode 100644 index 440fe4038..000000000 --- a/ui/src/app/admin/container/admin-management.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromAdmin from '../reducer'; -import { AdminManagementPageComponent } from './admin-management.component'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'user-management', - template: '
' -}) -export class UserManagementComponent { - - constructor() {} -} - -describe('Admin Management Page Component', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: AdminManagementPageComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - 'admin': combineReducers(fromAdmin.reducers), - }), - FormsModule, - MockI18nModule - ], - declarations: [ - AdminManagementPageComponent, - UserManagementComponent - ], - }); - - fixture = TestBed.createComponent(AdminManagementPageComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - /* - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('preview method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - */ -}); diff --git a/ui/src/app/admin/container/admin-management.component.ts b/ui/src/app/admin/container/admin-management.component.ts deleted file mode 100644 index b52211be4..000000000 --- a/ui/src/app/admin/container/admin-management.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'admin-management-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './admin-management.component.html', - styleUrls: [] -}) -export class AdminManagementPageComponent { - - constructor() {} -} diff --git a/ui/src/app/admin/effect/admin-collection.effect.spec.ts b/ui/src/app/admin/effect/admin-collection.effect.spec.ts deleted file mode 100644 index 20159f7b8..000000000 --- a/ui/src/app/admin/effect/admin-collection.effect.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { Subject, Observable, of, ReplaySubject } from 'rxjs'; - -import { AdminCollectionEffects } from './admin-collection.effect'; -import { AdminService } from '../service/admin.service'; -import { Admin } from '../model/admin'; -import { LoadAdminRequest, LoadAdminSuccess, UpdateAdminSuccess } from '../action/admin-collection.action'; -import { AddNotification, ADD_NOTIFICATION } from '../../notification/action/notification.action'; -import { NotificationType, Notification } from '../../notification/model/notification'; - -describe('Admin Collection Effects', () => { - let effects: AdminCollectionEffects; - let actions: Subject; - - let admin: Admin = { - username: 'foo', - firstName: 'bar', - lastName: 'baz', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.baz' - }; - - let mockAdminService = { - query: (): Observable => of([admin]), - queryByRole: (role: string): Observable => of([admin]), - update: (user: Admin): Observable => of(admin), - remove: (userId: string): Observable => of(true) - }; - - let adminService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: AdminService, useValue: mockAdminService }, - AdminCollectionEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(AdminCollectionEffects); - adminService = TestBed.get(AdminService); - }); - - describe(`loadAdminRequest$ effect`, () => { - it('should load admins and fire a success action', () => { - spyOn(adminService, 'query').and.returnValue(of([admin])); - actions = new ReplaySubject(1); - - actions.next(new LoadAdminRequest()); - - effects.loadAdminRequest$.subscribe(result => { - expect(result).toEqual(new LoadAdminSuccess([admin])); - }); - }); - }); - - describe('updateAdminRoleReload$ effect', () => { - it('should reload the admins when the admin is updated', () => { - actions = new ReplaySubject(1); - - actions.next(new UpdateAdminSuccess({id: 'foo', changes: { ...admin }})); - - effects.updateAdminRoleReload$.subscribe(result => { - expect(result).toEqual(new LoadAdminRequest()); - }); - }); - }); - - describe('updateAdminRoleSuccess$', () => { - it('should fire a notification to the notification service', () => { - let payload = { id: 'foo', changes: { ...admin } }; - actions = new ReplaySubject(1); - - actions.next(new UpdateAdminSuccess(payload)); - - effects.updateAdminRoleSuccess$.subscribe(result => { - expect(result.type).toEqual(ADD_NOTIFICATION); - }); - }); - }); -}); diff --git a/ui/src/app/admin/effect/admin-collection.effect.ts b/ui/src/app/admin/effect/admin-collection.effect.ts deleted file mode 100644 index f867193a8..000000000 --- a/ui/src/app/admin/effect/admin-collection.effect.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, map } from 'rxjs/operators'; -import { - LoadAdminRequest, - AdminCollectionActionTypes, - LoadAdminSuccess, - UpdateAdminRequest, - UpdateAdminSuccess, - RemoveAdminRequest, - RemoveAdminSuccess -} from '../action/admin-collection.action'; -import { AdminService } from '../service/admin.service'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; - - -/* istanbul ignore next */ -@Injectable() -export class AdminCollectionEffects { - - @Effect() - loadAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.LOAD_ADMIN_REQUEST), - switchMap(() => this.adminService.query().pipe( - map(users => new LoadAdminSuccess(users)) - )) - ); - - @Effect() - updateAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_REQUEST), - map(action => action.payload), - switchMap(changes => this.adminService.update(changes).pipe( - map(user => new UpdateAdminSuccess({ - id: changes.username, - changes - })) - )) - ); - - @Effect() - updateAdminRoleReload$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS), - map(action => new LoadAdminRequest()) - ); - - @Effect() - updateAdminRoleSuccess$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS), - map(action => action.payload), - map(user => new AddNotification( - new Notification( - NotificationType.Success, - `User update successful for ${ user.changes.username }`, - 5000 - ) - )) - ); - - @Effect() - removeAdminRequest$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_REQUEST), - map(action => action.payload), - switchMap(id => this.adminService.remove(id).pipe( - map(user => new RemoveAdminSuccess(id)) - )) - ); - - @Effect() - removeAdminSuccessReload$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS), - map(action => new LoadAdminRequest()) - ); - - @Effect() - deleteAdminRoleSuccess$ = this.actions$.pipe( - ofType(AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS), - map(action => action.payload), - map(user => new AddNotification( - new Notification( - NotificationType.Success, - `User deleted.`, - 5000 - ) - )) - ); - - constructor( - private actions$: Actions, - private adminService: AdminService - ) { } -} diff --git a/ui/src/app/admin/effect/metadata-collection.effect.spec.ts b/ui/src/app/admin/effect/metadata-collection.effect.spec.ts deleted file mode 100644 index 5c76b04b7..000000000 --- a/ui/src/app/admin/effect/metadata-collection.effect.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { Subject, Observable, of, ReplaySubject } from 'rxjs'; -import { StoreModule, combineReducers } from '@ngrx/store'; - -import { MetadataCollectionEffects } from './metadata-collection.effect'; -import { LoadMetadataRequest, LoadMetadataSuccess } from '../action/metadata-collection.action'; -import { ResolverService } from '../../metadata/domain/service/resolver.service'; -import { Metadata } from '../../metadata/domain/domain.type'; -import { MetadataResolver } from '../../metadata/domain/model'; -import * as fromI18n from '../../i18n/reducer'; -import { I18nService } from '../../i18n/service/i18n.service'; -import { Router } from '@angular/router'; -import { RouterStub } from '../../../testing/router.stub'; - -describe('Metadata Collection Effects', () => { - let effects: MetadataCollectionEffects; - let actions: Subject; - - let md: Metadata = { - serviceProviderName: 'foo', - name: 'foo', - type: 'bar', - resourceId: 'foo', - createdBy: 'admin' - }; - - let resolverService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - providers: [ - { - provide: ResolverService, - useValue: jasmine.createSpyObj( - 'ResolverService', - [ - 'queryForAdmin', - 'update', - 'remove' - ] - ) - }, - { - provide: I18nService, - useValue: jasmine.createSpyObj( - 'I18nService', - [ - 'translate' - ] - ) - }, - MetadataCollectionEffects, - provideMockActions(() => actions), - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(MetadataCollectionEffects); - resolverService = TestBed.get(ResolverService); - }); - - describe(`loadMetadatas$ effect`, () => { - it('should load admins and fire a success action', () => { - resolverService.queryForAdmin.and.returnValue(of([md])); - actions = new ReplaySubject(1); - - actions.next(new LoadMetadataRequest()); - - effects.loadMetadatas$.subscribe(result => { - expect(result).toEqual(new LoadMetadataSuccess([md] as MetadataResolver[])); - }); - }); - }); -}); diff --git a/ui/src/app/admin/effect/metadata-collection.effect.ts b/ui/src/app/admin/effect/metadata-collection.effect.ts deleted file mode 100644 index db5f3e4e7..000000000 --- a/ui/src/app/admin/effect/metadata-collection.effect.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom } from 'rxjs/operators'; - -import { - MetadataCollectionActionTypes, - LoadMetadataRequest, - LoadMetadataSuccess, - LoadMetadataError, - RemoveMetadataRequest, - RemoveMetadataSuccess, - RemoveMetadataFail, - UpdateMetadataRequest, - UpdateMetadataSuccess, - UpdateMetadataFail, - UpdateMetadataConflict -} from '../action/metadata-collection.action'; -import { ResolverService } from '../../metadata/domain/service/resolver.service'; -import { removeNulls } from '../../shared/util'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; -import { I18nService } from '../../i18n/service/i18n.service'; -import * as fromRoot from '../../app.reducer'; -import * as fromI18n from '../../i18n/reducer'; -import { Router } from '@angular/router'; - - -/* istanbul ignore next */ -@Injectable() -export class MetadataCollectionEffects { - - @Effect() - loadMetadatas$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.LOAD_METADATA_REQUEST), - switchMap(() => - this.descriptorService - .queryForAdmin() - .pipe( - map(descriptors => new LoadMetadataSuccess(descriptors)), - catchError(error => of(new LoadMetadataError(error))) - ) - ) - ); - - @Effect() - updateMetadata$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_REQUEST), - map(action => action.payload), - switchMap(provider => { - return this.descriptorService - .update(removeNulls(provider)) - .pipe( - map(p => new UpdateMetadataSuccess({ - id: p.id, - changes: p - })), - catchError(err => { - if (err.status === 409) { - return of(new UpdateMetadataConflict(provider)); - } - return of(new UpdateMetadataFail({ - errorCode: err.status, - errorMessage: `${err.statusText} - ${err.message}` - })); - }) - ); - }) - ); - - @Effect() - removeMetadataSuccessReload$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS), - map(action => action.payload), - map(provider => new LoadMetadataRequest()) - ); - - @Effect() - updateMetadataSuccessNotification$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Success, - `Metadata Source has been enabled`, - 8000 - ) - )) - ); - - @Effect() - updateMetadataFailNotification$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - updateMetadataSuccessReload$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS), - map(() => new LoadMetadataRequest()) - ); - - @Effect() - removeMetadata$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA), - map(action => action.payload), - switchMap(entity => - this.descriptorService - .remove(entity) - .pipe( - map(p => new RemoveMetadataSuccess(entity)), - catchError(err => of(new RemoveMetadataFail(err))) - ) - ) - ); - - @Effect({dispatch: false}) - redirectOnRemove$ = this.actions$.pipe( - ofType(MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS), - map(action => action.payload), - switchMap(entity => - this.router.navigate(['/']) - ) - ); - - constructor( - private descriptorService: ResolverService, - private actions$: Actions, - private store: Store, - private i18nService: I18nService, - private router: Router - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/admin/model/admin.ts b/ui/src/app/admin/model/admin.ts deleted file mode 100644 index b7cd90296..000000000 --- a/ui/src/app/admin/model/admin.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface Admin { - createdDate?: string; - updatedDate?: string; - username: string; - firstName: string; - lastName: string; - - role: string; - - emailAddress: string; -} diff --git a/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts b/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts deleted file mode 100644 index 4c26df392..000000000 --- a/ui/src/app/admin/reducer/admin-collection.reducer.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { reducer, initialState as snapshot } from './admin-collection.reducer'; -import * as fromAdmin from './admin-collection.reducer'; -import { - AdminCollectionActionTypes, - LoadAdminSuccess, - UpdateAdminSuccess, - RemoveAdminSuccess -} from '../action/admin-collection.action'; -import { Admin } from '../model/admin'; - -let users = [ - { - username: 'abc', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.com', - firstName: 'Jane', - lastName: 'Doe' - }, - { - username: 'def', - role: 'ROLE_USER', - emailAddress: 'bar@baz.com', - firstName: 'John', - lastName: 'Doe' - } -]; - -describe('Admin Collection Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS}`, () => { - it('should add the loaded filters to the collection', () => { - spyOn(fromAdmin.adapter, 'addAll').and.callThrough(); - const action = new LoadAdminSuccess(users); - const result = reducer(snapshot, action); - expect(fromAdmin.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS}`, () => { - it('should update the filter in the collection', () => { - spyOn(fromAdmin.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'abc', - changes: { role: 'DELEGATED_ADMIN' } - }; - const action = new UpdateAdminSuccess(update); - const result = reducer(snapshot, action); - expect(fromAdmin.adapter.updateOne).toHaveBeenCalled(); - }); - }); - - describe(`${AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS}`, () => { - it('should set saving to false', () => { - const action = new RemoveAdminSuccess('abc'); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe('selector methods', () => { - describe('getSelectedAdminId', () => { - it('should return the state selectedAdminId', () => { - expect(fromAdmin.getSelectedAdminId(snapshot)).toBe(snapshot.selectedAdminId); - }); - }); - - describe('getError', () => { - it('should return the state saving', () => { - expect(fromAdmin.getIsSaving(snapshot)).toBe(snapshot.saving); - }); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/admin-collection.reducer.ts b/ui/src/app/admin/reducer/admin-collection.reducer.ts deleted file mode 100644 index ce404d57d..000000000 --- a/ui/src/app/admin/reducer/admin-collection.reducer.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { Admin } from '../model/admin'; -import { AdminCollectionActionsUnion, AdminCollectionActionTypes } from '../action/admin-collection.action'; - -export interface CollectionState extends EntityState { - selectedAdminId: string | null; - saving: boolean; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: Admin) => model.username -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedAdminId: null, - saving: false -}); - -export function reducer(state = initialState, action: AdminCollectionActionsUnion): CollectionState { - switch (action.type) { - case AdminCollectionActionTypes.LOAD_ADMIN_SUCCESS: { - let s = adapter.addAll(action.payload, { - ...state, - selectedAdminId: state.selectedAdminId - }); - return s; - } - case AdminCollectionActionTypes.UPDATE_ADMIN_SUCCESS: { - return adapter.updateOne(action.payload, { - ...state, - saving: false - }); - } - case AdminCollectionActionTypes.REMOVE_ADMIN_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state, - saving: false - }); - } - - default: { - return state; - } - } -} - -export const getSelectedAdminId = (state: CollectionState) => state.selectedAdminId; -export const getIsSaving = (state: CollectionState) => state.saving; -export const { - selectIds: selectAdminIds, - selectEntities: selectAdminEntities, - selectAll: selectAllAdmins, - selectTotal: selectAdminTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/admin/reducer/index.spec.ts b/ui/src/app/admin/reducer/index.spec.ts deleted file mode 100644 index 4b88e86e8..000000000 --- a/ui/src/app/admin/reducer/index.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as fromIndex from './'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { User } from '../../core/model/user'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceEnabled: true, serviceProviderName: 'bar', createdDate: 'Date' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceEnabled: false, serviceProviderName: 'fin', createdDate: 'Date' } as MetadataResolver -]; - -let users: User[] = [ - { - username: 'foo', - role: 'ROLE_ADMIN', - firstName: 'foo', - lastName: 'bar', - emailAddress: 'foo@bar.com' - }, - { - username: 'bar', - role: 'ROLE_NONE', - firstName: 'baz', - lastName: 'foo', - emailAddress: 'fooz@ball.com' - } -]; - -describe('admin dashboard state selectors', () => { - describe('getConfiguredAdminsFn', () => { - it('should return all users without the `ROLE_NONE` role', () => { - expect(fromIndex.getConfiguredAdminsFn(users).length).toBe(1); - }); - }); - - describe('getNewUsersFn', () => { - it('should return all users with the `ROLE_NONE` role', () => { - expect(fromIndex.getNewUsersFn(users).length).toBe(1); - }); - }); - describe('totalUserFn', () => { - it('should get the length of the provided array', () => { - expect(fromIndex.totalUserFn(users)).toBe(2); - }); - }); - describe('totalMetadataFn', () => { - it('should get the length of the provided list after filtering enabled resolvers', () => { - expect(fromIndex.totalMetadataFn(resolvers)).toBe(1); - }); - }); - describe('totalActionsFn', () => { - it('should return the sum of the total users and metadata', () => { - expect(fromIndex.totalActionsFn(1, 2)).toBe(3); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/index.ts b/ui/src/app/admin/reducer/index.ts deleted file mode 100644 index 76b7d5720..000000000 --- a/ui/src/app/admin/reducer/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../core/reducer'; -import * as fromAdminCollection from './admin-collection.reducer'; -import * as fromMetadataCollection from './metadata-collection.reducer'; -import { getInCollectionFn } from '../../metadata/domain/domain.util'; - -export interface AdminState { - admins: fromAdminCollection.CollectionState; - metadata: fromMetadataCollection.CollectionState; -} - -export const reducers = { - admins: fromAdminCollection.reducer, - metadata: fromMetadataCollection.reducer -}; - -export interface State extends fromRoot.State { - 'admin': AdminState; -} - -export const getAdminsCollectionFromStateFn = (state: AdminState) => state.admins; -export const getMetadataCollectionFromStateFn = (state: AdminState) => state.metadata; - -export const getFeatureState = createFeatureSelector('admin'); - -/* - * Select pieces of Admin Collection -*/ -export const getAdminCollectionState = createSelector(getFeatureState, getAdminsCollectionFromStateFn); -export const getAllAdmins = createSelector(getAdminCollectionState, fromAdminCollection.selectAllAdmins); -export const getCollectionSaving = createSelector(getAdminCollectionState, fromAdminCollection.getIsSaving); - -export const getAdminEntities = createSelector(getAdminCollectionState, fromAdminCollection.selectAdminEntities); -export const getSelectedAdminId = createSelector(getAdminCollectionState, fromAdminCollection.getSelectedAdminId); -export const getSelectedAdmin = createSelector(getAdminEntities, getSelectedAdminId, getInCollectionFn); -export const getAdminIds = createSelector(getAdminCollectionState, fromAdminCollection.selectAdminIds); - - -export const getConfiguredAdminsFn = (admins) => admins.filter(a => a.role !== 'ROLE_NONE'); -export const getAllConfiguredAdmins = createSelector(getAllAdmins, getConfiguredAdminsFn); - -export const getNewUsersFn = (admins) => admins.filter(a => a.role === 'ROLE_NONE'); -export const getAllNewUsers = createSelector(getAllAdmins, getNewUsersFn); - -/* - * Select pieces of Metadata Collection -*/ -export const getMetadataCollectionState = createSelector(getFeatureState, getMetadataCollectionFromStateFn); - -export const getMetadataEntities = createSelector(getMetadataCollectionState, fromMetadataCollection.selectMetadataEntities); -export const getSelectedMetadataId = createSelector(getMetadataCollectionState, fromMetadataCollection.getSelectedMetadataId); -export const getMetadataIds = createSelector(getMetadataCollectionState, fromMetadataCollection.selectMetadataIds); - -export const getMetadataCollection = createSelector(getMetadataCollectionState, getMetadataIds, fromMetadataCollection.selectAllMetadata); -export const getSelectedMetadata = createSelector(getMetadataEntities, getSelectedMetadataId, getInCollectionFn); - -export const totalUserFn = (users) => users.length; -export const totalMetadataFn = (md) => md.filter(obj => !obj.serviceEnabled).length; -export const totalActionsFn = (users, md) => md + users; - -export const getTotalNewUsers = createSelector(getAllNewUsers, totalUserFn); -export const getTotalNewMetadata = createSelector(getMetadataCollection, totalMetadataFn); - -export const getTotalActionsRequired = createSelector(getTotalNewUsers, getTotalNewMetadata, totalActionsFn); diff --git a/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts b/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts deleted file mode 100644 index a1b5b0c70..000000000 --- a/ui/src/app/admin/reducer/metadata-collection.reducer.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { reducer } from './metadata-collection.reducer'; -import * as fromCollection from './metadata-collection.reducer'; -import * as resolverActions from '../action/metadata-collection.action'; -import { MetadataResolver } from '../../metadata/domain/model'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceProviderName: 'bar', createdDate: 'Tue Apr 17 2018 13:33:54 GMT-0700 (MST)' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceProviderName: 'fin', createdDate: 'Tue Apr 17 2018 13:34:07 GMT-0700 (MST)' } as MetadataResolver -], -snapshot: fromCollection.CollectionState = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: resolvers[1] - }, - selectedMetadataId: null -}; - -describe('Resolver Reducer', () => { - const initialState: fromCollection.CollectionState = { - ids: [], - entities: {}, - selectedMetadataId: null, - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Providers: Success', () => { - it('should add the loaded resolvers to the collection', () => { - const action = new resolverActions.LoadMetadataSuccess(resolvers); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Providers: Success', () => { - it('should update the draft of the specified id', () => { - let changes = { ...resolvers[1], serviceEnabled: true }, - expected = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: changes - }, - selectedMetadataId: null - }; - const action = new resolverActions.UpdateMetadataSuccess({ id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - Object.assign({}, initialState, expected) - ); - }); - - it('should return state if the entityId is not found', () => { - let changes = { ...resolvers[1], serviceEnabled: true, id: '4' }; - const action = new resolverActions.UpdateMetadataSuccess({ id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual(snapshot); - }); - }); -}); diff --git a/ui/src/app/admin/reducer/metadata-collection.reducer.ts b/ui/src/app/admin/reducer/metadata-collection.reducer.ts deleted file mode 100644 index b11dded01..000000000 --- a/ui/src/app/admin/reducer/metadata-collection.reducer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { MetadataResolver } from '../../metadata/domain/model'; -import { MetadataCollectionActionsUnion, MetadataCollectionActionTypes } from '../action/metadata-collection.action'; - -export interface CollectionState extends EntityState { - selectedMetadataId: string | null; -} - -export function sortByDate(a: MetadataResolver, b: MetadataResolver): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedMetadataId: null -}); - -export function reducer(state = initialState, action: MetadataCollectionActionsUnion): CollectionState { - switch (action.type) { - case MetadataCollectionActionTypes.LOAD_METADATA_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - selectedMetadataId: state.selectedMetadataId - }); - } - - case MetadataCollectionActionTypes.UPDATE_METADATA_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case MetadataCollectionActionTypes.LOAD_METADATA_ERROR: { - return adapter.removeAll({ - ...state - }); - } - - case MetadataCollectionActionTypes.REMOVE_METADATA_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state - }); - } - - default: { - return state; - } - } -} - -export const getSelectedMetadataId = (state: CollectionState) => state.selectedMetadataId; -export const { - selectIds: selectMetadataIds, - selectEntities: selectMetadataEntities, - selectAll: selectAllMetadata, - selectTotal: selectMetadataTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/admin/service/admin.service.spec.ts b/ui/src/app/admin/service/admin.service.spec.ts deleted file mode 100644 index 39955145f..000000000 --- a/ui/src/app/admin/service/admin.service.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { AdminService } from './admin.service'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpRequest, HttpClientModule } from '@angular/common/http'; -import { Admin } from '../model/admin'; -import API_BASE_PATH from '../../app.constant'; - -let users = [ - { - username: 'abc', - role: 'ROLE_ADMIN', - emailAddress: 'foo@bar.com', - firstName: 'Jane', - lastName: 'Doe' - }, - { - username: 'def', - role: 'ROLE_USER', - emailAddress: 'bar@baz.com', - firstName: 'John', - lastName: 'Doe' - } -]; - -describe('Admin Service', () => { - // let service: AdminService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - AdminService - ] - }); - // service = TestBed.get(AdminService); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users` - && req.method === 'GET'; - }, `GET admin collection`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected patch request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.update({...users[0]}).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users/abc` - && req.method === 'PATCH'; - }, `PATCH admin user`); - } - ))); - }); - describe('remove method', () => { - it(`should send an expected delete request`, waitForAsync(inject([AdminService, HttpTestingController], - (service: AdminService, backend: HttpTestingController) => { - service.remove(users[0].username).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/admin/users/abc` - && req.method === 'DELETE'; - }, `DELETE admin user`); - } - ))); - }); -}); diff --git a/ui/src/app/admin/service/admin.service.ts b/ui/src/app/admin/service/admin.service.ts deleted file mode 100644 index 580616bc3..000000000 --- a/ui/src/app/admin/service/admin.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { Admin } from '../model/admin'; -import { HttpClient } from '@angular/common/http'; -import { map, catchError } from 'rxjs/operators'; - -import API_BASE_PATH from '../../app.constant'; - -@Injectable() -export class AdminService { - - private endpoint = '/admin/users'; - private base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - query(): Observable { - return this.http.get( - `${this.base}${this.endpoint}`, {} - ); - } - - queryByRole(role: string): Observable { - return this.http.get( - `${this.base}${this.endpoint}/role/${role}`, {} - ); - } - - update(user: Admin): Observable { - return this.http.patch( - `${this.base}${this.endpoint}/${user.username}`, {...user} - ); - } - - remove(userId: string): Observable { - return this.http.delete( - `${this.base}${this.endpoint}/${userId}` - ).pipe( - map(response => !!response), - catchError(() => of(false)) - ); - } -} diff --git a/ui/src/app/app.brand.ts b/ui/src/app/app.brand.ts deleted file mode 100644 index eb828fc41..000000000 --- a/ui/src/app/app.brand.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { brand as customBrand } from '../brand'; -import { Brand } from './core/model/brand'; - -export const brand: Brand = { - header: { - title: 'brand.header.title' - }, - logo: { - default: 'assets/shibboleth_logowordmark_color.png', - small: 'assets/shibboleth_icon_color_130x130.png', - large: 'assets/shibboleth_logowordmark_color.png', - alt: 'brand.logo-alt', - link: { - label: 'brand.logo-link-label', // shibboleth - url: 'https://www.shibboleth.net/', - description: 'brand.logo.link-description' - } - }, - footer: { - links: [ - { - label: 'brand.footer.links-label-1', - url: 'https://www.shibboleth.net/', - description: 'brand.footer.links-desc-1' - }, - { - label: 'brand.footer.links-label-2', - url: 'https://wiki.shibboleth.net/', - description: 'brand.footer.links-desc-2' - }, - { - label: 'brand.footer.links-label-3', - url: 'https://issues.shibboleth.net/', - description: 'brand.footer.links-desc-3' - }, - { - label: 'brand.footer.links-label-4', - url: 'https://www.shibboleth.net/community/lists/', - description: 'brand.footer.links-desc-4' - } - ], - text: 'brand.footer.text' - }, - ...customBrand -}; diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html deleted file mode 100644 index d1f544101..000000000 --- a/ui/src/app/app.component.html +++ /dev/null @@ -1,96 +0,0 @@ - -
- - - -
-
-
- - -
-
diff --git a/ui/src/app/app.component.scss b/ui/src/app/app.component.scss deleted file mode 100644 index 6d1c6d0a1..000000000 --- a/ui/src/app/app.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -@import '../theme/palette'; -nav.navbar { - background-color: $white; - - .dropdown-menu { - min-width: 12rem; - } -} - -.logo a { - img { - display: inline-block; - max-height: 60px; - } -} - -@media only screen and (min-width: 1024px) { - .pad-content { - padding: 0 3rem; - } -} - -@media only screen and (min-width: 1200px) { - .pad-content { - padding: 0 5rem; - } -} diff --git a/ui/src/app/app.component.spec.ts b/ui/src/app/app.component.spec.ts deleted file mode 100644 index 34bf1f15d..000000000 --- a/ui/src/app/app.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { AppComponent } from './app.component'; - -import * as fromRoot from './core/reducer'; -import { NotificationModule } from './notification/notification.module'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nService, MockI18nModule } from '../testing/i18n.stub'; -import { I18nService } from './i18n/service/i18n.service'; -import { NavigationService } from './core/service/navigation.service'; -import { NavigationServiceStub } from '../testing/navigation-service.stub'; -import { MockPageTitleComponent } from '../testing/page-title-component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(AppComponent, {static: true}) - public componentUnderTest: AppComponent; -} - -describe('AppComponent', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: AppComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - providers: [ - {provide: I18nService, useClass: MockI18nService }, - { provide: NavigationService, useValue: NavigationServiceStub } - ], - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - core: combineReducers(fromRoot.reducers) - }), - NotificationModule, - MockI18nModule - ], - declarations: [ - AppComponent, - MockPageTitleComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should create the app', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.dispatch).toHaveBeenCalledTimes(3); - })); - - it(`should have as title 'Shib-UI'`, waitForAsync(() => { - expect(app.title).toEqual('Shib UI'); - })); - - describe('version format', () => { - it('should return a formatted string', () => { - expect(app.formatter({ - build: { - version: 'foo' - }, - git: { - commit: { - id: 'bar' - } - } - })).toEqual('foo-bar'); - }); - }); -}); diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts deleted file mode 100644 index c1d0349f1..000000000 --- a/ui/src/app/app.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; -import { Observable, of, combineLatest } from 'rxjs'; -import { map, catchError, filter } from 'rxjs/operators'; - -import { Store } from '@ngrx/store'; - -import * as fromRoot from './core/reducer'; -import { VersionInfo } from './core/model/version'; -import { VersionInfoLoadRequestAction } from './core/action/version.action'; -import { I18nService } from './i18n/service/i18n.service'; -import { SetLocale } from './i18n/action/message.action'; -import { brand } from './app.brand'; -import { Brand } from './core/model/brand'; -import { UserLoadRequestAction } from './core/action/user.action'; -import { Router } from '@angular/router'; -import { NavigationService } from './core/service/navigation.service'; -import { NavigationAction } from './core/model/action'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent implements OnInit { - title = 'Shib UI'; - version$: Observable; - version: string; - formatted$: Observable; - today = new Date(); - year = new Date().getFullYear(); - isAdmin$: Observable; - brand: Brand = brand; - nav$: Observable; - - formatter = v => v && v.build ? `${v.build.version}-${v.git.commit.id}` : ''; - - constructor( - private store: Store, - private i18nService: I18nService, - private navService: NavigationService - ) { - this.version$ = this.store.select(fromRoot.getVersionInfo); - this.formatted$ = this.version$.pipe(map(this.formatter)); - this.isAdmin$ = this.store.select(fromRoot.isCurrentUserAdmin); - - this.nav$ = combineLatest( - this.store.select(fromRoot.getCurrentUserRole).pipe(filter(r => !!r)), - this.navService.emitter - ).pipe( - map(([role, actions]) => actions.filter( - action => action.restrict ? action.restrict.includes(role) : action - ) - )); - } - - ngOnInit(): void { - this.store.dispatch(new UserLoadRequestAction()); - this.store.dispatch(new VersionInfoLoadRequestAction()); - this.store.dispatch(new SetLocale(this.i18nService.getCurrentLocale())); - } -} diff --git a/ui/src/app/app.constant.ts b/ui/src/app/app.constant.ts deleted file mode 100644 index 206ee74c7..000000000 --- a/ui/src/app/app.constant.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const API_BASE_PATH = 'api'; -export default API_BASE_PATH; diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts deleted file mode 100644 index 9d6fb8ab4..000000000 --- a/ui/src/app/app.module.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreDevtoolsModule } from '@ngrx/store-devtools'; -import { StoreRouterConnectingModule, RouterStateSerializer, DefaultRouterStateSerializer } from '@ngrx/router-store'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; - -import { NgbDropdownModule, NgbModalModule, NgbPopoverModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; - -import { AppRoutingModule } from './app.routing'; -import { AppComponent } from './app.component'; - -import { CoreModule } from './core/core.module'; - -import { reducers, metaReducers } from './app.reducer'; -import { CustomRouterStateSerializer } from './shared/util'; -import { AuthorizedInterceptor } from './core/service/authorized.interceptor'; -import { NotificationModule } from './notification/notification.module'; -import { ErrorInterceptor } from './core/service/error.interceptor'; -import { ContentionModule } from './contention/contention.module'; -import { SharedModule } from './shared/shared.module'; -import { WizardModule } from './wizard/wizard.module'; -import { FormModule } from './schema-form/schema-form.module'; -import { environment } from '../environments/environment.prod'; -import { I18nModule } from './i18n/i18n.module'; -import { ApiPathInterceptor } from './core/service/api-path.interceptor'; -import { APP_BASE_HREF } from '@angular/common'; - -@NgModule({ - declarations: [ - AppComponent - ], - imports: [ - StoreModule.forRoot(reducers, { - metaReducers, - runtimeChecks: { - strictActionImmutability: false, - strictActionSerializability: false, - strictStateImmutability: false, - strictStateSerializability: false - } - }), - StoreDevtoolsModule.instrument({ - maxAge: 25, // Retains last 25 states - logOnly: environment.production, // Restrict extension to log-only mode - }), - EffectsModule.forRoot([]), - BrowserModule, - CoreModule, - CoreModule.forRoot(), - StoreRouterConnectingModule.forRoot({ serializer: DefaultRouterStateSerializer }), - NgbDropdownModule, - NgbModalModule, - NgbPopoverModule, - NgbPaginationModule, - WizardModule.forRoot(), - FormModule.forRoot(), - NotificationModule, - HttpClientModule, - ContentionModule, - SharedModule, - I18nModule.forRoot(), - I18nModule, - AppRoutingModule - ], - providers: [ - { - provide: APP_BASE_HREF, - useFactory: () => { - const url = new URL(document.getElementsByTagName('base')[0].href); - return url.pathname; - } - }, - { - provide: RouterStateSerializer, - useClass: CustomRouterStateSerializer - }, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthorizedInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ErrorInterceptor, - multi: true - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ApiPathInterceptor, - multi: true - } - ], - bootstrap: [AppComponent] -}) -export class AppModule {} diff --git a/ui/src/app/app.reducer.ts b/ui/src/app/app.reducer.ts deleted file mode 100644 index 5808ccf22..000000000 --- a/ui/src/app/app.reducer.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ActionReducerMap, MetaReducer } from '@ngrx/store'; -import * as fromRouter from '@ngrx/router-store'; - -import { RouterStateUrl } from './shared/util'; - -export interface State { - router: fromRouter.RouterReducerState; -} - -export const reducers: ActionReducerMap = { - router: fromRouter.routerReducer, -}; - -export const metaReducers: MetaReducer[] = []; diff --git a/ui/src/app/app.routing.ts b/ui/src/app/app.routing.ts deleted file mode 100644 index bceb76c2c..000000000 --- a/ui/src/app/app.routing.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule, PreloadAllModules } from '@angular/router'; - -const routes: Routes = [ - { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, - { - path: 'dashboard', - loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule) - }, - { - path: 'metadata', - loadChildren: () => import('./metadata/metadata.module').then(m => m.MetadataModule) - } -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes, { - preloadingStrategy: PreloadAllModules, - scrollOffset: [0, 64], - anchorScrolling: 'enabled', - scrollPositionRestoration: 'enabled', - relativeLinkResolution: 'legacy', - paramsInheritanceStrategy: 'always' -})], - exports: [RouterModule] -}) -export class AppRoutingModule { } diff --git a/ui/src/app/contention/action/contention.action.ts b/ui/src/app/contention/action/contention.action.ts deleted file mode 100644 index 0976c9c2d..000000000 --- a/ui/src/app/contention/action/contention.action.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Contention, ContentionResolution } from '../model/contention'; - -export enum ContentionActionTypes { - SHOW_CONTENTION = '[Contention] Show Contention', - RESOLVE_CONTENTION = '[Contention] Resolve Contention', - CANCEL_CONTENTION = '[Contention] Cancel Contention' -} - -export class ShowContentionAction implements Action { - readonly type = ContentionActionTypes.SHOW_CONTENTION; - - constructor(public payload: Contention) {} -} - -export class ResolveContentionAction implements Action { - readonly type = ContentionActionTypes.RESOLVE_CONTENTION; - - constructor(public payload: ContentionResolution) {} -} - -export class CancelContentionAction implements Action { - readonly type = ContentionActionTypes.CANCEL_CONTENTION; - - constructor(public payload: ContentionResolution) { } -} - -export type ContentionActionUnion = - | ShowContentionAction - | ResolveContentionAction - | CancelContentionAction; diff --git a/ui/src/app/contention/component/change-item.component.html b/ui/src/app/contention/component/change-item.component.html deleted file mode 100644 index b1b82de6c..000000000 --- a/ui/src/app/contention/component/change-item.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
- - - Conflict - -
- - - - - - - - - - - - - - - - - - -
- -
{{ obj[key] }}
{{ val }}
-
- -
- -
-
{{ item.value }}
-
-
-
- -

-
-
diff --git a/ui/src/app/contention/component/change-item.component.scss b/ui/src/app/contention/component/change-item.component.scss deleted file mode 100644 index 2bd2fccab..000000000 --- a/ui/src/app/contention/component/change-item.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../theme/_palette'; - -:host { - .table { - tr th { - background: $gray-200; - } - tr td { - background: $gray-100; - } - } -} \ No newline at end of file diff --git a/ui/src/app/contention/component/change-item.component.spec.ts b/ui/src/app/contention/component/change-item.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/component/change-item.component.ts b/ui/src/app/contention/component/change-item.component.ts deleted file mode 100644 index 8a2f40251..000000000 --- a/ui/src/app/contention/component/change-item.component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Component, Input, OnChanges } from '@angular/core'; -import { ChangeItem } from '../model/contention'; - -export enum ValueTypes { - array = 'array', - object = 'object', - string = 'string', - number = 'number', - symbol = 'symbol', - boolean = 'boolean', - function = 'function', - undefined = 'undefined' -} - -@Component({ - selector: 'change-item', - templateUrl: './change-item.component.html', - styleUrls: ['./change-item.component.scss'] -}) -export class ChangeItemComponent implements OnChanges { - - @Input() item: ChangeItem; - - type: string; - types = ValueTypes; - - display: any; - - constructor() {} - - ngOnChanges(): void { - let value = this.item.value; - this.type = this.getType(value); - this.display = this.getValue(value); - } - - get isList(): boolean { - return Array.isArray(this.item.value); - } - - getType(value: any): string { - return Array.isArray(value) ? 'array' : typeof value; - } - - getValue(val: any): any { - switch (this.type) { - case 'object': { - return Object.keys(val).map(k => ({ label: k, value: val[k] })); - } - case 'array': { - return this.parseArray(val); - } - default: { - return val; - } - } - } - - parseArray(list: any[]): { type: string, values: any[], headings?: string[] } { - switch (this.getType(list[0])) { - case 'string': { - return { - type: 'string', - values: list - }; - } - default: { - return { - type: 'object', - headings: list.reduce((arr, o) => { - return Object.keys(o).reduce((a, k) => { - if (a.indexOf(k) === -1) { a.push(k); } - return a; - }, arr); - }, []), - values: list - }; - } - } - } -} diff --git a/ui/src/app/contention/component/contention-dialog.component.html b/ui/src/app/contention/component/contention-dialog.component.html deleted file mode 100644 index 18b436d03..000000000 --- a/ui/src/app/contention/component/contention-dialog.component.html +++ /dev/null @@ -1,51 +0,0 @@ -
- - - - -
diff --git a/ui/src/app/contention/component/contention-dialog.component.scss b/ui/src/app/contention/component/contention-dialog.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/component/contention-dialog.component.spec.ts b/ui/src/app/contention/component/contention-dialog.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/component/contention-dialog.component.ts b/ui/src/app/contention/component/contention-dialog.component.ts deleted file mode 100644 index 1f3070081..000000000 --- a/ui/src/app/contention/component/contention-dialog.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromContention from '../reducer'; -import { Contention, ChangeItem } from '../model/contention'; - -@Component({ - selector: 'contention-dialog', - templateUrl: './contention-dialog.component.html', - styleUrls: ['./contention-dialog.component.scss'] -}) -export class ContentionDialogComponent { - - contention$: Observable>; - - theirs: ChangeItem[]; - ours: ChangeItem[]; - - resolutionObj: Object; - rejectionObj: Object; - - constructor( - public activeModal: NgbActiveModal, - private store: Store - ) { - this.contention$ = this.store.select(fromContention.getContention); - - this.contention$.subscribe(contention => { - if (contention) { - this.rejectionObj = contention.rejectionObject; - this.resolutionObj = contention.resolutionObject; - - this.ours = contention.ourChanges; - this.theirs = contention.theirChanges; - } - }); - } -} diff --git a/ui/src/app/contention/contention.module.ts b/ui/src/app/contention/contention.module.ts deleted file mode 100644 index 5ecc3c680..000000000 --- a/ui/src/app/contention/contention.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { reducers } from './reducer'; -import { ContentionEffects } from './effect/contention.effect'; -import { ContentionDialogComponent } from './component/contention-dialog.component'; -import { ChangeItemComponent } from './component/change-item.component'; -import { ContentionService } from './service/contention.service'; -import { SharedModule } from '../shared/shared.module'; -import { I18nModule } from '../i18n/i18n.module'; - -export const COMPONENTS = [ - ContentionDialogComponent, - ChangeItemComponent -]; - -@NgModule({ - imports: [ - CommonModule, - SharedModule, - StoreModule.forFeature('contention', reducers), - EffectsModule.forFeature([ContentionEffects]), - I18nModule - ], - providers: [ - ContentionService - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: COMPONENTS, -}) -export class ContentionModule {} diff --git a/ui/src/app/contention/effect/contention.effect.ts b/ui/src/app/contention/effect/contention.effect.ts deleted file mode 100644 index 55c815c71..000000000 --- a/ui/src/app/contention/effect/contention.effect.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { of } from 'rxjs'; -import { map, tap, catchError, switchMap } from 'rxjs/operators'; - -import { - ShowContentionAction, - ResolveContentionAction, - ContentionActionTypes, - CancelContentionAction -} from '../action/contention.action'; -import { ModalService, DEFAULT_MODAL_OPTIONS } from '../../core/service/modal.service'; -import { ContentionDialogComponent } from '../component/contention-dialog.component'; - - -@Injectable() -export class ContentionEffects { - - @Effect() - showContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.SHOW_CONTENTION), - map(action => action.payload), - switchMap(contention => { - const resolutionAction = of(new ResolveContentionAction({ value: contention.resolutionObject, handlers: contention.handlers })); - const rejectionAction = of(new CancelContentionAction({ value: contention.rejectionObject, handlers: contention.handlers })); - return this.modal - .open(ContentionDialogComponent, DEFAULT_MODAL_OPTIONS, { contention }) - .pipe( - switchMap(result => resolutionAction), - catchError(result => rejectionAction) - ); - }) - ); - - @Effect({ dispatch: false }) - resolveContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.RESOLVE_CONTENTION), - map(action => action.payload), - tap(r => r.handlers.resolve(r.value)) - ); - - @Effect({ dispatch: false }) - cancelContention$ = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(action => action.payload), - tap(r => r.handlers.reject(r.value)) - ); - - constructor( - private actions$: Actions, - private modal: ModalService - ) { } -} diff --git a/ui/src/app/contention/model/contention.ts b/ui/src/app/contention/model/contention.ts deleted file mode 100644 index 6109c25b0..000000000 --- a/ui/src/app/contention/model/contention.ts +++ /dev/null @@ -1,71 +0,0 @@ -export interface Versioned extends Object { - version: number; -} - -export interface Contention { - base: T; - ours: T; - theirs: T; - - rejectionObject: Object; - resolutionObject: Object; - - ourChanges: T; - theirChanges: T; - - handlers: { - resolve(value: T), - reject(value: T) - }; -} - -export interface ContentionResolution { - value: T; - handlers: { - resolve(value: T), - reject(value: T) - }; -} - -export interface ChangeItem { - label: string; - value: any; - conflict?: boolean; -} - -export class ContentionEntity implements Contention { - - private _theirChanges: T; - private _ourChanges: T; - - constructor( - readonly base: T, - readonly ours: T, - readonly theirs: T, - readonly handlers: { resolve(value: T), reject(value: T) } - ) {} - - get theirChanges(): T { - return this._theirChanges; - } - - get ourChanges(): T { - return this._ourChanges; - } - - set theirChanges(changes: T) { - this._theirChanges = changes; - } - - set ourChanges(changes: T) { - this._ourChanges = changes; - } - - get rejectionObject (): Object { - return this.theirs; - } - - get resolutionObject (): Object { - return { ...this.base as Object, ...this.ours as Object, version: this.theirs.version }; - } -} diff --git a/ui/src/app/contention/reducer/contention.reducer.spec.ts b/ui/src/app/contention/reducer/contention.reducer.spec.ts deleted file mode 100644 index a96438428..000000000 --- a/ui/src/app/contention/reducer/contention.reducer.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { reducer, initialState as snapshot, getContention } from './contention.reducer'; -import { ContentionActionTypes, ShowContentionAction, ResolveContentionAction, CancelContentionAction } from '../action/contention.action'; - -describe('Contention Reducer', () => { - - const contention = { - base: {}, - ours: {}, - theirs: {}, - - rejectionObject: {}, - resolutionObject: {}, - - ourChanges: {}, - theirChanges: {}, - - handlers: { - resolve: (value: {}) => ({}), - reject: (value: {}) => ({}) - } - }; - - const populated = { ...snapshot, contention: { ...contention } }; - - const resolution = { value: contention.ours, handlers: contention.handlers }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${ContentionActionTypes.SHOW_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ShowContentionAction(contention))).toEqual(populated); - }); - }); - - describe(`${ContentionActionTypes.RESOLVE_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ResolveContentionAction(resolution))).toEqual(snapshot); - }); - }); - - describe(`${ContentionActionTypes.CANCEL_CONTENTION}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new CancelContentionAction(resolution))).toEqual(snapshot); - }); - }); - - describe(`getContention method`, () => { - it('should return the contention object from the state', () => { - expect(getContention(snapshot)).toBe(snapshot.contention); - expect(getContention(populated)).toEqual(contention); - }); - }); -}); diff --git a/ui/src/app/contention/reducer/contention.reducer.ts b/ui/src/app/contention/reducer/contention.reducer.ts deleted file mode 100644 index d5432a93d..000000000 --- a/ui/src/app/contention/reducer/contention.reducer.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ContentionActionTypes, ContentionActionUnion } from '../action/contention.action'; -import { Contention } from '../model/contention'; - -export interface State { - contention: Contention; -} - -export const initialState: State = { - contention: null -}; - -export function reducer(state = initialState, action: ContentionActionUnion): State { - switch (action.type) { - case ContentionActionTypes.SHOW_CONTENTION: { - return { - ...state, - contention: action.payload - }; - } - case ContentionActionTypes.RESOLVE_CONTENTION: - case ContentionActionTypes.CANCEL_CONTENTION: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getContention = (state: State) => state.contention; diff --git a/ui/src/app/contention/reducer/index.spec.ts b/ui/src/app/contention/reducer/index.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/contention/reducer/index.ts b/ui/src/app/contention/reducer/index.ts deleted file mode 100644 index b4bcac876..000000000 --- a/ui/src/app/contention/reducer/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromContention from './contention.reducer'; -import * as fromRoot from '../../app.reducer'; - -export interface ContentionState { - contention: fromContention.State; -} - -export const reducers = { - contention: fromContention.reducer -}; - -export interface State extends fromRoot.State { - 'contention': ContentionState; -} - -export const getCoreState = createFeatureSelector('contention'); - -export const getContentionStateFromStateFn = (state: ContentionState) => state.contention; -export const getContentionStateFromState = createSelector(getCoreState, getContentionStateFromStateFn); - -export const getContention = createSelector(getContentionStateFromState, fromContention.getContention); diff --git a/ui/src/app/contention/service/contention.service.ts b/ui/src/app/contention/service/contention.service.ts deleted file mode 100644 index f9b85f3c6..000000000 --- a/ui/src/app/contention/service/contention.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Injectable } from '@angular/core'; -import { DifferentialService } from '../../core/service/differential.service'; -import { ContentionEntity, ChangeItem } from '../model/contention'; -import { removeNulls } from '../../shared/util'; - -@Injectable() -export class ContentionService { - - filterKeys = (key => (['version', 'modifiedDate', 'createdDate', 'createdBy', 'modifiedBy', 'audId'].indexOf(key) === -1)); - - constructor( - private diffService: DifferentialService - ) { } - - getContention(base, ours, theirs, handlers): ContentionEntity { - let entity = new ContentionEntity(base, ours, theirs, handlers); - - let theirDiff = this.diffService.updatedDiff(base, theirs); - let ourDiff = this.diffService.updatedDiff(base, removeNulls(ours)); - let ourKeys = Object.keys(ourDiff).filter(this.filterKeys); - let theirKeys = Object.keys(theirDiff).filter(this.filterKeys); - - entity.ourChanges = ourKeys.map(key => this.getChangeItem(key, ours)); - entity.theirChanges = theirKeys.map(key => this.getChangeItem(key, theirs, ourKeys)); - - return entity; - } - - getChangeItem(key, collection, compare: string[] = []): ChangeItem { - return { - label: key, - value: collection[key], - conflict: compare.some(o => o === key) - }; - } -} diff --git a/ui/src/app/core/action/configuration.action.ts b/ui/src/app/core/action/configuration.action.ts deleted file mode 100644 index 33c9e4c82..000000000 --- a/ui/src/app/core/action/configuration.action.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum ConfigurationActionTypes { - LOAD_ROLE_REQUEST = '[Config] Load User Role Request', - LOAD_ROLE_SUCCESS = '[Config] Load User Role Success', - LOAD_ROLE_FAIL = '[Config] Load User Role Fail' -} - -export class LoadRoleRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_REQUEST; - - constructor() {} -} -export class LoadRoleSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_SUCCESS; - - constructor(public payload: string[]) { } -} -export class LoadRoleFail implements Action { - readonly type = ConfigurationActionTypes.LOAD_ROLE_FAIL; - - constructor() { } -} - -export type ConfigurationActionUnion = - | LoadRoleRequest - | LoadRoleSuccess - | LoadRoleFail -; diff --git a/ui/src/app/core/action/location.action.ts b/ui/src/app/core/action/location.action.ts deleted file mode 100644 index b9da73b3d..000000000 --- a/ui/src/app/core/action/location.action.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum LocationActionTypes { - SET_TITLE = '[Location] Set Title' -} - -export class SetTitle implements Action { - readonly type = LocationActionTypes.SET_TITLE; - - constructor(public payload: string) { } -} - -export type LocationActionUnion = - | SetTitle; diff --git a/ui/src/app/core/action/user.action.ts b/ui/src/app/core/action/user.action.ts deleted file mode 100644 index 8ab396e12..000000000 --- a/ui/src/app/core/action/user.action.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Action } from '@ngrx/store'; -import { User } from '../model/user'; - - -export enum CurrentUserActionTypes { - USER_LOAD_REQUEST = '[Current User] Load User Request', - USER_LOAD_SUCCESS = '[Current User] Load User Success', - USER_LOAD_ERROR = '[Current User] Load User Fail', - REDIRECT = '[Current User] Redirect' -} - -/** - * Add User to Collection Actions - */ -export class UserLoadRequestAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_REQUEST; - - constructor() { } -} - -export class UserLoadSuccessAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_SUCCESS; - - constructor(public payload: User) { } -} - -export class UserLoadErrorAction implements Action { - readonly type = CurrentUserActionTypes.USER_LOAD_ERROR; - - constructor(public payload: { message: string }) { } -} - -export class UserRedirect implements Action { - readonly type = CurrentUserActionTypes.REDIRECT; - - constructor(public payload: string) { } -} - -export type CurrentUserActionsUnion = - | UserLoadRequestAction - | UserLoadSuccessAction - | UserLoadErrorAction - | UserRedirect; diff --git a/ui/src/app/core/action/version.action.ts b/ui/src/app/core/action/version.action.ts deleted file mode 100644 index 82d945547..000000000 --- a/ui/src/app/core/action/version.action.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Action } from '@ngrx/store'; - -import { VersionInfo } from '../model/version'; - -export const VERSION_LOAD_REQUEST = '[Version] Load REQUEST'; -export const VERSION_LOAD_SUCCESS = '[Version] Load SUCCESS'; -export const VERSION_LOAD_ERROR = '[Version] Load ERROR'; - -/** - * Add User to Collection Actions - */ -export class VersionInfoLoadRequestAction implements Action { - readonly type = VERSION_LOAD_REQUEST; -} - -export class VersionInfoLoadSuccessAction implements Action { - readonly type = VERSION_LOAD_SUCCESS; - - constructor (public payload: VersionInfo) { } -} - -export class VersionInfoLoadErrorAction implements Action { - readonly type = VERSION_LOAD_ERROR; - - constructor(public payload: Error) { } -} - -export type Actions = - | VersionInfoLoadRequestAction - | VersionInfoLoadSuccessAction - | VersionInfoLoadErrorAction; diff --git a/ui/src/app/core/component/page-title.component.spec.ts b/ui/src/app/core/component/page-title.component.spec.ts deleted file mode 100644 index b810d7d7e..000000000 --- a/ui/src/app/core/component/page-title.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import * as fromWizard from '../../wizard/reducer'; -import * as fromI18n from '../../i18n/reducer'; -import * as fromCore from '../reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { PageTitleComponent } from './page-title.component'; -import { MockI18nModule, MockI18nService } from '../../../testing/i18n.stub'; -import { I18nService } from '../../i18n/service/i18n.service'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(PageTitleComponent, { static: true }) - public componentUnderTest: PageTitleComponent; -} - -describe('Page Title Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: PageTitleComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers), - core: combineReducers(fromCore.reducers), - i18n: combineReducers(fromI18n.reducers) - }), - MockI18nModule - ], - declarations: [ - PageTitleComponent, - TestHostComponent - ], - providers: [ - { - provide: I18nService, - useClass: MockI18nService - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/core/component/page-title.component.ts b/ui/src/app/core/component/page-title.component.ts deleted file mode 100644 index 676bcfc23..000000000 --- a/ui/src/app/core/component/page-title.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; - -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../reducer'; -import { Observable, Subscription } from 'rxjs'; -import { Router, ActivatedRoute, NavigationEnd } from '@angular/router'; -import { I18nService } from '../../i18n/service/i18n.service'; -import { filter, map, mergeMap, startWith, combineLatest } from 'rxjs/operators'; -import { getCurrent } from '../../wizard/reducer'; -import { getMessages } from '../../i18n/reducer'; -import { SetTitle } from '../action/location.action'; - -@Component({ - selector: 'page-title', - template: `

{{ pageTitle$ | async }}

`, - styleUrls: [] -}) -export class PageTitleComponent implements OnInit, OnDestroy { - - pageTitle$: Observable = this.store.select(fromRoot.getLocationTitle); - - initial = true; - sub: Subscription; - - constructor( - private store: Store, - private router: Router, - private activatedRoute: ActivatedRoute, - private translateService: I18nService - ) { - this.pageTitle$.subscribe(title => { - const heading = document.getElementById('main-page-title'); - if (heading && title) { - if (!this.initial) { - heading.focus(); - } - this.initial = false; - } - if (title) { - document.title = `Shibboleth IDP UI | ${title}`; - } - }); - } - - ngOnInit(): void { - this.sub = this.router.events.pipe( - filter(e => e instanceof NavigationEnd), - map(() => this.activatedRoute), - map((route) => { - while (route.firstChild) { - route = route.firstChild; - } - return route; - }), - filter((route) => route.outlet === 'primary'), - mergeMap((route) => route.data), - combineLatest( - this.store.select(getCurrent).pipe( - filter(c => !!c), - startWith({ label: '' }) - ), - this.store.select(getMessages).pipe( - startWith({}) - ) - ), - map(([data, currentWizardPage, messages]) => { - const title = data.subtitle && currentWizardPage ? - `${data.title} - ${this.translateService.translate(currentWizardPage.label, null, messages)}` - : - data.title; - return new SetTitle(title); - }) - ).subscribe(this.store); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } -} diff --git a/ui/src/app/core/core.module.spec.ts b/ui/src/app/core/core.module.spec.ts deleted file mode 100644 index e19572a40..000000000 --- a/ui/src/app/core/core.module.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { CoreModule } from './core.module'; -import { UserService } from './service/user.service'; -import { HttpClientModule } from '@angular/common/http'; - -describe('Core Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - CoreModule.forRoot(), - HttpClientModule - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(UserService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/core/core.module.ts b/ui/src/app/core/core.module.ts deleted file mode 100644 index 8173289be..000000000 --- a/ui/src/app/core/core.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { UserService } from './service/user.service'; -import { CanDeactivateGuard } from './service/can-deactivate.guard'; -import { FileService } from './service/file.service'; - -import { reducers } from './reducer'; -import { VersionEffects } from './effect/version.effect'; -import { UserEffects } from './effect/user.effect'; -import { HttpClientModule } from '@angular/common/http'; -import { ModalService } from './service/modal.service'; -import { DifferentialService } from './service/differential.service'; -import { NavigatorService } from './service/navigator.service'; -import { NavigationService } from './service/navigation.service'; -import { PageTitleComponent } from './component/page-title.component'; - -export const COMPONENTS = [ - PageTitleComponent -]; - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - HttpClientModule - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: COMPONENTS, -}) -export class CoreModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootCoreModule, - providers: [ - UserService, - FileService, - ModalService, - DifferentialService, - CanDeactivateGuard, - NavigatorService, - NavigationService - ] - }; -} -} - -@NgModule({ - imports: [ - StoreModule.forFeature('core', reducers), - EffectsModule.forFeature([UserEffects, VersionEffects]), - ], -}) -export class RootCoreModule { } diff --git a/ui/src/app/core/effect/user.effect.spec.ts b/ui/src/app/core/effect/user.effect.spec.ts deleted file mode 100644 index 1c11e0635..000000000 --- a/ui/src/app/core/effect/user.effect.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { UserEffects } from './user.effect'; -import { Subject, of, throwError } from 'rxjs'; -import { UserService } from '../service/user.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { LoadRoleSuccess, LoadRoleFail, LoadRoleRequest } from '../action/configuration.action'; - -describe('User Effects', () => { - let effects: UserEffects; - let actions: Subject; - let userService: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - UserEffects, - UserService, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(UserEffects); - userService = TestBed.get(UserService); - }); - - it('should fire a success action', () => { - spyOn(userService, 'getRoles').and.returnValue(of(['ROLE_ADMIN'])); - actions = new ReplaySubject(1); - - actions.next(new LoadRoleRequest()); - - effects.loadRoles$.subscribe(result => { - expect(result).toEqual(new LoadRoleSuccess(['ROLE_ADMIN'])); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(userService, 'getRoles').and.returnValue(throwError(err)); - actions = new ReplaySubject(1); - - actions.next(new LoadRoleRequest()); - - effects.loadRoles$.subscribe(result => { - expect(result).toEqual(new LoadRoleFail()); - }); - }); -}); diff --git a/ui/src/app/core/effect/user.effect.ts b/ui/src/app/core/effect/user.effect.ts deleted file mode 100644 index 5417fa999..000000000 --- a/ui/src/app/core/effect/user.effect.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { of } from 'rxjs'; -import { map, tap, catchError, switchMap } from 'rxjs/operators'; - -import { - LoadRoleRequest, - LoadRoleFail, - LoadRoleSuccess, - ConfigurationActionTypes -} from '../action/configuration.action'; -import { - UserLoadRequestAction, - CurrentUserActionTypes, - UserLoadSuccessAction, - UserLoadErrorAction, - UserRedirect -} from '../action/user.action'; -import { UserService } from '../service/user.service'; - -@Injectable() -export class UserEffects { - - @Effect() - loadRoles$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_ROLE_REQUEST), - switchMap(() => - this.userService.getRoles() - .pipe( - map(roles => new LoadRoleSuccess(roles)), - catchError(error => of(new LoadRoleFail())) - ) - ) - ); - - @Effect() - loadCurrentUser$ = this.actions$.pipe( - ofType(CurrentUserActionTypes.USER_LOAD_REQUEST), - switchMap(() => - this.userService.getCurrentUser() - .pipe( - map(user => new UserLoadSuccessAction(user)), - catchError(error => of(new UserLoadErrorAction(error))) - ) - ) - ); - - @Effect({dispatch: false}) - redirect$ = this.actions$.pipe( - ofType(CurrentUserActionTypes.REDIRECT), - map((action: UserRedirect) => action.payload), - tap(path => { - window.location.href = path; - }) - ); - - constructor( - private userService: UserService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/core/effect/version.effect.spec.ts b/ui/src/app/core/effect/version.effect.spec.ts deleted file mode 100644 index 2713d1362..000000000 --- a/ui/src/app/core/effect/version.effect.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { VersionEffects } from './version.effect'; -import { - VersionInfoLoadRequestAction, - VersionInfoLoadSuccessAction, - VersionInfoLoadErrorAction -} from '../action/version.action'; -import { Subject, of, throwError } from 'rxjs'; -import { HttpClient } from '@angular/common/http'; -import { VersionInfo } from '../model/version'; - -describe('Version Effects', () => { - let effects: VersionEffects; - let actions: Subject; - let httpClient = { - get: () => of({}) - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: HttpClient, useValue: httpClient }, - VersionEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(VersionEffects); - httpClient = TestBed.get(HttpClient); - }); - - it('should fire a success action', () => { - let v = {}; - spyOn(httpClient, 'get').and.returnValue(of({})); - actions = new ReplaySubject(1); - - actions.next(new VersionInfoLoadRequestAction()); - - effects.loadVersionInfo$.subscribe(result => { - expect(result).toEqual(new VersionInfoLoadSuccessAction(v as VersionInfo)); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(httpClient, 'get').and.returnValue(throwError(err)); - actions = new ReplaySubject(1); - - actions.next(new VersionInfoLoadRequestAction()); - - effects.loadVersionInfo$.subscribe(result => { - expect(result).toEqual(new VersionInfoLoadErrorAction(err)); - }); - }); -}); diff --git a/ui/src/app/core/effect/version.effect.ts b/ui/src/app/core/effect/version.effect.ts deleted file mode 100644 index b588a6011..000000000 --- a/ui/src/app/core/effect/version.effect.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Location } from '@angular/common'; -import { HttpClient } from '@angular/common/http'; - -import { of } from 'rxjs'; -import { map, switchMap, catchError } from 'rxjs/operators'; - -import * as version from '../action/version.action'; -import { VersionInfo } from '../model/version'; - -@Injectable() -export class VersionEffects { - - private endpoint = '/info'; - private base = 'actuator'; - - @Effect() - loadVersionInfo$ = this.actions$ - .pipe( - ofType(version.VERSION_LOAD_REQUEST), - switchMap(() => - this.http.get(`${this.base}${this.endpoint}`) - .pipe( - map(info => new version.VersionInfoLoadSuccessAction(info)), - catchError(error => of(new version.VersionInfoLoadErrorAction(error))) - ) - ) - ); - - constructor( - private http: HttpClient, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/model/action.ts b/ui/src/app/core/model/action.ts deleted file mode 100644 index 49ad487aa..000000000 --- a/ui/src/app/core/model/action.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface NavigationAction { - action: ($event: Event) => void; - category?: string; - label: string; - content: string; - icon?: string; - restrict?: string[]; -} diff --git a/ui/src/app/core/model/brand.ts b/ui/src/app/core/model/brand.ts deleted file mode 100644 index 2713957e3..000000000 --- a/ui/src/app/core/model/brand.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface Brand { - logo: Logo; - footer: Footer; - header: Header; -} - -export interface Header { - title: string; -} - -export interface Logo { - default: string; - small: string; - large: string; - alt: string; - link: Link; - [propName: string]: any; -} - -export interface Footer { - links: Link[]; - text: string; -} - -export interface Link { - label: string; - url: string; - description?: string; -} diff --git a/ui/src/app/core/model/query.ts b/ui/src/app/core/model/query.ts deleted file mode 100644 index d7d85a841..000000000 --- a/ui/src/app/core/model/query.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface QueryParams { - term: string; - resourceId?: string; - limit?: number; - offset?: number; -} diff --git a/ui/src/app/core/model/user.ts b/ui/src/app/core/model/user.ts deleted file mode 100644 index 27375c23e..000000000 --- a/ui/src/app/core/model/user.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface User { - username: string; - role: string; - firstName: string; - lastName: string; - emailAddress: string; -} diff --git a/ui/src/app/core/model/version.ts b/ui/src/app/core/model/version.ts deleted file mode 100644 index 4e931bc17..000000000 --- a/ui/src/app/core/model/version.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface VersionInfo { - git: { - commit: { - time: string, - id: string - }, - branch: string - }; - build: { - version: string, - artifact: string, - name: string, - group: string, - time: string - }; -} diff --git a/ui/src/app/core/reducer/configuration.reducer.spec.ts b/ui/src/app/core/reducer/configuration.reducer.spec.ts deleted file mode 100644 index e8e8a802e..000000000 --- a/ui/src/app/core/reducer/configuration.reducer.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { reducer } from './configuration.reducer'; -import * as fromConfiguration from './configuration.reducer'; -import * as actions from '../action/configuration.action'; - -describe('Configuration Reducer', () => { - const initialState: fromConfiguration.ConfigState = { - roles: [] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Role Load Request', () => { - it('should set fetching to true', () => { - const action = new actions.LoadRoleSuccess(['ADMIN']); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - roles: ['ADMIN'] - } - ); - }); - }); - - describe('selector functions', () => { - it('should return the roles from state', () => { - expect(fromConfiguration.getRoles(initialState)).toEqual([]); - }); - }); -}); diff --git a/ui/src/app/core/reducer/configuration.reducer.ts b/ui/src/app/core/reducer/configuration.reducer.ts deleted file mode 100644 index 8f29e4126..000000000 --- a/ui/src/app/core/reducer/configuration.reducer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ConfigurationActionUnion, ConfigurationActionTypes } from '../action/configuration.action'; - -export interface ConfigState { - roles: string[]; -} - -export const initialState: ConfigState = { - roles: [] -}; - -export function reducer(state = initialState, action: ConfigurationActionUnion): ConfigState { - switch (action.type) { - case ConfigurationActionTypes.LOAD_ROLE_SUCCESS: { - return { - roles: [...action.payload] - }; - } - default: { - return state; - } - } -} - - -export const getRoles = (state: ConfigState) => state.roles; diff --git a/ui/src/app/core/reducer/index.spec.ts b/ui/src/app/core/reducer/index.spec.ts deleted file mode 100644 index 8f9fb9f8f..000000000 --- a/ui/src/app/core/reducer/index.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as fromIndex from './index'; -import * as fromUser from './user.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromLocation from './location.reducer'; -import * as fromConfig from './configuration.reducer'; -import { VersionInfo } from '../model/version'; - -describe('Core index reducers', () => { - const state: fromIndex.CoreState = { - user: fromUser.initialState as fromUser.UserState, - version: fromVersion.initialState as fromVersion.VersionState, - config: fromConfig.initialState as fromConfig.ConfigState, - location: fromLocation.initialState as fromLocation.LocationState - }; - describe('getUserStateFn function', () => { - it('should return the user state', () => { - expect(fromIndex.getUserStateFn(state)).toEqual(state.user); - }); - }); - describe('getVersionStateFn function', () => { - it('should return the version state', () => { - expect(fromIndex.getVersionStateFn(state)).toEqual(state.version); - }); - }); - describe('getConfigStateFn function', () => { - it('should return the config state', () => { - expect(fromIndex.getConfigStateFn(state)).toEqual(state.config); - }); - }); - describe('filterRolesFn', () => { - it('should return the roles that are not `non roles`', () => { - expect(fromIndex.filterRolesFn(['ROLE_ADMIN', 'ROLE_NONE'])).toEqual(['ROLE_ADMIN']); - }); - }); - describe('isUserAdminFn', () => { - it('should check if the provided user has the ROLE_ADMIN role', () => { - expect(fromIndex.isUserAdminFn({role: 'ROLE_ADMIN'})).toBe(true); - expect(fromIndex.isUserAdminFn({role: 'ROLE_USER'})).toBe(false); - expect(fromIndex.isUserAdminFn(null)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/core/reducer/index.ts b/ui/src/app/core/reducer/index.ts deleted file mode 100644 index ee794a567..000000000 --- a/ui/src/app/core/reducer/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - createSelector, - createFeatureSelector -} from '@ngrx/store'; - -import * as fromUser from './user.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromConfig from './configuration.reducer'; -import * as fromLocation from './location.reducer'; -import * as fromRoot from '../../app.reducer'; - -export interface CoreState { - user: fromUser.UserState; - version: fromVersion.VersionState; - config: fromConfig.ConfigState; - location: fromLocation.LocationState; -} - -export interface State extends fromRoot.State { - core: CoreState; -} - -export const reducers = { - user: fromUser.reducer, - version: fromVersion.reducer, - config: fromConfig.reducer, - location: fromLocation.reducer -}; - -export const getCoreFeature = createFeatureSelector('core'); -export const getUserStateFn = (state: CoreState) => state.user; -export const getVersionStateFn = (state: CoreState) => state.version; -export const getConfigStateFn = (state: CoreState) => state.config; -export const getLocationStateFn = (state: CoreState) => state.location; - -export const getUserState = createSelector(getCoreFeature, getUserStateFn); -export const getUser = createSelector(getUserState, fromUser.getUser); -export const isFetching = createSelector(getUserState, fromUser.isFetching); -export const getUserError = createSelector(getUserState, fromUser.getError); - -export const getVersionState = createSelector(getCoreFeature, getVersionStateFn); -export const getVersionInfo = createSelector(getVersionState, fromVersion.getVersionInfo); -export const getVersionLoading = createSelector(getVersionState, fromVersion.getVersionIsLoading); -export const getVersionError = createSelector(getVersionState, fromVersion.getVersionError); - -export const filterRolesFn = (roles: string[]) => roles.filter(r => r !== 'ROLE_NONE'); -export const isUserAdminFn = (user) => user ? user.role === 'ROLE_ADMIN' : false; - -export const getConfigState = createSelector(getCoreFeature, getConfigStateFn); -export const getRoles = createSelector(getConfigState, fromConfig.getRoles); - -export const getUserRoles = createSelector(getRoles, filterRolesFn); -export const getCurrentUserRole = createSelector(getUser, u => u ? u.role : null); - -export const isCurrentUserAdmin = createSelector(getUser, isUserAdminFn); - -export const getLocationState = createSelector(getCoreFeature, getLocationStateFn); -export const getLocationTitle = createSelector(getLocationState, fromLocation.getTitle); diff --git a/ui/src/app/core/reducer/location.reducer.ts b/ui/src/app/core/reducer/location.reducer.ts deleted file mode 100644 index dfc6cfbd5..000000000 --- a/ui/src/app/core/reducer/location.reducer.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LocationActionUnion, LocationActionTypes } from '../action/location.action'; - -export interface LocationState { - title: string; -} - -export const initialState: LocationState = { - title: '' -}; - -export function reducer(state = initialState, action: LocationActionUnion): LocationState { - switch (action.type) { - case LocationActionTypes.SET_TITLE: - return { - ...state, - title: action.payload - }; - default: - return state; - } -} - -export const getTitle = (state: LocationState) => state.title; diff --git a/ui/src/app/core/reducer/user.reducer.spec.ts b/ui/src/app/core/reducer/user.reducer.spec.ts deleted file mode 100644 index d7cbaacdf..000000000 --- a/ui/src/app/core/reducer/user.reducer.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { reducer } from './user.reducer'; -import * as fromUser from './user.reducer'; -import * as actions from '../action/user.action'; -import { User } from '../model/user'; - -describe('User Reducer', () => { - const initialState: fromUser.UserState = { - fetching: false, - user: null, - error: null - }; - - const user: User = { - username: 'foo', - role: 'admin', - firstName: 'somebody', - lastName: 'nobody', - emailAddress: 'email@edu.edu' - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('User Load Request', () => { - it('should set fetching to true', () => { - const action = new actions.UserLoadRequestAction(); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { fetching: true }) - ); - }); - }); - - describe('User Load Success', () => { - it('should update the user', () => { - const action = new actions.UserLoadSuccessAction(user); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { user: user }) - ); - }); - }); - - describe('User Load Error', () => { - it('should store the error message', () => { - const error = { message: 'Failed', type: '404' }; - const action = new actions.UserLoadErrorAction(error); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { error: error }) - ); - }); - }); - - describe('User Selectors', () => { - const state = { - user: { ...user }, - fetching: true, - error: { message: 'foo', type: 'bar' } - } as fromUser.UserState; - - it('should select the user', () => { - expect(fromUser.getUser(state)).toEqual(state.user); - }); - it('should select the fetching state', () => { - expect(fromUser.isFetching(state)).toEqual(state.fetching); - }); - it('should select the user', () => { - expect(fromUser.getError(state)).toEqual(state.error); - }); - }); -}); diff --git a/ui/src/app/core/reducer/user.reducer.ts b/ui/src/app/core/reducer/user.reducer.ts deleted file mode 100644 index 2510d5c5e..000000000 --- a/ui/src/app/core/reducer/user.reducer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { User } from '../model/user'; -import { - CurrentUserActionTypes, - CurrentUserActionsUnion -} from '../action/user.action'; - -export interface UserState { - fetching: boolean; - user: User | null; - error: { - type: string, - message: string - }; -} - -export const initialState: UserState = { - fetching: false, - user: null, - error: null -}; - -export function reducer(state = initialState, action: CurrentUserActionsUnion): UserState { - switch (action.type) { - case CurrentUserActionTypes.USER_LOAD_REQUEST: { - return Object.assign({}, state, { - fetching: true - }); - } - case CurrentUserActionTypes.USER_LOAD_SUCCESS: { - return Object.assign({}, state, { - fetching: false, - user: action.payload - }); - } - case CurrentUserActionTypes.USER_LOAD_ERROR: { - return Object.assign({}, state, { - fetching: false, - user: null, - error: action.payload - }); - } - default: { - return state; - } - } -} - - -export const getUser = (state: UserState) => state.user; -export const getError = (state: UserState) => state.error; -export const isFetching = (state: UserState) => state.fetching; diff --git a/ui/src/app/core/reducer/version.reducer.spec.ts b/ui/src/app/core/reducer/version.reducer.spec.ts deleted file mode 100644 index 1536eeaa6..000000000 --- a/ui/src/app/core/reducer/version.reducer.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { reducer } from './version.reducer'; -import * as fromVersion from './version.reducer'; -import * as actions from '../action/version.action'; -import { VersionInfo } from '../model/version'; - -describe('Version Reducer', () => { - const initialState: fromVersion.VersionState = { - info: {}, - loading: false, - error: null - }; - - const version: VersionInfo = { - git: { - commit: { - time: '2018-03-28T20:14:36Z', - id: '40aff48' - }, - branch: 'feature/SHIBUI-285' - }, - build: { - version: '1.0.0', - artifact: 'shibui', - name: 'master', - group: 'foo', - time: '2018-03-29T14:51:38.975Z' - } - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Version Load Request', () => { - it('should set loading to true', () => { - const action = new actions.VersionInfoLoadRequestAction(); - const result = reducer(initialState, action); - expect(result.loading).toBe(true); - }); - }); - - describe('Version Load Success', () => { - it('should set loading to false', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(result.loading).toBe(false); - }); - - it('should set the version data to the payload', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(result.info).toEqual(version); - }); - }); - - describe('Version Load Success', () => { - it('should set loading to false', () => { - const action = new actions.VersionInfoLoadErrorAction(new Error()); - const result = reducer(initialState, action); - expect(result.loading).toBe(false); - }); - - it('should add an error to state', () => { - const err = new Error('fail!'); - const action = new actions.VersionInfoLoadErrorAction(err); - const result = reducer(initialState, action); - expect(result.error).toEqual(err); - }); - }); - - describe('getVersionInfo selector', () => { - it('should return the version info from state', () => { - const action = new actions.VersionInfoLoadSuccessAction(version); - const result = reducer(initialState, action); - expect(fromVersion.getVersionInfo(result)).toEqual(version); - }); - }); - - describe('getError selector', () => { - it('should return the version error from state', () => { - const err = new Error('fail'); - const action = new actions.VersionInfoLoadErrorAction(err); - const result = reducer(initialState, action); - expect(fromVersion.getVersionError(result)).toEqual(err); - }); - }); - - describe('getLoading selector', () => { - it('should return the version loading status from state', () => { - const action = new actions.VersionInfoLoadRequestAction(); - const result = reducer(initialState, action); - expect(fromVersion.getVersionIsLoading(result)).toBe(true); - }); - }); -}); diff --git a/ui/src/app/core/reducer/version.reducer.ts b/ui/src/app/core/reducer/version.reducer.ts deleted file mode 100644 index 4b40ddf77..000000000 --- a/ui/src/app/core/reducer/version.reducer.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as version from '../action/version.action'; -import * as fromRoot from '../../core/reducer'; - -export interface VersionState { - info: any; - loading: boolean; - error: Error | null; -} - -export const initialState: VersionState = { - info: {}, - loading: false, - error: null -}; - -export function reducer(state = initialState, action: version.Actions): VersionState { - switch (action.type) { - case version.VERSION_LOAD_REQUEST: { - return { - ...state, - loading: true - }; - } - case version.VERSION_LOAD_SUCCESS: { - return { - ...state, - loading: false, - info: action.payload - }; - } - case version.VERSION_LOAD_ERROR: { - return { - ...state, - loading: false, - error: action.payload - }; - } - default: { - return state; - } - } -} - -export const getVersionInfo = (state: VersionState) => state.info; -export const getVersionIsLoading = (state: VersionState) => state.loading; -export const getVersionError = (state: VersionState) => state.error; diff --git a/ui/src/app/core/service/admin.guard.ts b/ui/src/app/core/service/admin.guard.ts deleted file mode 100644 index c602082c8..000000000 --- a/ui/src/app/core/service/admin.guard.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; -import { Store } from '@ngrx/store'; - -import * as fromCore from '../reducer'; -import { Observable } from 'rxjs'; -import { filter, catchError, take } from 'rxjs/operators'; - - -@Injectable({ - providedIn: 'root', -}) -export class AdminGuard implements CanActivate { - - constructor( - private store: Store, - private router: Router - ) {} - - canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - const isAdminObs = this.checkIsAdmin().pipe(take(1)); - isAdminObs.subscribe(authed => { - if (!authed) { - this.router.navigate(['/']); - } - }); - return isAdminObs; - } - - checkIsAdmin(): Observable { - return this.store - .select(fromCore.isCurrentUserAdmin) - .pipe( - filter(isAdmin => isAdmin !== null), - ); - } -} diff --git a/ui/src/app/core/service/api-path.interceptor.spec.ts b/ui/src/app/core/service/api-path.interceptor.spec.ts deleted file mode 100644 index 976805dca..000000000 --- a/ui/src/app/core/service/api-path.interceptor.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HTTP_INTERCEPTORS, HttpClientModule, HttpClient, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -import { ApiPathInterceptor } from './api-path.interceptor'; -import { APP_BASE_HREF } from '@angular/common'; - -describe('API Path Interceptor Service', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - { - provide: APP_BASE_HREF, - useValue: '/shibui/' - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ApiPathInterceptor, - multi: true - } - ] - }); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([HttpClient, HttpTestingController], - (service: HttpClient, backend: HttpTestingController) => { - service.get('foo').subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === '/shibui/foo' - && req.method === 'GET'; - }, `GET collection`); - } - ))); - }); -}); diff --git a/ui/src/app/core/service/api-path.interceptor.ts b/ui/src/app/core/service/api-path.interceptor.ts deleted file mode 100644 index 5417e5a7f..000000000 --- a/ui/src/app/core/service/api-path.interceptor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable, Inject } from '@angular/core'; -import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { APP_BASE_HREF } from '@angular/common'; - -@Injectable() -export class ApiPathInterceptor implements HttpInterceptor { - constructor( - @Inject(APP_BASE_HREF) private baseHref: string - ) {} - intercept(req: HttpRequest, next: HttpHandler): Observable> { - const apiReq = req.clone({ url: `${this.baseHref}${req.url}` }); - return next.handle(apiReq); - } -} diff --git a/ui/src/app/core/service/authorized.interceptor.ts b/ui/src/app/core/service/authorized.interceptor.ts deleted file mode 100644 index b09810778..000000000 --- a/ui/src/app/core/service/authorized.interceptor.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpErrorResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Store } from '@ngrx/store'; - -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import * as fromUser from '../reducer/user.reducer'; -import { UserRedirect } from '../action/user.action'; - -@Injectable() -export class AuthorizedInterceptor implements HttpInterceptor { - constructor(private store: Store) { } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - return next - .handle(req) - .pipe( - catchError((error) => { - if (!error.url.match(req.url)) { - this.store.dispatch(new UserRedirect(error.url)); - } - return throwError(error); - }) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/cache.interceptor.ts b/ui/src/app/core/service/cache.interceptor.ts deleted file mode 100644 index a1d38aec0..000000000 --- a/ui/src/app/core/service/cache.interceptor.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Observable, of } from 'rxjs'; -import { tap } from 'rxjs/operators'; - -class HttpCache { - private store: {[key: string]: HttpResponse}; - constructor() { - this.store = {}; - } - private generateKey(request: HttpRequest): string { - return `${request.method}.${request.urlWithParams}.${request.responseType}`; - } - get(req: HttpRequest): HttpResponse | null { - return this.store[this.generateKey(req)]; - } - put(req: HttpRequest, resp: HttpResponse): void { - this.store[`${req.method}.${req.urlWithParams}`] = resp; - } - clear(): void { - this.store = {}; - } -} - -@Injectable() -export class CachingInterceptor implements HttpInterceptor { - private cache: HttpCache; - - constructor() { - this.cache = new HttpCache(); - } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - if (req.method !== 'GET') { - this.cache.clear(); - return next.handle(req); - } - const cachedResponse = this.cache.get(req); - if (cachedResponse) { - return of(cachedResponse); - } - return next.handle(req).pipe( - tap(event => { - if (event instanceof HttpResponse) { - this.cache.put(req, event); - } - }) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/can-deactivate.guard.spec.ts b/ui/src/app/core/service/can-deactivate.guard.spec.ts deleted file mode 100644 index a9ede461f..000000000 --- a/ui/src/app/core/service/can-deactivate.guard.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { CanDeactivateGuard, CanComponentDeactivate } from './can-deactivate.guard'; -import { ActivatedRouteStub } from '../../../testing/activated-route.stub'; - -describe('Can Deactivate Guard Service', () => { - let service: CanDeactivateGuard; - let guarded: CanComponentDeactivate; - let notGuarded: any; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - let child: ActivatedRouteStub = new ActivatedRouteStub(); - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - CanDeactivateGuard - ] - }); - service = TestBed.get(CanDeactivateGuard); - - guarded = { - canDeactivate: (currentRoute, currentState, nextState) => { - return true; - } - }; - notGuarded = {}; - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('canDeactivate', () => { - it('should check if the component has a canDeactivate method', () => { - spyOn(guarded, 'canDeactivate'); - expect(service.canDeactivate(notGuarded, null, null, null)).toBe(true); - service.canDeactivate(guarded, null, null, null); - expect(guarded.canDeactivate).toHaveBeenCalled(); - }); - - it('should return components result', () => { - spyOn(guarded, 'canDeactivate').and.returnValue(false); - expect(service.canDeactivate(guarded, null, null, null)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/core/service/can-deactivate.guard.ts b/ui/src/app/core/service/can-deactivate.guard.ts deleted file mode 100644 index c0c7363ec..000000000 --- a/ui/src/app/core/service/can-deactivate.guard.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { - CanDeactivate, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Observable } from 'rxjs'; - -export interface CanComponentDeactivate { - canDeactivate: ( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ) => Observable | Promise | boolean; -} - -@Injectable() -export class CanDeactivateGuard implements CanDeactivate { - canDeactivate( - component: CanComponentDeactivate, - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ) { - return component && component.canDeactivate ? component.canDeactivate(currentRoute, currentState, nextState) : true; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/differential.service.ts b/ui/src/app/core/service/differential.service.ts deleted file mode 100644 index f4ecdf0c1..000000000 --- a/ui/src/app/core/service/differential.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; - -import * as lib from 'deep-object-diff'; - -@Injectable() -export class DifferentialService { - - constructor() {} - - diff(originalObj, updatedObj) { // returns the difference of the original and updated objects - return lib.diff(originalObj, updatedObj); - } - addedDiff(originalObj, updatedObj) { // returns only the values added to the updated object - return lib.addedDiff(originalObj, updatedObj); - } - deletedDiff(originalObj, updatedObj) { // returns only the values deleted in the updated object - return lib.deletedDiff(originalObj, updatedObj); - } - updatedDiff(originalObj, updatedObj) { // returns only the values that have been changed in the updated object - return lib.updatedDiff(originalObj, updatedObj); - } - detailedDiff(originalObj, updatedObj) { // returns an object with the added, deleted and updated differences - return lib.detailedDiff(originalObj, updatedObj); - } -} diff --git a/ui/src/app/core/service/error.interceptor.ts b/ui/src/app/core/service/error.interceptor.ts deleted file mode 100644 index 139d795d9..000000000 --- a/ui/src/app/core/service/error.interceptor.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse, HttpErrorResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; -import { Store } from '@ngrx/store'; - -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import * as fromNotifications from '../../notification/reducer'; -import { AddNotification } from '../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../notification/model/notification'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - private caches = []; - constructor(private store: Store) { } - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - return next.handle(req).pipe( - catchError((error: HttpErrorResponse) => { - let msg = error.error; - if (typeof msg !== 'string' && msg.hasOwnProperty('message')) { - msg = `${msg.exception}: ${msg.message}`; - } else if (typeof msg === 'string') { - msg = this.getErrorMessage(error); - } - if (msg) { - this.store.dispatch(new AddNotification(new Notification( - NotificationType.Danger, - msg, - 8000 - ))); - } - return throwError(error); - }) - ); - } - - getErrorMessage(error: HttpErrorResponse): string { - switch (error.status) { - case 409: { - return null; - } - default: { - return 'Unknown server error!'; - } - } - } -} diff --git a/ui/src/app/core/service/file.service.spec.ts b/ui/src/app/core/service/file.service.spec.ts deleted file mode 100644 index 81eefdbc3..000000000 --- a/ui/src/app/core/service/file.service.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { FileService } from './file.service'; - -const getFakeFile = (str: string) => { - let blob = new Blob([str], { type: 'text/html' }); - blob['lastModifiedDate'] = ''; - blob['name'] = str; - return blob; -}; - -describe('File Service', () => { - let service: FileService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - FileService - ] - }); - service = TestBed.get(FileService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('readAsText method', () => { - it('should return an observable', () => { - expect(service.readAsText(getFakeFile('foo'))).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/core/service/file.service.ts b/ui/src/app/core/service/file.service.ts deleted file mode 100644 index 5be9a739f..000000000 --- a/ui/src/app/core/service/file.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; - -@Injectable() -export class FileService { - - getLoader(sub: Subject): any { - return (evt) => { - const reader = evt.target as FileReader; - const txt = reader.result; - sub.next(txt); - sub.complete(); - }; - } - readAsText(file: File): Observable { - let sub = new Subject(), - fileReader = new FileReader(); - fileReader.onload = this.getLoader(sub); - fileReader.readAsText(file); - return sub.asObservable(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/modal.service.spec.ts b/ui/src/app/core/service/modal.service.spec.ts deleted file mode 100644 index 408f54df7..000000000 --- a/ui/src/app/core/service/modal.service.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { NgbModalModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { ModalService } from './modal.service'; - -describe('Modal Service', () => { - let service: ModalService; - let ngbModal: NgbModal; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NgbModalModule - ], - providers: [ - ModalService - ] - }); - service = TestBed.get(ModalService); - ngbModal = TestBed.get(NgbModal); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('modal.open method', () => { - it('should open a new modal', () => { - spyOn(ngbModal, 'open').and.callThrough(); - service.open(`
`, {}); - expect(ngbModal.open).toHaveBeenCalled(); - }); - - it('should not add inputs to a modals scope if not provided a component', () => { - spyOn(ngbModal, 'open').and.callThrough(); - service.open(`
`, {}, { foo: 'bar' }); - expect(ngbModal.open).toHaveBeenCalled(); - }); - - it('should accept inputs to add to a new modals scope', () => { - spyOn(ngbModal, 'open').and.callFake(() => { - return { - result: Promise.resolve({}), - componentInstance: {} - } as NgbModalRef; - }); - service.open(`
`, {}, { foo: 'bar' }); - expect(ngbModal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/core/service/modal.service.ts b/ui/src/app/core/service/modal.service.ts deleted file mode 100644 index 7bac61417..000000000 --- a/ui/src/app/core/service/modal.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { NgbModal, NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; -import { from } from 'rxjs'; - -export const DEFAULT_MODAL_OPTIONS: NgbModalOptions = { - size: 'lg' -}; - -@Injectable() -export class ModalService { - - constructor( - private modal: NgbModal - ) {} - - open(content: any, options: NgbModalOptions, inputs: Object = {}): Observable { - let modal = this.modal.open(content, { - ...options - }); - if (modal.hasOwnProperty('componentInstance')) { - Object.keys(inputs).forEach(key => modal.componentInstance[key] = inputs[key]); - } - return from(modal.result); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/core/service/navigation.service.spec.ts b/ui/src/app/core/service/navigation.service.spec.ts deleted file mode 100644 index bb92403c6..000000000 --- a/ui/src/app/core/service/navigation.service.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; - -import { NavigationService } from './navigation.service'; - -describe('Navigation Service', () => { - let service: NavigationService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - NavigationService - ] - }); - service = TestBed.get(NavigationService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('addAction method', () => { - it('should add a navigation option to the list of actions', () => { - service.addAction('foo', { - action: () => {}, - category: 'bar', - label: 'baz', - content: 'something' - }); - - expect(service.actionList.length).toBe(1); - }); - - it('should emit the value from an observable when an action is added', (done: DoneFn) => { - const action = { - action: () => { }, - category: 'bar', - label: 'baz', - content: 'something' - }; - const actionName = 'foo'; - service.addAction(actionName, action); - - service.emitter.subscribe((actions) => { - expect(actions.length).toBe(1); - done(); - }); - }); - }); -}); diff --git a/ui/src/app/core/service/navigation.service.ts b/ui/src/app/core/service/navigation.service.ts deleted file mode 100644 index dc7b01342..000000000 --- a/ui/src/app/core/service/navigation.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { NavigationAction } from '../model/action'; - -@Injectable() -export class NavigationService { - - private actions: { [name: string]: NavigationAction} = {}; - private subj: BehaviorSubject; - private obs: Observable; - - constructor() { - this.subj = new BehaviorSubject(this.actionList); - this.obs = this.subj.asObservable(); - } - - get actionList(): NavigationAction[] { - return Object.values(this.actions); - } - - get emitter(): Observable { - return this.obs; - } - - addAction(name: string, action: NavigationAction): NavigationAction[] { - this.actions[name] = action; - this.subj.next(this.actionList); - return this.actionList; - } -} diff --git a/ui/src/app/core/service/navigator.service.ts b/ui/src/app/core/service/navigator.service.ts deleted file mode 100644 index c865c9a54..000000000 --- a/ui/src/app/core/service/navigator.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class NavigatorService { - constructor() {} - - get native(): Navigator { - return window.navigator; - } -} diff --git a/ui/src/app/core/service/user.service.spec.ts b/ui/src/app/core/service/user.service.spec.ts deleted file mode 100644 index 61780bcfd..000000000 --- a/ui/src/app/core/service/user.service.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { UserService } from './user.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; - -describe('User Service', () => { - let service: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - UserService - ] - }); - service = TestBed.get(UserService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/ui/src/app/core/service/user.service.ts b/ui/src/app/core/service/user.service.ts deleted file mode 100644 index d5ee80b53..000000000 --- a/ui/src/app/core/service/user.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { User } from '../model/user'; -import { HttpClient } from '@angular/common/http'; -import { API_BASE_PATH } from '../../app.constant'; - -@Injectable() -export class UserService { - - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - - getRoles(): Observable { - return this.http.get( - `${this.base}/supportedRoles` - ); - } - - getCurrentUser(): Observable { - return this.http.get( - `${this.base}/admin/users/current` - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/dashboard/container/dashboard.component.html b/ui/src/app/dashboard/container/dashboard.component.html deleted file mode 100644 index 56830de2e..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.html +++ /dev/null @@ -1,37 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/dashboard/container/dashboard.component.scss b/ui/src/app/dashboard/container/dashboard.component.scss deleted file mode 100644 index 5bfb3774a..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../theme/palette'; - -:host { - .lead { - line-height: 36px; - } - - .nav-tabs, .nav-link.active { - border-color: $brand-primary; - } - - .nav-link:hover { - border-bottom-color: $brand-primary; - } -} \ No newline at end of file diff --git a/ui/src/app/dashboard/container/dashboard.component.ts b/ui/src/app/dashboard/container/dashboard.component.ts deleted file mode 100644 index 35883eaec..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../../app.reducer'; -import * as fromAdmin from '../../admin/reducer'; -import * as fromCore from '../../core/reducer'; -import { Observable } from 'rxjs'; -import { LoadRoleRequest } from '../../core/action/configuration.action'; -import { map } from 'rxjs/operators'; -import { LoadAdminRequest } from '../../admin/action/admin-collection.action'; -import { LoadMetadataRequest } from '../../admin/action/metadata-collection.action'; - -@Component({ - selector: 'dashboard-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'] -}) -export class DashboardPageComponent { - - actionsRequired$: Observable; - hasActions$: Observable; - isAdmin$: Observable; - - constructor( - private store: Store - ) { - this.actionsRequired$ = this.store.select(fromAdmin.getTotalActionsRequired); - this.hasActions$ = this.actionsRequired$.pipe(map(a => a > 0)); - this.isAdmin$ = this.store.select(fromCore.isCurrentUserAdmin); - - this.store.dispatch(new LoadRoleRequest()); - this.store.dispatch(new LoadAdminRequest()); - this.store.dispatch(new LoadMetadataRequest()); - } -} diff --git a/ui/src/app/dashboard/dashboard.module.ts b/ui/src/app/dashboard/dashboard.module.ts deleted file mode 100644 index bca0f80f1..000000000 --- a/ui/src/app/dashboard/dashboard.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { I18nModule } from '../i18n/i18n.module'; -import { CustomWidgetRegistry } from '../schema-form/registry'; -import { WidgetRegistry } from 'ngx-schema-form'; -import { DashboardPageComponent } from './container/dashboard.component'; -import { DashboardRoutingModule } from './dashboard.routing'; -import { MetadataModule } from '../metadata/metadata.module'; -import { AdminModule } from '../admin/admin.module'; - - -@NgModule({ - imports: [ - CommonModule, - DashboardRoutingModule, - MetadataModule, - AdminModule, - I18nModule, - CommonModule - ], - providers: [ - { provide: WidgetRegistry, useClass: CustomWidgetRegistry } - ], - declarations: [ - DashboardPageComponent - ] -}) -export class DashboardModule { } diff --git a/ui/src/app/dashboard/dashboard.routing.ts b/ui/src/app/dashboard/dashboard.routing.ts deleted file mode 100644 index 1563c73c5..000000000 --- a/ui/src/app/dashboard/dashboard.routing.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { DashboardPageComponent } from './container/dashboard.component'; -import { ManagerComponent } from '../metadata/manager/container/manager.component'; -import { MetadataPageComponent } from '../metadata/metadata.component'; -import { DashboardResolversListComponent } from '../metadata/manager/container/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from '../metadata/manager/container/dashboard-providers-list.component'; -import { ActionRequiredPageComponent } from '../admin/container/action-required.component'; -import { AdminComponent } from '../admin/admin.component'; -import { AdminManagementPageComponent } from '../admin/container/admin-management.component'; -import { AdminGuard } from '../core/service/admin.guard'; - -const routes: Routes = [ - { - path: '', - component: DashboardPageComponent, - children: [ - { path: '', redirectTo: 'metadata', pathMatch: 'prefix' }, - { - path: 'metadata', - component: MetadataPageComponent, - children: [ - { path: '', redirectTo: 'manager', pathMatch: 'prefix' }, - { - path: 'manager', - component: ManagerComponent, - children: [ - { path: '', redirectTo: 'resolvers', pathMatch: 'prefix' }, - { - path: 'resolvers', - component: DashboardResolversListComponent, - data: { title: 'Metadata Source Dashboard' } - }, - { - path: 'providers', - component: DashboardProvidersListComponent, - canActivate: [AdminGuard], - data: { title: 'Metadata Provider Dashboard' } - }, - ] - } - ] - }, - { - path: 'admin', - canActivate: [AdminGuard], - children: [ - { - path: '', - component: AdminComponent, - children: [ - { - path: 'management', - component: AdminManagementPageComponent, - data: { title: 'User Administration Dashboard' } - }, - { - path: 'actions', - component: ActionRequiredPageComponent, - data: { title: 'Administrator Actions Required Dashboard' } - } - ] - } - ] - } - ], - }, -]; - -@NgModule({ - imports: [ - RouterModule.forChild(routes), - ], - exports: [RouterModule] -}) -export class DashboardRoutingModule { } diff --git a/ui/src/app/i18n/action/message.action.ts b/ui/src/app/i18n/action/message.action.ts deleted file mode 100644 index 4949f7357..000000000 --- a/ui/src/app/i18n/action/message.action.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum MessagesActionTypes { - MESSAGES_LOAD_REQUEST = '[Messages] Load REQUEST', - MESSAGES_LOAD_SUCCESS = '[Messages] Load SUCCESS', - MESSAGES_LOAD_ERROR = '[Messages] Load ERROR', - - SET_LOCALE = '[Messages] Set Locale' -} - -export class MessagesLoadRequestAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_REQUEST; - - constructor() { } -} - -export class MessagesLoadSuccessAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_SUCCESS; - - constructor(public payload: any) { } -} - -export class MessagesLoadErrorAction implements Action { - readonly type = MessagesActionTypes.MESSAGES_LOAD_ERROR; - - constructor(public payload: { message: string }) { } -} - -export class SetLocale implements Action { - readonly type = MessagesActionTypes.SET_LOCALE; - - constructor(public payload: string) {} -} - -export type Actions = - | MessagesLoadRequestAction - | MessagesLoadSuccessAction - | MessagesLoadErrorAction - | SetLocale; diff --git a/ui/src/app/i18n/component/i18n-text.component.html b/ui/src/app/i18n/component/i18n-text.component.html deleted file mode 100644 index 8f888138f..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.html +++ /dev/null @@ -1,69 +0,0 @@ - - {{ key }} - User Interface / MDUI Information - SP SSO Descriptor Information - Logout Endpoints - Security Information - Assertion Consumer Service - Relying Party Overrides - Attribute Release - SP/Organization Information - Organization Information - Finished! - - Signing - Encryption - Both - - SP SSO Descriptor Information - Organization Information - User Interface / MDUI Information - Security Descriptor Information - - Entity ID - Service Provider Name - Organization - Contacts - MDUI Information - Security Information - Assertion Consumer Services - Service Provider Sso Descriptor - Logout Endpoints - Service Enabled - Relying Party Overrides - Attribute Release - Filter Name - Filter Enabled - FilterTarget - Name - Type - Value - Email Address - URL - Binding Type - Display Name - Information URL - Privacy Statement URL - Logo URL - Logo Height - Logo Width - Description - Sign Assertions - Don't Sign Response - Turn off encryption - Use Sha - Ignore Authentication Method - Omit Not Before - Responder ID - Name ID Formats - Authentication Methods - x509 Certificate Available - Authentication Requests Signed - Want Assertions Signed - x509 Certificates - Protocol Support Enumeration - Name ID Formats - Binding - Location URL - Make Default - diff --git a/ui/src/app/i18n/component/i18n-text.component.spec.ts b/ui/src/app/i18n/component/i18n-text.component.spec.ts deleted file mode 100644 index ae84d3e17..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { I18nTextComponent } from './i18n-text.component'; -import { MockI18nService } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - Word - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Component: I18n text translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - const msg = { - 'metadata-ui': 'User Interface / MDUI Information', - bar: 'bar', - baz: 'baz' - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - I18nTextComponent, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - instance.foo = 'metadata-ui'; - spyOn(service, 'translate').and.returnValue('foo'); - store.dispatch(new MessagesLoadSuccessAction(msg)); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain(msg['metadata-ui']); - }); - }); -}); diff --git a/ui/src/app/i18n/component/i18n-text.component.ts b/ui/src/app/i18n/component/i18n-text.component.ts deleted file mode 100644 index b75f1c9eb..000000000 --- a/ui/src/app/i18n/component/i18n-text.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'i18n-text', - templateUrl: './i18n-text.component.html' -}) -export class I18nTextComponent { - @Input() key: string; - - constructor() { } -} diff --git a/ui/src/app/i18n/component/translate.component.spec.ts b/ui/src/app/i18n/component/translate.component.spec.ts deleted file mode 100644 index e28e232ac..000000000 --- a/ui/src/app/i18n/component/translate.component.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { TranslateComponent } from './translate.component'; -import { MockI18nService, MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - Word - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Component: I18n translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - const msg = { - foo: 'foo', - bar: 'bar', - baz: 'baz' - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - TranslateComponent, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - spyOn(service, 'translate').and.returnValue('foo'); - store.dispatch(new MessagesLoadSuccessAction(msg)); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain(msg.foo); - }); - }); -}); diff --git a/ui/src/app/i18n/component/translate.component.ts b/ui/src/app/i18n/component/translate.component.ts deleted file mode 100644 index 88343d51f..000000000 --- a/ui/src/app/i18n/component/translate.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - Component, - Input, - OnDestroy -} from '@angular/core'; -import { Subscription } from 'rxjs'; -import { I18nService } from '../service/i18n.service'; -import * as fromI18n from '../reducer'; -import { Store } from '@ngrx/store'; -import { Messages } from '../model/Messages'; - -/*tslint:disable:component-selector */ - -@Component({ - selector: 'translate-i18n', - template: ` - - - {{ translated }} - - ` -}) -export class TranslateComponent implements OnDestroy { - private _key: string; - lastParams: any; - currentParams: any; - messages: Messages = {}; - sub: Subscription; - default: string; - translated: string; - - @Input() set key(key: string) { - if (key) { - this.default = this.default || this._key; - this._key = key; - this.update(); - } - } - - @Input() set params(params: any) { - this.currentParams = params || {}; - this.update(); - } - - constructor( - private service: I18nService, - private store: Store - ) { - this.sub = this.store.select(fromI18n.getMessages).subscribe(m => { - if (m && Object.keys(m).length) { - this.messages = m; - this.update(); - } - }); - } - - update(): void { - this.translated = this.service.translate(this._key, this.currentParams, this.messages); - } - - ngOnDestroy() { - if (this.sub) { - this.sub.unsubscribe(); - } - } -} diff --git a/ui/src/app/i18n/effect/message.effect.spec.ts b/ui/src/app/i18n/effect/message.effect.spec.ts deleted file mode 100644 index 5f03b662c..000000000 --- a/ui/src/app/i18n/effect/message.effect.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { ReplaySubject } from 'rxjs'; - -import { MessageEffects } from './message.effect'; - -import { Subject, of, throwError } from 'rxjs'; -import { MessagesLoadRequestAction, MessagesLoadSuccessAction, MessagesLoadErrorAction } from '../action/message.action'; -import { I18nService } from '../service/i18n.service'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import * as fromI18n from '../reducer'; - -describe('I18n Message Effects', () => { - let effects: MessageEffects; - let actions: Subject; - let i18nService: I18nService; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ - i18n: combineReducers(fromI18n.reducers, { - messages: { - fetching: false, - messages: null, - error: null, - locale: 'en-US' - } - }) - }), - ], - providers: [ - { - provide: I18nService, - useValue: { - get: (locale: string) => of({}) - } - }, - MessageEffects, - provideMockActions(() => actions), - ], - }); - - effects = TestBed.get(MessageEffects); - i18nService = TestBed.get(I18nService); - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - }); - - it('should fire a success action', () => { - let msgs = {}; - spyOn(i18nService, 'get').and.returnValue(of(msgs)); - spyOn(store, 'select').and.returnValue(of('en_US')); - actions = new ReplaySubject(1); - - actions.next(new MessagesLoadRequestAction()); - - effects.loadMessages$.subscribe(result => { - expect(result).toEqual(new MessagesLoadSuccessAction(msgs)); - }); - }); - - it('should fire an error action', () => { - let err = new Error('404'); - spyOn(i18nService, 'get').and.returnValue(throwError(err)); - spyOn(store, 'select').and.returnValue(of('en_US')); - actions = new ReplaySubject(1); - - actions.next(new MessagesLoadRequestAction()); - - effects.loadMessages$.subscribe(result => { - expect(result).toEqual(new MessagesLoadErrorAction(err)); - }); - }); -}); diff --git a/ui/src/app/i18n/effect/message.effect.ts b/ui/src/app/i18n/effect/message.effect.ts deleted file mode 100644 index af34c50b6..000000000 --- a/ui/src/app/i18n/effect/message.effect.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { of } from 'rxjs'; -import { map, catchError, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { - MessagesActionTypes, - MessagesLoadErrorAction, - MessagesLoadRequestAction, - MessagesLoadSuccessAction, - SetLocale -} from '../action/message.action'; -import { I18nService } from '../service/i18n.service'; -import * as fromCore from '../reducer'; -import { Store } from '@ngrx/store'; - -// The tests for this succeed but a Jasmine error is thrown in afterAll -// TODO: Research afterAll error in Jasmine - /* istanbul ignore next */ -@Injectable() -export class MessageEffects { - - @Effect() - loadMessages$ = this.actions$.pipe( - ofType(MessagesActionTypes.MESSAGES_LOAD_REQUEST), - withLatestFrom( - this.store.select(fromCore.getLocale) - ), - map(([action, locale]) => locale.replace('-', '_')), - switchMap(locale => { - return this.i18nService.get(locale) - .pipe( - map(u => new MessagesLoadSuccessAction({ ...u })), - catchError(error => of(new MessagesLoadErrorAction(error))) - ); - }) - ); - @Effect() - setLanguage$ = this.actions$.pipe( - ofType(MessagesActionTypes.SET_LOCALE), - map(action => action.payload), - map(language => new MessagesLoadRequestAction()) - ); - - constructor( - private i18nService: I18nService, - private actions$: Actions, - private store: Store - ) { } -} diff --git a/ui/src/app/i18n/i18n.module.spec.ts b/ui/src/app/i18n/i18n.module.spec.ts deleted file mode 100644 index 5306929cb..000000000 --- a/ui/src/app/i18n/i18n.module.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { I18nModule } from './i18n.module'; -import { I18nService } from './service/i18n.service'; -import { HttpClientModule } from '@angular/common/http'; -import { CoreModule } from '../core/core.module'; - -describe('I18n Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - I18nModule.forRoot(), - HttpClientModule, - CoreModule.forRoot() - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(I18nService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/i18n/i18n.module.ts b/ui/src/app/i18n/i18n.module.ts deleted file mode 100644 index 56fa2895b..000000000 --- a/ui/src/app/i18n/i18n.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { reducers } from './reducer'; -import { HttpClientModule } from '@angular/common/http'; -import { I18nService } from './service/i18n.service'; -import { MessageEffects } from './effect/message.effect'; -import { TranslatePipe } from './pipe/i18n.pipe'; -import { CoreModule } from '../core/core.module'; -import { TranslateComponent } from './component/translate.component'; -import { I18nTextComponent } from './component/i18n-text.component'; - -export const COMPONENTS = [ - TranslateComponent, - I18nTextComponent -]; -export const DIRECTIVES = []; -export const PIPES = [ - TranslatePipe -]; - -@NgModule({ - imports: [ - CommonModule, - HttpClientModule, - CoreModule - ], - declarations: [ - ...PIPES, - ...COMPONENTS, - ...DIRECTIVES - ], - exports: [ - ...PIPES, - ...COMPONENTS, - ...DIRECTIVES - ], -}) -export class I18nModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootI18nModule, - providers: [ - I18nService - ] - }; -} -} - -@NgModule({ - imports: [ - StoreModule.forFeature('i18n', reducers), - EffectsModule.forFeature([MessageEffects]), - ], -}) -export class RootI18nModule { } diff --git a/ui/src/app/i18n/model/Messages.ts b/ui/src/app/i18n/model/Messages.ts deleted file mode 100644 index e561dccbd..000000000 --- a/ui/src/app/i18n/model/Messages.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Messages { - [key: string]: string; -} diff --git a/ui/src/app/i18n/pipe/i18n.pipe.spec.ts b/ui/src/app/i18n/pipe/i18n.pipe.spec.ts deleted file mode 100644 index b1fbc9cb9..000000000 --- a/ui/src/app/i18n/pipe/i18n.pipe.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { TranslatePipe } from './i18n.pipe'; -import { I18nService } from '../service/i18n.service'; -import { CommonModule } from '@angular/common'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; - -import * as fromI18n from '../reducer'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { MessagesLoadSuccessAction } from '../action/message.action'; -import { MockI18nService, MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - {{ foo | translate }} - ` -}) -class TestHostComponent { - private _foo: string; - - public get foo(): string { - return this._foo; - } - - public set foo(val: string) { - this._foo = val; - } -} - -describe('Pipe: I18n translation', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let store: Store; - let service: I18nService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: I18nService, useClass: MockI18nService } - ], - imports: [ - CommonModule, - StoreModule.forRoot({ - 'i18n': combineReducers(fromI18n.reducers), - }) - ], - declarations: [ - TranslatePipe, - TestHostComponent - ], - }); - store = TestBed.get(Store); - service = TestBed.get(I18nService); - - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - }); - - it('should set the correct text', () => { - spyOn(service, 'translate').and.returnValue('hi there'); - store.dispatch(new MessagesLoadSuccessAction({ foo: 'hi there' })); - - store.select(fromI18n.getMessages).subscribe(() => { - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toContain('hi there'); - }); - }); -}); diff --git a/ui/src/app/i18n/pipe/i18n.pipe.ts b/ui/src/app/i18n/pipe/i18n.pipe.ts deleted file mode 100644 index 374f146f1..000000000 --- a/ui/src/app/i18n/pipe/i18n.pipe.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { PipeTransform, Pipe, ChangeDetectorRef, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import * as fromI18n from '../reducer'; -import { Subscription } from 'rxjs'; -import { I18nService } from '../service/i18n.service'; - -@Pipe({ - name: 'translate', - pure: false -}) -export class TranslatePipe implements PipeTransform, OnDestroy { - - sub: Subscription; - - messages: { [propName: string]: string } = {}; - - constructor( - private store: Store, - private i18nService: I18nService, - private _ref: ChangeDetectorRef - ) { - this.sub = this.store.select(fromI18n.getMessages).subscribe(messages => { - this.messages = messages ? messages : {}; - this._ref.markForCheck(); - }); - } - - transform(value: string, interpolated: { [prop: string]: string } = {}): any { - return this.i18nService.translate(value, interpolated, this.messages); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } -} diff --git a/ui/src/app/i18n/reducer/index.ts b/ui/src/app/i18n/reducer/index.ts deleted file mode 100644 index d8474cd18..000000000 --- a/ui/src/app/i18n/reducer/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - createSelector, - createFeatureSelector -} from '@ngrx/store'; - -import * as fromMessages from './message.reducer'; -import * as fromRoot from '../../app.reducer'; -import { getCurrentLanguage } from '../../shared/util'; - -export interface I18nState { - messages: fromMessages.MessageState; -} - -export interface State extends fromRoot.State { - core: I18nState; -} - -export const reducers = { - messages: fromMessages.reducer -}; - -export const getCoreFeature = createFeatureSelector('i18n'); -export const getMessageStateFn = (state: I18nState) => state.messages; - -export const getMessageState = createSelector(getCoreFeature, getMessageStateFn); -export const getLocale = createSelector(getMessageState, fromMessages.getLocale); -export const getLanguage = createSelector(getLocale, locale => getCurrentLanguage(locale)); - -export const getMessages = createSelector(getMessageState, fromMessages.getMessages); -export const getFetchingMessages = createSelector(getMessageState, fromMessages.isFetching); diff --git a/ui/src/app/i18n/reducer/message.reducer.ts b/ui/src/app/i18n/reducer/message.reducer.ts deleted file mode 100644 index d4debe3a1..000000000 --- a/ui/src/app/i18n/reducer/message.reducer.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - MessagesActionTypes, - Actions, - -} from '../action/message.action'; - -export interface MessageState { - fetching: boolean; - messages: any; - error: any; - locale: string; -} - -export const initialState: MessageState = { - fetching: false, - messages: {}, - error: null, - locale: null -}; - -export function reducer(state = initialState, action: Actions): MessageState { - switch (action.type) { - case MessagesActionTypes.MESSAGES_LOAD_REQUEST: { - return { - ...state, - fetching: true - }; - } - case MessagesActionTypes.MESSAGES_LOAD_SUCCESS: { - return { - ...state, - fetching: false, - messages: action.payload - }; - } - case MessagesActionTypes.MESSAGES_LOAD_ERROR: { - return { - ...state, - fetching: false, - messages: null, - error: action.payload - }; - } - case MessagesActionTypes.SET_LOCALE: { - return { - ...state, - locale: action.payload - }; - } - default: { - return state; - } - } -} - - -export const getMessages = (state: MessageState) => state.messages; -export const getLocale = (state: MessageState) => state.locale; -export const getError = (state: MessageState) => state.error; -export const isFetching = (state: MessageState) => state.fetching; diff --git a/ui/src/app/i18n/service/i18n.service.spec.ts b/ui/src/app/i18n/service/i18n.service.spec.ts deleted file mode 100644 index e8059fe80..000000000 --- a/ui/src/app/i18n/service/i18n.service.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { I18nService } from './i18n.service'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -describe('i18n Service', () => { - let service: I18nService; - let nav: NavigatorService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - { - provide: NavigatorService, - useValue: { - native: { - language: 'en-US', - languages: ['en-US', 'zh-CN', 'ja-JP'] - } - } - }, - I18nService - ] - }); - service = TestBed.get(I18nService); - nav = TestBed.get(NavigatorService); - }); - - it('should instantiate', () => { - expect(service).toBeDefined(); - }); - - describe('get method', () => { - it(`should send an expected GET request`, waitForAsync(inject([I18nService, HttpTestingController], - (i18n: I18nService, backend: HttpTestingController) => { - const lang = 'en'; - i18n.get(lang).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.path}` - && req.method === 'GET' - && req.params.get('lang') === lang; - }, `GET attributes by term`); - } - ))); - }); - - describe('getCurrentLanguage method', () => { - it('should return the current language', () => { - expect(service.getCurrentLanguage()).toEqual('en'); - }); - }); - - describe('getCurrentLocale method', () => { - it('should return the current language', () => { - expect(service.getCurrentLocale()).toEqual('en-US'); - }); - }); - - describe('translate method', () => { - it('should translate the provided message', () => { - expect(service.translate('foo', { baz: 'baz' }, { foo: 'bar { baz }' })).toEqual('bar baz'); - }); - - it('should accept provided messages to check', () => { - expect(service.translate('foo', null, { baz: 'bar { baz }' })).toEqual('foo'); - expect(service.translate('foo', null, {})).toEqual(''); - }); - }); - - describe('interpolate method', () => { - it('should return provided value if no interpolation strings are passed', () => { - expect(service.interpolate('foo')).toEqual('foo'); - }); - }); -}); diff --git a/ui/src/app/i18n/service/i18n.service.ts b/ui/src/app/i18n/service/i18n.service.ts deleted file mode 100644 index 26f0ba4ff..000000000 --- a/ui/src/app/i18n/service/i18n.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { getCurrentLanguage, getCurrentLocale } from '../../shared/util'; -import { Messages } from '../model/Messages'; -import API_BASE_PATH from '../../app.constant'; - -@Injectable() -export class I18nService { - - readonly path = '/messages'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient, - private navigator: NavigatorService - ) {} - - get(locale: string): Observable { - let params: HttpParams = new HttpParams(); - params = params.set('lang', locale); - return this.http.get(`${ this.base }${this.path}`, { - params - }); - } - - getCurrentLanguage(): string { - return getCurrentLanguage(this.navigator.native); - } - - getCurrentLocale(): string { - return getCurrentLocale(this.navigator.native); - } - - translate(value: string, interpolated: any, messages: Messages): string { - interpolated = interpolated || {}; - let val = messages.hasOwnProperty(value) ? messages[value] : (Object.keys(messages).length ? value : ''); - return this.interpolate(val, interpolated); - } - - interpolate(value: string, interpolated: { [prop: string]: string } = {}): string { - return Object.entries(interpolated).reduce((current, interpolate) => { - let reg = new RegExp(`{\\s*${interpolate[0]}\\s*}`, 'gm'); - return current.replace(reg, interpolate[1]); - }, value); - } -} diff --git a/ui/src/app/metadata/configuration/action/compare.action.ts b/ui/src/app/metadata/configuration/action/compare.action.ts deleted file mode 100644 index da012bea7..000000000 --- a/ui/src/app/metadata/configuration/action/compare.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; - -export enum CompareActionTypes { - COMPARE_METADATA_REQUEST = '[Compare Version] Compare Version Request', - COMPARE_METADATA_SUCCESS = '[Compare Version] Compare Version Success', - COMPARE_METADATA_ERROR = '[Compare Version] Compare Version Error', - SET_VERSIONS = '[Compare Version] Set Versions', - CLEAR_VERSIONS = '[Compare Version] Clear Versions', - SET_VIEW_CHANGED = '[Compare Version] View Changed Only' -} - -export class CompareVersionRequest implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_REQUEST; - - constructor(public payload: string[]) { } -} - -export class CompareVersionSuccess implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_SUCCESS; - - constructor(public payload: Metadata[]) { } -} - -export class CompareVersionError implements Action { - readonly type = CompareActionTypes.COMPARE_METADATA_ERROR; - - constructor(public payload: any) { } -} - -export class SetMetadataVersions implements Action { - readonly type = CompareActionTypes.SET_VERSIONS; - - constructor(public payload: Metadata[]) { } -} - -export class ViewChanged implements Action { - readonly type = CompareActionTypes.SET_VIEW_CHANGED; - constructor(public payload: boolean) { } -} - -export class ClearVersions implements Action { - readonly type = CompareActionTypes.CLEAR_VERSIONS; -} - -export type CompareActionsUnion = - | CompareVersionRequest - | CompareVersionSuccess - | CompareVersionError - | SetMetadataVersions - | ClearVersions - | ViewChanged; diff --git a/ui/src/app/metadata/configuration/action/configuration.action.ts b/ui/src/app/metadata/configuration/action/configuration.action.ts deleted file mode 100644 index b1eb9c00a..000000000 --- a/ui/src/app/metadata/configuration/action/configuration.action.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { Schema } from '../model/schema'; -import { Wizard } from '../../../wizard/model'; - -export enum ConfigurationActionTypes { - LOAD_SCHEMA_REQUEST = '[Metadata Configuration] Load Schema Request', - LOAD_SCHEMA_SUCCESS = '[Metadata Configuration] Load Schema Success', - LOAD_SCHEMA_ERROR = '[Metadata Configuration] Load Schema Error', - - LOAD_XML_REQUEST = '[Metadata Configuration] Load XML Request', - LOAD_XML_SUCCESS = '[Metadata Configuration] Load XML Success', - LOAD_XML_ERROR = '[Metadata Configuration] Load XML Error', - - SET_METADATA = '[Metadata Configuration] Set Metadata Attributes', - SET_DEFINITION = '[Metadata Configuration] Set Metadata Definition', - SET_SCHEMA = '[Metadata Configuration] Set Metadata Schema', - SET_XML = '[Metadata Configuration] Set Metadata Xml', - SET_METADATA_MODEL = '[Metadata Configuration] Set Metadata Model', - - DOWNLOAD_XML = '[Metadata Configuration] Download Metadata Xml', - - CLEAR = '[Metadata Configuration] Clear' -} - -export class LoadSchemaRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadSchemaSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: Schema) { } -} - -export class LoadSchemaError implements Action { - readonly type = ConfigurationActionTypes.LOAD_SCHEMA_ERROR; - - constructor(public payload: any) { } -} - -export class LoadXmlRequest implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_REQUEST; - - constructor(public payload: { id: string, type: string }) { } -} - -export class LoadXmlSuccess implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_SUCCESS; - - constructor(public payload: string) { } -} - -export class LoadXmlError implements Action { - readonly type = ConfigurationActionTypes.LOAD_XML_ERROR; - - constructor(public payload: any) { } -} - -export class SetMetadata implements Action { - readonly type = ConfigurationActionTypes.SET_METADATA; - - constructor(public payload: { id: string, type: string, version?: string }) { } -} - -export class SetMetadataModel implements Action { - readonly type = ConfigurationActionTypes.SET_METADATA_MODEL; - - constructor(public payload: Metadata) { } -} - -export class SetConfigurationDefinition implements Action { - readonly type = ConfigurationActionTypes.SET_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class SetConfigurationSchema implements Action { - readonly type = ConfigurationActionTypes.SET_SCHEMA; - - constructor(public payload: Schema) { } -} - -export class SetXml implements Action { - readonly type = ConfigurationActionTypes.SET_XML; - - constructor(public payload: string) { } -} - -export class DownloadXml implements Action { - readonly type = ConfigurationActionTypes.DOWNLOAD_XML; -} - -export class ClearConfiguration implements Action { - readonly type = ConfigurationActionTypes.CLEAR; -} - -export type ConfigurationActionsUnion = - | LoadSchemaRequest - | LoadSchemaSuccess - | LoadSchemaError - | LoadXmlRequest - | LoadXmlSuccess - | LoadXmlError - | SetMetadata - | SetConfigurationDefinition - | SetConfigurationSchema - | SetXml - | DownloadXml - | ClearConfiguration; diff --git a/ui/src/app/metadata/configuration/action/filter.action.ts b/ui/src/app/metadata/configuration/action/filter.action.ts deleted file mode 100644 index 6567fd0e2..000000000 --- a/ui/src/app/metadata/configuration/action/filter.action.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { FormDefinition } from '../../../wizard/model/form-definition'; -import { FilterComparison } from '../model/compare'; -import { Schema } from '../model/schema'; - -export enum FilterCompareActionTypes { - LOAD_SCHEMA_REQUEST = '[Filter Compare Version] Compare Version Request', - LOAD_SCHEMA_SUCCESS = '[Filter Compare Version] Compare Version Success', - LOAD_SCHEMA_ERROR = '[Filter Compare Version] Compare Version Error', - SET_SCHEMA = '[Filter Compare Version] Set Schema', - SET_DEFINITION = '[Filter Compare Version] Set Definition', - COMPARE_FILTERS = '[Filter Compare Version] Compare Filters', - CLEAR = '[Filter Compare Version] Clear Filter Comparison' -} - -export class LoadFilterSchemaRequest implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadFilterSchemaSuccess implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: Schema) { } -} - -export class LoadFilterSchemaError implements Action { - readonly type = FilterCompareActionTypes.LOAD_SCHEMA_ERROR; - - constructor(public payload: any) { } -} - -export class SetFilterComparisonSchema implements Action { - readonly type = FilterCompareActionTypes.SET_SCHEMA; - constructor(public payload: any) { } -} - -export class SetFilterComparisonDefinition implements Action { - readonly type = FilterCompareActionTypes.SET_DEFINITION; - constructor(public payload: FormDefinition) { } -} - -export class ClearFilterComparison implements Action { - readonly type = FilterCompareActionTypes.CLEAR; -} - -export class CompareFilterVersions implements Action { - readonly type = FilterCompareActionTypes.COMPARE_FILTERS; - - constructor(public payload: FilterComparison) { } -} - -export type FilterCompareActionsUnion = - | LoadFilterSchemaRequest - | LoadFilterSchemaSuccess - | LoadFilterSchemaError - | SetFilterComparisonSchema - | SetFilterComparisonDefinition - | CompareFilterVersions - | ClearFilterComparison; diff --git a/ui/src/app/metadata/configuration/action/history.action.ts b/ui/src/app/metadata/configuration/action/history.action.ts deleted file mode 100644 index 5ee05ea65..000000000 --- a/ui/src/app/metadata/configuration/action/history.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataHistory } from '../model/history'; - -export enum HistoryActionTypes { - LOAD_HISTORY_REQUEST = '[Configuration History] Load History Request', - LOAD_HISTORY_SUCCESS = '[Configuration History] Load History Success', - LOAD_HISTORY_ERROR = '[Configuration History] Load History Error', - SET_HISTORY = '[Configuration History] Set History', - CLEAR_HISTORY = '[Configuration History] Clear History', - SELECT_VERSION = '[Configuration History] Select Version' -} - -export class LoadHistoryRequest implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_REQUEST; - - constructor(public payload: { id: string, type: string }) { } -} - -export class LoadHistorySuccess implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_SUCCESS; - - constructor(public payload: MetadataHistory) { } -} - -export class LoadHistoryError implements Action { - readonly type = HistoryActionTypes.LOAD_HISTORY_ERROR; - - constructor(public payload: any) { } -} - -export class SelectVersion implements Action { - readonly type = HistoryActionTypes.SELECT_VERSION; - constructor(public payload: string | null) { } -} - -export class SetHistory implements Action { - readonly type = HistoryActionTypes.SET_HISTORY; - - constructor(public payload: MetadataHistory) {} -} - -export class ClearHistory implements Action { - readonly type = HistoryActionTypes.CLEAR_HISTORY; -} - -export type HistoryActionsUnion = - | LoadHistoryRequest - | LoadHistorySuccess - | LoadHistoryError - | SetHistory - | ClearHistory - | SelectVersion; diff --git a/ui/src/app/metadata/configuration/action/restore.action.ts b/ui/src/app/metadata/configuration/action/restore.action.ts deleted file mode 100644 index 978e9eee4..000000000 --- a/ui/src/app/metadata/configuration/action/restore.action.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -export enum RestoreActionTypes { - RESTORE_VERSION_REQUEST = '[Restore Version] Restore Version Request', - RESTORE_VERSION_SUCCESS = '[Restore Version] Restore Version Success', - RESTORE_VERSION_ERROR = '[Restore Version] Restore Version Error', - - UPDATE_RESTORATION_REQUEST = '[Restore Version] Update Changes Request', - UPDATE_RESTORATION_SUCCESS = '[Restore Version] Update Changes Success', - - UPDATE_STATUS = '[Restore Version] Update Restore Form Status', - SET_SAVING_STATUS = '[Restore Version] Set Saving Status', - - CLEAR_VERSION = '[Restore Version] Clear Versions', - CANCEL_RESTORE = '[Restore Version] Cancel Restore' -} - -export class RestoreVersionRequest implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_REQUEST; - constructor() { } -} - -export class RestoreVersionSuccess implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_SUCCESS; - constructor(public payload: { id: string, type: string, model: Metadata }) { } -} - -export class RestoreVersionError implements Action { - readonly type = RestoreActionTypes.RESTORE_VERSION_ERROR; - constructor(public payload: any) { } -} - -export class UpdateRestorationChangesRequest implements Action { - readonly type = RestoreActionTypes.UPDATE_RESTORATION_REQUEST; - constructor(public payload: Partial) { } -} - -export class UpdateRestorationChangesSuccess implements Action { - readonly type = RestoreActionTypes.UPDATE_RESTORATION_SUCCESS; - constructor(public payload: Partial) { } -} - -export class UpdateRestoreFormStatus implements Action { - readonly type = RestoreActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class SetSavingStatus implements Action { - readonly type = RestoreActionTypes.SET_SAVING_STATUS; - - constructor(public payload: boolean) { } -} - -export class CancelRestore implements Action { - readonly type = RestoreActionTypes.CANCEL_RESTORE; - constructor() { } -} - -export type RestoreActionsUnion = - | RestoreVersionRequest - | RestoreVersionSuccess - | RestoreVersionError - | UpdateRestorationChangesRequest - | UpdateRestorationChangesSuccess - | UpdateRestoreFormStatus - | SetSavingStatus - | CancelRestore; diff --git a/ui/src/app/metadata/configuration/action/version.action.ts b/ui/src/app/metadata/configuration/action/version.action.ts deleted file mode 100644 index 0379a240b..000000000 --- a/ui/src/app/metadata/configuration/action/version.action.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -export enum VersionActionTypes { - SELECT_VERSION_SUCCESS = '[Version] Select Version Success', - SELECT_VERSION_ERROR = '[Version] Select Version Error', - SELECT_VERSION_REQUEST = '[Version] Select Version Request', - - CLEAR_VERSION = '[Version] Clear Versions' -} - -export class SelectVersionRequest implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_REQUEST; - - constructor(public payload: VersionRequest) { } -} - -export class SelectVersionSuccess implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_SUCCESS; - - constructor(public payload: Metadata) { } -} -export class SelectVersionError implements Action { - readonly type = VersionActionTypes.SELECT_VERSION_ERROR; - - constructor(public payload: any) { } -} - -export class ClearVersion implements Action { - readonly type = VersionActionTypes.CLEAR_VERSION; - - constructor() { } -} - -export type VersionActionsUnion = - | SelectVersionRequest - | SelectVersionError - | SelectVersionSuccess - | ClearVersion; diff --git a/ui/src/app/metadata/configuration/component/editor.component.html b/ui/src/app/metadata/configuration/component/editor.component.html deleted file mode 100644 index fd71771aa..000000000 --- a/ui/src/app/metadata/configuration/component/editor.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/editor.component.ts b/ui/src/app/metadata/configuration/component/editor.component.ts deleted file mode 100644 index 59f3ef375..000000000 --- a/ui/src/app/metadata/configuration/component/editor.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { Metadata } from '../../domain/domain.type'; - - -@Component({ - selector: 'metadata-editor', - templateUrl: './editor.component.html', - styleUrls: [] -}) -export class MetadataEditorComponent { - - @Input() schema: any; - @Input() bindings: any; - @Input() validators: { [key: string]: any }; - @Input() model: Metadata; - @Input() lockable: boolean; - - @Output() change: EventEmitter = new EventEmitter(); - @Output() status: EventEmitter = new EventEmitter(); - @Output() onLockChange: EventEmitter = new EventEmitter(); - - lock: FormControl = new FormControl(true); - - constructor() { - this.lock.valueChanges.subscribe(locked => this.onLockChange.emit(locked)); - } -} - diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html deleted file mode 100644 index fcacb9481..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
- {{ index + 1 }} -
- - -
- - {{ filter['@type'] }} - - Enabled - Disabled - -
-
-
-
-
- -   - Edit - - -
-
- - -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts deleted file mode 100644 index 9e5cb7630..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { MetadataFilter } from '../../domain/model'; -import { MetadataConfigurationService } from '../service/configuration.service'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { Metadata } from '../../domain/domain.type'; -import * as fromRoot from '../../../app.reducer'; - -@Component({ - selector: 'filter-configuration-list-item', - templateUrl: './filter-configuration-list-item.component.html' -}) -export class FilterConfigurationListItemComponent implements OnChanges { - @Input() filter: MetadataFilter; - @Input() index: number; - @Input() isFirst: boolean; - @Input() isLast: boolean; - @Input() editable: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - - open = false; - configuration: MetadataConfiguration; - definition: any; - - constructor( - private configService: MetadataConfigurationService, - private store: Store - ) {} - - onPreview($event: { data: any, parent: Metadata }): void { - this.store.dispatch(new PreviewEntity({ - id: $event.data, - entity: this.definition.getEntity($event.parent) - })); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.filter) { - this.definition = this.configService.getDefinition(this.filter['@type']); - this.configService.loadSchema(this.definition.schema).subscribe(schema => { - this.configuration = this.configService.getMetadataConfiguration( - this.filter, - this.definition, - schema - ); - }); - } - } -} diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html b/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html deleted file mode 100644 index 992660c33..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
    -
  • - -
  • -
-
-

No Filters

-

No filters have been added to this Metadata Provider

-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts b/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts deleted file mode 100644 index 17f377480..000000000 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { FilterListComponent } from '../../filter/component/filter-list.component'; - -@Component({ - selector: 'filter-configuration-list', - templateUrl: './filter-configuration-list.component.html' -}) -export class FilterConfigurationListComponent extends FilterListComponent { - @Input() editable = true; -} diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.html b/ui/src/app/metadata/configuration/component/filter-version-list.component.html deleted file mode 100644 index 60398635b..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.html +++ /dev/null @@ -1,51 +0,0 @@ - -
- Order - Option - - {{ date | date:DATE_FORMAT }} - -
-
- -
-
- {{ i + 1 }} -
-
-
-
-
-
-

{{ filter.name }}

-

{{ filter['@type'] }}

-
- -
-
- -
-
-
-
-

No Filters

-

No filters have been added to this Metadata Provider

-
-
- -
-
diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts b/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts deleted file mode 100644 index c13607cef..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { FilterVersionListComponent } from './filter-version-list.component'; -import { FilterComparison } from '../model/compare'; -import { FilterConfiguration } from '../model/metadata-configuration'; - -export const TestData: FilterConfiguration = { - dates: ['2019-09-23T20:54:31.081Z', '2019-10-23T20:54:31.081Z'], - filters: [ - [ - { - resourceId: 'foo', - name: 'Test 1', - type: 'EntityAttributesFilter', - comparable: false - }, - { - resourceId: 'bar', - name: 'Test 2', - type: 'EntityAttributesFilter', - comparable: false - } - ] - ] -}; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(FilterVersionListComponent, {static: true}) - public componentUnderTest: FilterVersionListComponent; - - filters = TestData; - - compare(versions: FilterComparison): void { } -} - -describe('Filter Version List Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let list: FilterVersionListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - MockI18nModule, - RouterTestingModule - ], - declarations: [ - FilterVersionListComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - list = instance.componentUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(list).toBeDefined(); - }); - - describe('compareSelected', () => { - it('should emit an event with the selected filter data', () => { - spyOn(instance, 'compare'); - list.selected = 'foo'; - fixture.detectChanges(); - list.compareSelected(); - fixture.detectChanges(); - expect(instance.compare).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/filter-version-list.component.ts b/ui/src/app/metadata/configuration/component/filter-version-list.component.ts deleted file mode 100644 index 2d2865d00..000000000 --- a/ui/src/app/metadata/configuration/component/filter-version-list.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { FilterConfiguration, MetadataConfiguration } from '../model/metadata-configuration'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; -import { Observable } from 'rxjs'; -import { FilterComparison } from '../model/compare'; - -@Component({ - selector: 'filter-version-list', - templateUrl: './filter-version-list.component.html' -}) -export class FilterVersionListComponent { - - @Input() filters: FilterConfiguration; - @Output() compare: EventEmitter = new EventEmitter(); - - selected: string; - comparing: string; - selectedFilters$: Observable; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} - - compareSelected() { - const reduced = this.filters.filters.reduce((acc, l) => acc.concat(l), []); - const filtered = reduced.filter(f => f && f.resourceId === this.selected); - const type = filtered[0]['@type']; - - this.compare.emit({ - modelId: this.selected, - modelType: type, - models: filtered - }); - } - - get width(): string { - const columns = this.filters.dates.length; - return `${Math.floor(100 / (columns + 1))}`; - } -} diff --git a/ui/src/app/metadata/configuration/component/history-list.component.html b/ui/src/app/metadata/configuration/component/history-list.component.html deleted file mode 100644 index 590bf72a4..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - -
Metadata Version History
- Select Version - Save DateChanged ByActions
-
- - -
-
- - {{ version.date | date:DATE_FORMAT }} (Current) - - - {{ version.date | date:DATE_FORMAT }} - - {{ version.creator }} - -
- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/history-list.component.spec.ts b/ui/src/app/metadata/configuration/component/history-list.component.spec.ts deleted file mode 100644 index 257262963..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { HistoryListComponent } from './history-list.component'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { RouterTestingModule } from '@angular/router/testing'; - -export const TestData = { - versions: [ - { - id: 'foo', - date: new Date().toDateString(), - creator: 'admin' - } - ] -}; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(HistoryListComponent, {static: true}) - public componentUnderTest: HistoryListComponent; - - history: MetadataHistory = TestData; - - compare(versions: MetadataVersion[]): void {} - restore(version: MetadataVersion): void {} -} - -describe('Metadata History List Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let list: HistoryListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - MockI18nModule, - RouterTestingModule - ], - declarations: [ - HistoryListComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - list = instance.componentUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(list).toBeDefined(); - }); - - describe('compare selected', () => { - it('should allow the user to toggle selected versions for comparison', () => { - list.toggleVersionSelected(TestData.versions[0]); - expect(list.selected.length).toBe(1); - }); - - it('should emit an event with the selected values when the Compare Selected button is clicked', () => { - spyOn(instance, 'compare'); - const selected = TestData.versions; - list.compareSelected(selected); - fixture.detectChanges(); - expect(instance.compare).toHaveBeenCalledWith(selected); - }); - }); - - describe('restore', () => { - it('should emit an event with the selected version when the Restore button is clicked', () => { - spyOn(instance, 'restore'); - const selected = TestData.versions[0]; - list.restoreVersion(selected); - fixture.detectChanges(); - expect(instance.restore).toHaveBeenCalledWith(selected); - }); - }); - - describe('toggleVersionSelected method', () => { - it('should add or remove the selected version', () => { - list.toggleVersionSelected(TestData.versions[0]); - fixture.detectChanges(); - list.toggleVersionSelected(TestData.versions[0]); - fixture.detectChanges(); - expect(list.selected.length).toBe(0); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/history-list.component.ts b/ui/src/app/metadata/configuration/component/history-list.component.ts deleted file mode 100644 index 68e596ab5..000000000 --- a/ui/src/app/metadata/configuration/component/history-list.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, Input, EventEmitter, ChangeDetectionStrategy, Output } from '@angular/core'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'history-list', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './history-list.component.html', - styleUrls: [] -}) -export class HistoryListComponent { - @Input() history: MetadataVersion[]; - @Output() compare: EventEmitter = new EventEmitter(); - @Output() restore: EventEmitter = new EventEmitter(); - - selected: MetadataVersion[] = []; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} - - toggleVersionSelected(version: MetadataVersion): void { - if (this.selected.indexOf(version) > -1) { - this.selected = this.selected.filter(s => s !== version); - } else { - this.selected = [...this.selected, version]; - } - } - - compareSelected(selected: MetadataVersion[]): void { - this.compare.emit(selected); - } - - restoreVersion(version: MetadataVersion): void { - this.restore.emit(version); - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.html b/ui/src/app/metadata/configuration/component/metadata-configuration.component.html deleted file mode 100644 index 1388ffe6e..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.html +++ /dev/null @@ -1,40 +0,0 @@ -
- -
-
-
-

- - 0{{ i + 1 }} - - {{ section.label | translate }} -

-
- -
-
-
- -
- Option - - Value - {{ date | date:DATE_FORMAT }} - -
- - -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss b/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss deleted file mode 100644 index 39fcf193c..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../../theme/_palette'; - -.bg-diff { - background: #FEE8E9; - position: relative; - border-color: #CCC !important; - &::before { - $size: 24px; - content: "\f06a"; - font-family: 'FontAwesome'; - text-align: center; - width: $size; - height: $size; - position: absolute; - left: -$size; - top: 0.5rem; - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts deleted file mode 100644 index bce7bff3a..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { MetadataConfigurationComponent } from './metadata-configuration.component'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { Router } from '@angular/router'; - -@Component({ - selector: 'object-property', - template: `` -}) -class ObjectPropertyComponent { - @Input() property: Property; - @Input() columns = 1; -} - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataConfigurationComponent, {static: true}) - public componentUnderTest: MetadataConfigurationComponent; - - configuration: MetadataConfiguration = { - dates: [], - sections: [] - }; -} - -describe('Metadata Configuration Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataConfigurationComponent; - let router: Router; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - MetadataConfigurationComponent, - ObjectPropertyComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - router = TestBed.get(Router); - fixture.detectChanges(); - })); - - it('should accept a configuration input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('edit method', () => { - it('should call onEdit.emit', () => { - spyOn(app.onEdit, 'emit'); - app.edit('foo'); - expect(app.onEdit.emit).toHaveBeenCalled(); - }); - }); - - describe('width getter', () => { - it('should default to 100%', () => { - expect(app.width).toBe('100%'); - }); - it('should calculate the width based on dates', () => { - instance.configuration = { - ...instance.configuration, - dates: [ - new Date().toISOString(), - new Date().toISOString() - ] - }; - fixture.detectChanges(); - expect(app.width).toBe('33%'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts b/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts deleted file mode 100644 index 41d930af9..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-configuration.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { Metadata } from '../../domain/domain.type'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'metadata-configuration', - templateUrl: './metadata-configuration.component.html', - styleUrls: ['./metadata-configuration.component.scss'] -}) -export class MetadataConfigurationComponent implements OnChanges { - @Input() configuration: MetadataConfiguration; - @Input() definition: any; - @Input() entity: Metadata; - @Input() numbered = true; - - @Output() preview: EventEmitter = new EventEmitter(); - @Output() onEdit: EventEmitter = new EventEmitter(); - - zero = false; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - ngOnChanges(): void { - if (this.configuration) { - this.zero = !this.configuration.sections.some(s => !!s.properties.length); - } - } - - get editable(): boolean { - return !!this.onEdit.observers.length; - } - - edit(id: string): void { - this.onEdit.emit(id); - } - - onPreview($event): void { - this.preview.emit($event); - } - - get width(): string { - const columns = this.configuration.dates.length; - return `${Math.floor(100 / (columns + 1)) }%`; - } -} diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.html b/ui/src/app/metadata/configuration/component/metadata-header.component.html deleted file mode 100644 index 942c04b5c..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
- Saved:  - {{ (version.modifiedDate) | date:DATE_FORMAT }} -
- By:  - {{ version.createdBy }} -
- -
- -

- Enabled - Disabled -   - Current - Not Current -

-
-
diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts b/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts deleted file mode 100644 index 0f6e9b9f5..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataVersion } from '../model/version'; -import { MetadataHeaderComponent } from './metadata-header.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataHeaderComponent, {static: true}) - public componentUnderTest: MetadataHeaderComponent; - - isEnabled = true; - - version: MetadataVersion = { - id: 'foo', - creator: 'foobar', - date: new Date().toDateString() - }; - isCurrent = false; -} - -describe('Metadata Header Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataHeaderComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockI18nModule - ], - declarations: [ - MetadataHeaderComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/metadata-header.component.ts b/ui/src/app/metadata/configuration/component/metadata-header.component.ts deleted file mode 100644 index cc0df37b1..000000000 --- a/ui/src/app/metadata/configuration/component/metadata-header.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Metadata } from '../../domain/domain.type'; - -import { CONFIG_DATE_FORMAT } from '../configuration.values'; - -@Component({ - selector: 'metadata-header', - templateUrl: './metadata-header.component.html', - styleUrls: [] -}) - -export class MetadataHeaderComponent { - @Input() isEnabled: boolean; - @Input() version: Metadata; - @Input() isCurrent: boolean; - - DATE_FORMAT = CONFIG_DATE_FORMAT; - - constructor() {} -} - diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.html b/ui/src/app/metadata/configuration/component/property/array-property.component.html deleted file mode 100644 index e84365d4c..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.html +++ /dev/null @@ -1,90 +0,0 @@ -
-
{{ property.name }}
-
-
- Changed: -
- {{ property.items.properties[prop].title }} -
- -
- {{ version[i][prop] }} -
-
- - -
-
-
-
-
- - - - - - - - -
- -
-
-
- Changed: - {{ item.label }} -
- - true - - - false - -
-
-
-
-
- -
- Changed: - {{ property.name }} - -

-

-
    -
  • - -   - - {{ item }} -
  • -
- -
    -
  • - {{ item }} -
  • -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.scss b/ui/src/app/metadata/configuration/component/property/array-property.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts deleted file mode 100644 index 3c9aa3793..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { ArrayPropertyComponent } from './array-property.component'; -import { AttributesService } from '../../../domain/service/attributes.service'; -import { MockAttributeService } from '../../../../../testing/attributes.stub'; -import { of } from 'rxjs'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ArrayPropertyComponent, {static: true}) - public componentUnderTest: ArrayPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.list, [{ - name: 'foo', - type: 'baz', - description: 'foo bar baz', - list: [] - }], SCHEMA.definitions); - - setProperty(property: Property): void { - this.property = property; - } -} - -describe('Array Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ArrayPropertyComponent; - let service: AttributesService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ArrayPropertyComponent, - TestHostComponent - ], - providers: [ - { provide: AttributesService, useClass: MockAttributeService } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - service = TestBed.get(AttributesService); - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('attributeList$ getter', () => { - it('should return an empty list when no data or dataUrl is set', () => { - expect(app.dataList).toBeUndefined(); - }); - it('should return a list of data items from the schema', () => { - const datalist = [ - { key: 'foo', label: 'foo' }, - { key: 'bar', label: 'bar' }, - { key: 'baz', label: 'baz' }, - ]; - instance.setProperty({ - ...instance.property, - widget: { - id: 'datalist', - data: datalist - } - }); - fixture.detectChanges(); - expect(app.dataList).toEqual(datalist); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/property/array-property.component.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.ts deleted file mode 100644 index 4d09d9a8f..000000000 --- a/ui/src/app/metadata/configuration/component/property/array-property.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, Input, OnChanges, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { Observable, of } from 'rxjs'; -import { AttributesService } from '../../../domain/service/attributes.service'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; -import UriValidator from '../../../../shared/validation/uri.validator'; - -@Component({ - selector: 'array-property', - templateUrl: './array-property.component.html', - styleUrls: ['./array-property.component.scss'] -}) - -export class ArrayPropertyComponent extends ConfigurationPropertyComponent implements OnChanges { - @Input() property: Property; - - @Output() preview: EventEmitter = new EventEmitter(); - - range = []; - - constructor( - private attrService: AttributesService - ) { - super(); - } - - ngOnChanges(): void { - const keys = this.property.value.reduce((val, version) => version ? version.length > val ? version.length : val : val, 0); - this.range = [...Array(keys).keys()]; - } - - isUrl(str: string): boolean { - return UriValidator.isUri(str); - } - - get dataList(): { key: string, label: string, differences?: boolean }[] { - return this.property.widget.data; - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts deleted file mode 100644 index 35e115f88..000000000 --- a/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ConfigurationPropertyComponent, {static: true}) - public componentUnderTest: ConfigurationPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.name, { - name: 'foo', - type: 'baz', - description: 'foo bar baz' - }, SCHEMA.definitions); -} - -describe('Configuration Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ConfigurationPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ConfigurationPropertyComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('getKeys method', () => { - it('should return the property`s child keys', () => { - expect(app.getKeys({ properties: { foo: 'bar', baz: 'bar' } })).toEqual(['foo', 'baz']); - }); - }); - - describe('getItemType method', () => { - it('should return the item`s type', () => { - expect(app.getItemType({items: { widget: { id: 'string' } } } as Property)).toBe('string'); - expect(app.getItemType({items: {}} as Property)).toBe('default'); - expect(app.getItemType({} as Property)).toBe('default'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts deleted file mode 100644 index 7e666bc03..000000000 --- a/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Property } from '../../../domain/model/property'; - -@Component({ - selector: 'configuration-property', - template: `{{ property | json }}` -}) - -export class ConfigurationPropertyComponent { - @Input() property: Property; - @Input() columns = 1; - - constructor() { } - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(property: Property): string { - const items = property.items; - const def = 'default'; - return items ? items.widget ? items.widget.id : def : def; - } - - get width(): string { - return `${ Math.floor(100 / (this.columns + 1)) }%`; - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html deleted file mode 100644 index f8bfbb5c8..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts deleted file mode 100644 index 4ec53ce0c..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { FilterTargetPropertyComponent } from './filter-target-property.component'; -import { ArrayPropertyComponentStub, PrimitivePropertyComponentStub } from '../../../../../testing/property-component.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(FilterTargetPropertyComponent, {static: true}) - public componentUnderTest: FilterTargetPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.formatFilterTarget, { - formatFilterTargetType: 'ENTITY_ID', - value: [ - 'foo', - 'bar', - 'baz' - ] - }, SCHEMA.definitions); -} - -describe('Filter Target Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: FilterTargetPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - FilterTargetPropertyComponent, - PrimitivePropertyComponentStub, - ArrayPropertyComponentStub, - TestHostComponent - ], - providers: [] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts deleted file mode 100644 index 8c0e89b00..000000000 --- a/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'filter-target-property', - templateUrl: './filter-target-property.component.html', - styleUrls: [] -}) -export class FilterTargetPropertyComponent extends ConfigurationPropertyComponent { - @Input() parent: Property; - - @Output() preview: EventEmitter = new EventEmitter(); - - constructor() { - super(); - } - - onPreview(data: any) { - this.preview.emit({ - parent: this.parent, - data - }); - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.html b/ui/src/app/metadata/configuration/component/property/object-property.component.html deleted file mode 100644 index cf984071c..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - -
{{ prop.name | translate }}
- -
- - -
-
-
diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts deleted file mode 100644 index f3bc215a7..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { ObjectPropertyComponent } from './object-property.component'; -import { SCHEMA } from '../../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../../domain/utility/configuration'; -import { PrimitivePropertyComponent } from './primitive-property.component'; -import { ArrayPropertyComponent } from './array-property.component'; -import { FilterTargetPropertyComponent } from './filter-target-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ObjectPropertyComponent, {static: true}) - public componentUnderTest: ObjectPropertyComponent; - - property: Property = getStepProperty(SCHEMA.properties.name, { - name: 'foo', - type: 'baz', - description: 'foo bar baz' - }, SCHEMA.definitions); -} - -describe('Object Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ObjectPropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ObjectPropertyComponent, - PrimitivePropertyComponent, - ArrayPropertyComponent, - FilterTargetPropertyComponent, - TestHostComponent - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/object-property.component.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.ts deleted file mode 100644 index 9eef4afbd..000000000 --- a/ui/src/app/metadata/configuration/component/property/object-property.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../../domain/model/property'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'object-property', - templateUrl: './object-property.component.html', - styleUrls: [] -}) - -export class ObjectPropertyComponent extends ConfigurationPropertyComponent { - @Input() property: Property; - @Output() preview: EventEmitter = new EventEmitter(); - - constructor() { - super(); - } -} - diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.html b/ui/src/app/metadata/configuration/component/property/primitive-property.component.html deleted file mode 100644 index 393052386..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-Changed: -
- {{ property.name }} - {{ v ? v : (v === false) ? v : '-' }} -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts deleted file mode 100644 index 9982137a3..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../../domain/model/property'; -import { MockI18nModule } from '../../../../../testing/i18n.stub'; -import { PrimitivePropertyComponent } from './primitive-property.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(PrimitivePropertyComponent, {static: true}) - public componentUnderTest: PrimitivePropertyComponent; - - property: Property = { - title: 'foo', - type: 'string', - name: 'foo', - value: ['bar'], - items: null, - properties: null, - widget: { - id: 'string' - } - }; -} - -describe('Primitive Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: PrimitivePropertyComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - NgbPopoverModule, - MockI18nModule, - RouterTestingModule - ], - declarations: [ - PrimitivePropertyComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should accept a property input', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts deleted file mode 100644 index e18b525af..000000000 --- a/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { ConfigurationPropertyComponent } from './configuration-property.component'; - -@Component({ - selector: 'primitive-property', - templateUrl: './primitive-property.component.html', - styleUrls: [] -}) -export class PrimitivePropertyComponent extends ConfigurationPropertyComponent { - constructor() { - super(); - } -} - diff --git a/ui/src/app/metadata/configuration/configuration.module.ts b/ui/src/app/metadata/configuration/configuration.module.ts deleted file mode 100644 index b7f2827a4..000000000 --- a/ui/src/app/metadata/configuration/configuration.module.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule, DatePipe } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { RouterModule } from '@angular/router'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { I18nModule } from '../../i18n/i18n.module'; -import { MetadataConfigurationComponent } from './component/metadata-configuration.component'; -import { ConfigurationComponent } from './container/configuration.component'; -import { MetadataConfigurationService } from './service/configuration.service'; -import * as fromConfig from './reducer'; -import { MetadataConfigurationEffects } from './effect/configuration.effect'; -import { ConfigurationPropertyComponent } from './component/property/configuration-property.component'; -import { PrimitivePropertyComponent } from './component/property/primitive-property.component'; -import { ObjectPropertyComponent } from './component/property/object-property.component'; -import { ArrayPropertyComponent } from './component/property/array-property.component'; -import { FilterTargetPropertyComponent } from './component/property/filter-target-property.component'; - -import { MetadataOptionsComponent } from './container/metadata-options.component'; -import { MetadataXmlComponent } from './container/metadata-xml.component'; -import { MetadataHeaderComponent } from './component/metadata-header.component'; -import { MetadataHistoryEffects } from './effect/history.effect'; -import { MetadataHistoryService } from './service/history.service'; -import { MetadataHistoryComponent } from './container/metadata-history.component'; -import { HistoryListComponent } from './component/history-list.component'; -import { DomainModule } from '../domain/domain.module'; -import { MetadataComparisonComponent } from './container/metadata-comparison.component'; -import { CompareVersionEffects } from './effect/compare.effect'; -import { FilterModule } from '../filter/filter.module'; -import { FilterConfigurationListComponent } from './component/filter-configuration-list.component'; -import { FilterConfigurationListItemComponent } from './component/filter-configuration-list-item.component'; -import { SharedModule } from '../../shared/shared.module'; - -import { RestoreComponent } from './container/restore.component'; -import { RestoreEffects } from './effect/restore.effect'; -import { VersionComponent } from './container/version.component'; -import { VersionOptionsComponent } from './container/version-options.component'; -import { VersionEffects } from './effect/version.effect'; -import { MetadataEditorComponent } from './component/editor.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { RestoreEditComponent } from './container/restore-edit.component'; -import { RestoreEditStepComponent } from './container/restore-edit-step.component'; - -import { IndexResolver } from './service/index-resolver.service'; -import { FilterVersionListComponent } from './component/filter-version-list.component'; -import { FilterCompareVersionEffects } from './effect/filter.effect'; - -@NgModule({ - declarations: [ - MetadataConfigurationComponent, - MetadataOptionsComponent, - MetadataXmlComponent, - ConfigurationPropertyComponent, - PrimitivePropertyComponent, - ObjectPropertyComponent, - ArrayPropertyComponent, - ConfigurationComponent, - MetadataHeaderComponent, - MetadataHistoryComponent, - HistoryListComponent, - MetadataComparisonComponent, - FilterConfigurationListComponent, - FilterConfigurationListItemComponent, - FilterTargetPropertyComponent, - RestoreComponent, - VersionComponent, - VersionOptionsComponent, - MetadataEditorComponent, - RestoreEditComponent, - RestoreEditStepComponent, - FilterVersionListComponent - ], - entryComponents: [], - imports: [ - CommonModule, - I18nModule, - NgbPopoverModule, - RouterModule, - DomainModule, - FilterModule, - SharedModule, - WizardModule, - FormModule - ], - exports: [ - MetadataConfigurationComponent - ], - providers: [ - DatePipe, - IndexResolver - ] -}) -export class MetadataConfigurationModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootMetadataConfigurationModule, - providers: [ - MetadataConfigurationService, - MetadataHistoryService - ] - }; - } -} - -@NgModule({ - imports: [ - MetadataConfigurationModule, - StoreModule.forFeature('metadata-configuration', fromConfig.reducers), - EffectsModule.forFeature( - [ - MetadataConfigurationEffects, - MetadataHistoryEffects, - CompareVersionEffects, - RestoreEffects, - FilterCompareVersionEffects, - VersionEffects - ] - ) - ], - providers: [] -}) -export class RootMetadataConfigurationModule { } diff --git a/ui/src/app/metadata/configuration/configuration.routing.ts b/ui/src/app/metadata/configuration/configuration.routing.ts deleted file mode 100644 index 886303790..000000000 --- a/ui/src/app/metadata/configuration/configuration.routing.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Routes } from '@angular/router'; -import { ConfigurationComponent } from './container/configuration.component'; -import { MetadataOptionsComponent } from './container/metadata-options.component'; -import { MetadataXmlComponent } from './container/metadata-xml.component'; -import { MetadataHistoryComponent } from './container/metadata-history.component'; -import { MetadataComparisonComponent } from './container/metadata-comparison.component'; -import { RestoreComponent } from './container/restore.component'; -import { VersionComponent } from './container/version.component'; -import { VersionOptionsComponent } from './container/version-options.component'; -import { RestoreEditComponent } from './container/restore-edit.component'; -import { IndexResolver } from './service/index-resolver.service'; -import { RestoreEditStepComponent } from './container/restore-edit-step.component'; - -export const ConfigurationRoutes: Routes = [ - { - path: ':type/:id/configuration', - component: ConfigurationComponent, - children: [ - { - path: '', - redirectTo: 'options' - }, - { - path: 'options', - component: MetadataOptionsComponent, - data: { title: `Metadata Configuration Options` } - }, - { - path: 'xml', - component: MetadataXmlComponent, - data: { title: `Metadata Configuration XML` } - }, - { - path: 'history', - component: MetadataHistoryComponent, - data: { title: `Metadata History` } - }, - { - path: 'compare', - component: MetadataComparisonComponent, - data: { title: `Metadata Comparison` } - }, - { - path: 'version/:version', - component: VersionComponent, - children: [ - { - path: 'options', - component: VersionOptionsComponent, - data: { title: `Metadata Version Options` } - }, - { - path: 'restore', - component: RestoreComponent, - data: { title: `Restore Metadata Version` } - }, - { - path: 'edit', - redirectTo: 'edit/common' - }, - { - path: 'edit', - component: RestoreEditComponent, - children: [ - { - path: ':index', - component: RestoreEditStepComponent, - resolve: { - index: IndexResolver - }, - data: { title: `Edit Metadata` } - } - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/configuration/configuration.values.ts b/ui/src/app/metadata/configuration/configuration.values.ts deleted file mode 100644 index 53c2279e9..000000000 --- a/ui/src/app/metadata/configuration/configuration.values.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MetadataSourceEditor } from '../domain/model/wizards/metadata-source-editor'; - -export enum PATHS { - resolver = 'EntityDescriptor', - provider = 'MetadataResolvers' -} - -export enum TYPES { - resolver = 'resolver', - provider = 'provider' -} - -export const DEFINITIONS = { - resolver: MetadataSourceEditor -}; - -export const CONFIG_DATE_FORMAT = 'MMM dd, yyyy HH:mm:ss'; diff --git a/ui/src/app/metadata/configuration/container/configuration.component.html b/ui/src/app/metadata/configuration/container/configuration.component.html deleted file mode 100644 index e2fd5be4a..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
- - - - -
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts b/ui/src/app/metadata/configuration/container/configuration.component.spec.ts deleted file mode 100644 index 8d33546fe..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ConfigurationComponent } from './configuration.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ConfigurationComponent, {static: true}) - public componentUnderTest: ConfigurationComponent; -} - -describe('Metadata Configuration Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ConfigurationComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - ConfigurationComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/configuration/container/configuration.component.ts b/ui/src/app/metadata/configuration/container/configuration.component.ts deleted file mode 100644 index 1704bc6a6..000000000 --- a/ui/src/app/metadata/configuration/container/configuration.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { takeUntil, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; - -import { ClearConfiguration, SetMetadata } from '../action/configuration.action'; -import * as fromReducer from '../reducer'; - -@Component({ - selector: 'configuration-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './configuration.component.html', - styleUrls: [] -}) -export class ConfigurationComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - name$: Observable; - type$: Observable; - - constructor( - private store: Store, - private routerState: ActivatedRoute - ) { - this.routerState.params.pipe( - takeUntil(this.ngUnsubscribe), - map(({ id, type, version }) => new SetMetadata({ - id, - type, - version - })) - ).subscribe(this.store); - - this.name$ = this.store.select(fromReducer.getConfigurationModelName); - this.type$ = this.store.select(fromReducer.getConfigurationModelType); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearConfiguration()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.html b/ui/src/app/metadata/configuration/container/metadata-comparison.component.html deleted file mode 100644 index 4c4d58ff2..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-comparison.component.html +++ /dev/null @@ -1,55 +0,0 @@ -

- Compare - Source - Provider - Configuration -

-
-
- -   - Version History - - -
- - -
-

- Metadata Filter -

-
- - - - - -
- -
- -
-
-
-
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-comparison.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts b/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts deleted file mode 100644 index 8fb4a817b..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-comparison.component.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, BehaviorSubject, Subscription } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute } from '@angular/router'; -import { map, withLatestFrom } from 'rxjs/operators'; -import { ConfigurationState, getComparisonConfigurationCount } from '../reducer'; -import { CompareVersionRequest, ClearVersions, ViewChanged } from '../action/compare.action'; -import { MetadataConfiguration, FilterConfiguration } from '../model/metadata-configuration'; -import * as fromReducer from '../reducer'; -import { CompareFilterVersions, ClearFilterComparison } from '../action/filter.action'; -import { FilterComparison } from '../model/compare'; - -@Component({ - selector: 'metadata-comparison', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-comparison.component.html', - styleUrls: [] -}) -export class MetadataComparisonComponent implements OnDestroy { - - limiter: BehaviorSubject = new BehaviorSubject(false); - - versions$: Observable = this.store.select(fromReducer.getLimitedComparisonConfigurations); - numVersions$: Observable = this.store.select(getComparisonConfigurationCount); - type$: Observable = this.store.select(fromReducer.getConfigurationModelType); - loading$: Observable = this.store.select(fromReducer.getComparisonLoading); - limited$: Observable = this.store.select(fromReducer.getViewChangedOnly); - sub: Subscription; - filters$: Observable = this.store.select(fromReducer.getComparisonFilterConfiguration); - filterCompare$: Observable = this.store.select(fromReducer.getLimitedFilterComparisonConfiguration); - isProvider$: Observable = this.type$.pipe(map(t => t !== 'resolver')); - - constructor( - private store: Store, - private activatedRoute: ActivatedRoute - ) { - this.activatedRoute.queryParams.pipe( - map(params => params.versions), - map(versions => Array.isArray(versions) ? versions : [versions]), - map(versions => new CompareVersionRequest(versions)) - ).subscribe(this.store); - - this.sub = this.limiter.pipe( - withLatestFrom(this.limited$), - map(([compare, limit]) => new ViewChanged(!limit)) - ).subscribe(this.store); - } - - compareFilters (comparison: FilterComparison) { - this.store.dispatch(new CompareFilterVersions(comparison)); - } - - resetCompareFilters () { - this.store.dispatch(new ClearFilterComparison()); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - this.store.dispatch(new ClearVersions()); - this.resetCompareFilters(); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.html b/ui/src/app/metadata/configuration/container/metadata-history.component.html deleted file mode 100644 index 23c2b4595..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.html +++ /dev/null @@ -1,13 +0,0 @@ -

- Version History -

-
- -
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts deleted file mode 100644 index 4a322ee3c..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.spec.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Component, ViewChild, Input, EventEmitter, Output } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataHistoryComponent } from './metadata-history.component'; -import { MetadataHistory } from '../model/history'; -import { MetadataVersion } from '../model/version'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import * as fromConfiguration from '../reducer'; -import { Router, ActivatedRoute } from '@angular/router'; -import { RouterStub } from '../../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; - -export const TestData = { - versions: [ - { - id: '1', - date: new Date().toDateString(), - creator: 'admin' - } - ] -}; - -@Component({ - selector: 'history-list', - template: `` -}) -class MockHistoryListComponent { - @Input() history: MetadataHistory; - @Output() compare: EventEmitter = new EventEmitter(); - @Output() restore: EventEmitter = new EventEmitter(); -} - -const MockHistoryService = { - query: () => of(TestData) -}; - -describe('Metadata Version History Component', () => { - let fixture: ComponentFixture; - let instance: MetadataHistoryComponent; - let router: Router; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { - provide: MetadataHistoryService, useValue: MockHistoryService - }, - { - provide: Router, useClass: RouterStub - }, - { - provide: ActivatedRoute, useClass: ActivatedRouteStub - } - ], - imports: [ - MockI18nModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - }), - ], - declarations: [ - MockHistoryListComponent, - MetadataHistoryComponent - ], - }); - - fixture = TestBed.createComponent(MetadataHistoryComponent); - instance = fixture.componentInstance; - router = TestBed.get(Router); - spyOn(router, 'navigate'); - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(instance).toBeDefined(); - }); - - describe('compare versions method', () => { - it('should call the router.navigate method', () => { - instance.compareVersions(TestData.versions); - expect(router.navigate).toHaveBeenCalled(); - }); - }); - - describe('sortVersionsByDate method', () => { - it('should sort the versions by their date', () => { - const nowTime = new Date().getTime(); - const futureTime = nowTime + 10000; - const beforeTime = nowTime - 10000; - const nowDate = new Date(nowTime); - const futureDate = new Date(futureTime); - const beforeDate = new Date(beforeTime); - - const versions = [ - { - id: 'foo', - creator: 'bar', - date: nowDate.toISOString() - }, - { - id: 'bar', - creator: 'baz', - date: beforeDate.toISOString() - }, - { - id: 'baz', - creator: 'foo', - date: beforeDate.toISOString() - }, - { - id: 'baz2', - creator: 'foo', - date: futureDate.toISOString() - } - ]; - - const sorted = instance.sortVersionsByDate(versions); - expect(sorted[0].id).toEqual('baz2'); - expect(sorted[1].id).toEqual('foo'); - expect(sorted[2].id).toEqual('baz'); - expect(sorted[3].id).toEqual('bar'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-history.component.ts b/ui/src/app/metadata/configuration/container/metadata-history.component.ts deleted file mode 100644 index c2c1d0a1a..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-history.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, combineLatest, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getVersionCollection, - getConfigurationModelId, - getConfigurationModelKind, - getHistoryLoading -} from '../reducer'; -import { MetadataVersion } from '../model/version'; -import { Router, ActivatedRoute } from '@angular/router'; -import { map, takeUntil } from 'rxjs/operators'; -import { LoadHistoryRequest, ClearHistory } from '../action/history.action'; - -@Component({ - selector: 'metadata-history', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-history.component.html', - styleUrls: [] -}) -export class MetadataHistoryComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - history$: Observable; - loading$: Observable = this.store.select(getHistoryLoading); - - constructor( - private store: Store, - private router: Router, - private route: ActivatedRoute - ) { - combineLatest( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind) - ).pipe( - takeUntil(this.ngUnsubscribe), - map(([id, kind]) => ({ id, type: kind })), - map(request => new LoadHistoryRequest(request)) - ).subscribe(store); - - this.history$ = this.store.select(getVersionCollection) - .pipe(map(versions => this.sortVersionsByDate(versions))); - } - - sortVersionsByDate(versions: MetadataVersion[]): MetadataVersion[] { - return versions.sort((a, b) => { - const aDate = new Date(a.date).getTime(); - const bDate = new Date(b.date).getTime(); - return aDate === bDate ? 0 : aDate < bDate ? -1 : 1; - }).reverse(); - } - - compareVersions(versions: MetadataVersion[]): void { - const sorted = this.sortVersionsByDate(versions); - this.router.navigate( - ['../', 'compare'], - { - queryParams: { versions: sorted.map(v => v.id) }, - relativeTo: this.route - } - ); - } - - restoreVersion(version: MetadataVersion): void { - this.router.navigate( - [ '../', 'version', version.id, 'restore' ], - { - relativeTo: this.route - } - ); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearHistory()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.html b/ui/src/app/metadata/configuration/container/metadata-options.component.html deleted file mode 100644 index 5f210a630..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.html +++ /dev/null @@ -1,84 +0,0 @@ -

- Source - Provider - Configuration -

- \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts deleted file mode 100644 index 277e66a47..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule, SpyNgModuleFactoryLoader } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule, NgbModalModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataConfiguration } from '../model/metadata-configuration'; -import * as fromConfiguration from '../reducer'; -import * as fromFilters from '../../filter/reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataOptionsComponent } from './metadata-options.component'; -import { CommonModule, ViewportScroller } from '@angular/common'; - -import { - MetadataConfigurationComponentStub, - MetadataHeaderComponentStub -} from '../../../../testing/metadata-configuration.stub'; -import { - FilterConfigurationListComponentStub -} from '../../../../testing/filter-list.stub'; -import { Metadata } from '../../domain/domain.type'; -import { FilterActionTypes } from '../../filter/action/filter.action'; -import { FilterCollectionActionTypes } from '../../filter/action/collection.action'; -import { MetadataFilter } from '../../domain/model'; -import { NgbModalStub } from '../../../../testing/modal.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataOptionsComponent, {static: true}) - public componentUnderTest: MetadataOptionsComponent; - - configuration: MetadataConfiguration = { - dates: [], - sections: [] - }; -} - -describe('Metadata Options Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataOptionsComponent; - let store: Store; - let dispatchSpy; - let scroller: ViewportScroller; - let filter = { - type: 'EntityAttributesFilter', - resourceId: 'foo', - name: 'name', - createdBy: 'admin' - } as MetadataFilter; - let modal: NgbModal; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'filter': combineReducers(fromFilters.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule, - CommonModule - ], - declarations: [ - MetadataOptionsComponent, - MetadataConfigurationComponentStub, - MetadataHeaderComponentStub, - TestHostComponent, - FilterConfigurationListComponentStub - ], - providers: [ - { - provide: NgbModal, - useClass: NgbModalStub - } - ] - }).compileComponents(); - - store = TestBed.get(Store); - scroller = TestBed.get(ViewportScroller); - modal = TestBed.get(NgbModal); - dispatchSpy = spyOn(store, 'dispatch'); - spyOn(store, 'select').and.callThrough(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalled(); - })); - - describe('setModel method', () => { - it('should set the id and kind attributes on the component', () => { - app.setModel({ id: 'foo' } as Metadata); - expect(app.id).toBe('foo'); - expect(app.kind).toBe('resolver'); - }); - - it('should dispatch a LoadFilterRequest event if the provided model is a provider', () => { - app.setModel({resourceId: 'foo', '@type': 'FileBackedHttpMetadataResolver'} as Metadata); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.LOAD_FILTER_REQUEST); - }); - }); - - describe('onScrollTo', () => { - it('should call the viewportscroller', () => { - spyOn(scroller, 'scrollToAnchor'); - app.onScrollTo('fragment'); - expect(scroller.scrollToAnchor).toHaveBeenCalled(); - }); - }); - - describe('order methods', () => { - it('updateOrderUp should dispatch a ChangeFilterOrderUp action', () => { - app.updateOrderUp(filter); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP); - }); - - it('updateOrderDown should dispatch a ChangeFilterOrderDown action', () => { - app.updateOrderDown(filter); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN); - }); - }); - - describe('removeFilter method', () => { - it('should open a modal', () => { - spyOn(modal, 'open').and.returnValue({ - result: Promise.resolve(true) - } as NgbModalRef); - app.removeFilter('foo'); - expect(modal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.ts b/ui/src/app/metadata/configuration/container/metadata-options.component.ts deleted file mode 100644 index 96cc49c2d..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ViewportScroller } from '@angular/common'; -import { takeUntil, filter, withLatestFrom } from 'rxjs/operators'; - -import { - ConfigurationState, - getConfigurationSections, - getSelectedIsCurrent, - getConfigurationModelEnabled, - getConfigurationHasXml, - getConfigurationModel, - getConfigurationModelType -} from '../reducer'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { MetadataEntity, MetadataFilter, MetadataResolver } from '../../domain/model'; -import { getAdditionalFilters } from '../../filter/reducer'; -import { - ClearFilters, - LoadFilterRequest, - ChangeFilterOrderDown, - ChangeFilterOrderUp, - RemoveFilterRequest -} from '../../filter/action/collection.action'; - -import { Metadata } from '../../domain/domain.type'; -import { DeleteFilterComponent } from '../../provider/component/delete-filter.component'; -import { ClearHistory } from '../action/history.action'; -import { DeleteDialogComponent } from '../../manager/component/delete-dialog.component'; -import { RemoveDraftRequest } from '../../resolver/action/draft.action'; -import { RemoveResolverRequest } from '../../resolver/action/collection.action'; -import { RemoveMetadataRequest } from '../../../admin/action/metadata-collection.action'; - -@Component({ - selector: 'metadata-options-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata-options.component.html', - styleUrls: [] -}) -export class MetadataOptionsComponent implements OnDestroy { - - protected ngUnsubscribe: Subject = new Subject(); - - configuration$: Observable = this.store.select(getConfigurationSections); - isEnabled$: Observable = this.store.select(getConfigurationModelEnabled); - isCurrent$: Observable = this.store.select(getSelectedIsCurrent); - hasXml$: Observable = this.store.select(getConfigurationHasXml); - filters$: Observable = this.store.select(getAdditionalFilters); - model$: Observable = this.store.select(getConfigurationModel); - type$: Observable = this.store.select(getConfigurationModelType); - id: string; - kind: string; - - constructor( - protected store: Store, - protected modalService: NgbModal, - protected scroller: ViewportScroller, - protected router: Router, - protected activatedRoute: ActivatedRoute - ) { - this.model$ - .pipe( - takeUntil(this.ngUnsubscribe), - filter(model => !!model) - ) - .subscribe(p => this.setModel(p)); - - const sub = this.filters$.pipe( - withLatestFrom(this.activatedRoute.fragment) - ).subscribe(([filters, fragment]) => { - if (filters && fragment) { - setTimeout(() => { - scroller.scrollToAnchor(fragment); - sub.unsubscribe(); - }, 100); - } - }); - } - - edit(id: string) { - this.router.navigate(['../', 'edit', id], { relativeTo: this.activatedRoute.parent }); - } - - setModel(data: Metadata): void { - this.id = 'resourceId' in data ? data.resourceId : data.id; - this.kind = '@type' in data ? 'provider' : 'resolver'; - if (this.kind === 'provider') { - this.store.dispatch(new LoadFilterRequest(this.id)); - } - } - - onScrollTo(element): void { - this.scroller.scrollToAnchor(element); - } - - updateOrderUp(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderUp({ - id: filter.resourceId, - providerId: this.activatedRoute.snapshot.params.providerId - })); - } - - updateOrderDown(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderDown({ - id: filter.resourceId, - providerId: this.activatedRoute.snapshot.params.providerId - })); - } - - removeFilter(id: string): void { - this.modalService - .open(DeleteFilterComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveFilterRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - deleteResolver(id: string): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveMetadataRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - this.store.dispatch(new ClearHistory()); - } -} diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.html b/ui/src/app/metadata/configuration/container/metadata-xml.component.html deleted file mode 100644 index 8a74ab376..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.html +++ /dev/null @@ -1,32 +0,0 @@ -

- Source - Provider - Configuration -

-
- -
-
-
{{ xml$ | async }}
-
- {{ xml$ | async }} -
-
- - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts b/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts deleted file mode 100644 index 03d4d3a88..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataConfiguration } from '../model/metadata-configuration'; -import * as fromConfiguration from '../reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataXmlComponent } from './metadata-xml.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataXmlComponent, {static: true}) - public componentUnderTest: MetadataXmlComponent; -} - -describe('Metadata Xml Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataXmlComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - MetadataXmlComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - spyOn(store, 'select'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalledTimes(3); - })); - - describe('preview method', () => { - it('should dispatch an action', () => { - app.preview(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/metadata-xml.component.ts b/ui/src/app/metadata/configuration/container/metadata-xml.component.ts deleted file mode 100644 index b49a06184..000000000 --- a/ui/src/app/metadata/configuration/container/metadata-xml.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; -import { Metadata } from '../../domain/domain.type'; -import { DownloadXml } from '../action/configuration.action'; - -@Component({ - selector: 'metadata-xml-page', - templateUrl: './metadata-xml.component.html', - styleUrls: [] -}) -export class MetadataXmlComponent { - - entity: Metadata; - entity$: Observable; - xml: string; - xml$: Observable; - type$: Observable; - - constructor( - private store: Store - ) { - this.xml$ = this.store.select(fromConfiguration.getConfigurationXml); - this.entity$ = this.store.select(fromConfiguration.getConfigurationModel); - this.type$ = this.store.select(fromConfiguration.getConfigurationModelType); - } - - preview(): void { - this.store.dispatch(new DownloadXml()); - } -} diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.html b/ui/src/app/metadata/configuration/container/restore-edit-step.component.html deleted file mode 100644 index be953b86b..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts b/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts deleted file mode 100644 index d0608169f..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { RestoreEditStepComponent } from './restore-edit-step.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -import { - RestoreActionTypes -} from '../action/restore.action'; -import { WizardActionTypes } from '../../../wizard/action/wizard.action'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreEditStepComponent, {static: true}) - public componentUnderTest: RestoreEditStepComponent; -} - -describe('Restore Version Edit Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreEditStepComponent; - let store: Store; - let dispatchSpy; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreEditStepComponent, - TestHostComponent - ], - schemas: [ - NO_ERRORS_SCHEMA - ] - }).compileComponents(); - - store = TestBed.get(Store); - dispatchSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('onChange', () => { - it('should dispatch an update changes event', () => { - app.onChange({ name: 'test' }); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_RESTORATION_REQUEST); - }); - }); - - describe('updateStatus', () => { - it('should dispatch an update form status event', () => { - app.updateStatus({ value: 'foo' }, 'common'); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_STATUS); - }); - - it('should dispatch an update form status event', () => { - app.updateStatus({}, 'common'); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.UPDATE_STATUS); - }); - }); - - describe('updateLock', () => { - it('should dispatch a LockEditor event when passed a locked status', () => { - app.updateLock(true); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(WizardActionTypes.LOCK); - }); - - it('should dispatch a UnlockEditor event when passed a locked status', () => { - app.updateLock(false); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(WizardActionTypes.UNLOCK); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts b/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts deleted file mode 100644 index 2a9a73a0e..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, combineLatest, of, Subject } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, getFormattedModel -} from '../reducer'; -import { getWizardDefinition, getSchema, getValidators, getCurrent, getWizardIndex } from '../../../wizard/reducer'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { Metadata } from '../../domain/domain.type'; -import { map, switchMap, withLatestFrom, filter } from 'rxjs/operators'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { UpdateRestorationChangesRequest, UpdateRestoreFormStatus } from '../action/restore.action'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; -import { takeUntil } from 'rxjs/operators'; - -@Component({ - selector: 'restore-edit-step', - templateUrl: './restore-edit-step.component.html', - styleUrls: [] -}) - -export class RestoreEditStepComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - readonly lockChange$: Subject = new Subject(); - readonly statusChange$: Subject = new Subject(); - - definition$: Observable> = this.store.select(getWizardDefinition); - schema$: Observable = this.store.select(getSchema); - model$: Observable = this.store.select(getFormattedModel); - step$: Observable = this.store.select(getCurrent); - - lockable$: Observable = this.step$.pipe(filter(s => !!s), map(step => step.locked)); - - validators$: Observable; - - formats = NAV_FORMATS; - - constructor( - private store: Store - ) { - this.validators$ = this.definition$.pipe( - filter(def => !!def), - map(def => def.validatorParams), - switchMap(params => combineLatest(params.map(p => this.store.select(p)))), - switchMap(selections => this.store.select(getValidators(selections))) - ); - - this.step$ - .pipe(takeUntil(this.ngUnsubscribe), filter(step => !!step)) - .subscribe(s => this.lockChange$.next(s.locked ? true : false)); - - this.lockChange$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(locked => this.updateLock(locked)); - - this.statusChange$ - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.store.select(getWizardIndex)) - ) - .subscribe(([errors, currentPage]) => this.updateStatus(errors, currentPage)); - } - - onChange(changes: any): void { - this.store.dispatch(new UpdateRestorationChangesRequest(changes)); - } - - updateStatus(errors, currentPage) { - const status = { [currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateRestoreFormStatus(status)); - } - - updateLock(locked: boolean) { - this.store.dispatch(locked ? new LockEditor() : new UnlockEditor()); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.html b/ui/src/app/metadata/configuration/container/restore-edit.component.html deleted file mode 100644 index 7b1569f9a..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.html +++ /dev/null @@ -1,50 +0,0 @@ -
-
-
- - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - -
-
- -
-
-
- diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts b/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts deleted file mode 100644 index 2388e6c97..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { RestoreEditComponent } from './restore-edit.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RestoreActionTypes } from '../action/restore.action'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreEditComponent, {static: true}) - public componentUnderTest: RestoreEditComponent; -} - -describe('Restore Version Edit Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreEditComponent; - let store: Store; - let dispatchSpy; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreEditComponent, - TestHostComponent - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).compileComponents(); - - store = TestBed.get(Store); - dispatchSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('save', () => { - it('should dispatch a save request event', () => { - app.save(); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.RESTORE_VERSION_REQUEST); - }); - }); - - describe('cancel', () => { - it('should dispatch a cancel request event', () => { - app.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - expect(dispatchSpy.calls.mostRecent().args[0].type).toBe(RestoreActionTypes.CANCEL_RESTORE); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.ts b/ui/src/app/metadata/configuration/container/restore-edit.component.ts deleted file mode 100644 index 3ca9c6648..000000000 --- a/ui/src/app/metadata/configuration/container/restore-edit.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getConfigurationModelKind, - getRestorationIsSaving, - getRestorationIsValid, - getInvalidRestorationForms -} from '../../configuration/reducer'; -import { RestoreVersionRequest, CancelRestore } from '../action/restore.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { Metadata } from '../../domain/domain.type'; -import { getVersionModel } from '../reducer'; -import { map } from 'rxjs/operators'; - - -@Component({ - selector: 'restore-edit', - templateUrl: './restore-edit.component.html', - styleUrls: [] -}) - -export class RestoreEditComponent { - - model$: Observable = this.store.select(getVersionModel); - kind$: Observable = this.store.select(getConfigurationModelKind); - - isInvalid$: Observable = this.store.select(getRestorationIsValid).pipe(map(v => !v)); - status$: Observable = this.store.select(getInvalidRestorationForms); - isSaving$: Observable = this.store.select(getRestorationIsSaving); - - validators$: Observable; - - formats = NAV_FORMATS; - - constructor( - private store: Store - ) {} - - save() { - this.store.dispatch(new RestoreVersionRequest()); - } - - cancel() { - this.store.dispatch(new CancelRestore()); - } -} - diff --git a/ui/src/app/metadata/configuration/container/restore.component.html b/ui/src/app/metadata/configuration/container/restore.component.html deleted file mode 100644 index 51115e922..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.html +++ /dev/null @@ -1,25 +0,0 @@ - -

- - Restore Version ( date ) - -

-
-
-
-

- Create New Version from Previous Settings -

-

- Restoring this version will copy the Version ( date ) configuration and create a new Version from the selected version settings. You can then edit the configuration before saving the new version. -

-   - -
-
-
-
-
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/restore.component.spec.ts b/ui/src/app/metadata/configuration/container/restore.component.spec.ts deleted file mode 100644 index 45590e342..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, ViewChild, Input } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers, Store } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RestoreComponent } from './restore.component'; -import { of } from 'rxjs'; -import { DatePipe } from '@angular/common'; -import { Router } from '@angular/router'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(RestoreComponent, {static: true}) - public componentUnderTest: RestoreComponent; -} - -describe('Metadata Restore Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: RestoreComponent; - let store: Store; - let router: Router; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - RestoreComponent, - TestHostComponent - ], - providers: [ - DatePipe - ] - }).compileComponents(); - - store = TestBed.get(Store); - router = TestBed.get(Router); - spyOn(store, 'dispatch'); - spyOn(store, 'select').and.callFake(() => of(new Date().toDateString())); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - expect(store.select).toHaveBeenCalledTimes(2); - expect(store.dispatch).not.toHaveBeenCalled(); - })); - - describe('restore method', () => { - it('should navigate to the restore edit page', () => { - spyOn(router, 'navigate').and.callThrough(); - app.restore(); - expect(router.navigate).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/restore.component.ts b/ui/src/app/metadata/configuration/container/restore.component.ts deleted file mode 100644 index 75d1f2752..000000000 --- a/ui/src/app/metadata/configuration/container/restore.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; - -import * as fromConfiguration from '../reducer'; -import { CONFIG_DATE_FORMAT } from '../configuration.values'; -import { CancelRestore } from '../action/restore.action'; -import { map } from 'rxjs/operators'; - -import { DatePipe } from '@angular/common'; -import { Router, ActivatedRoute } from '@angular/router'; - -@Component({ - selector: 'restore-component', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './restore.component.html', - styleUrls: [] -}) -export class RestoreComponent { - - dateString$ = this.store.select(fromConfiguration.getConfigurationVersionDate); - loading$ = this.store.select(fromConfiguration.getVersionLoading); - loaded$ = this.loading$.pipe(map(loading => !loading)); - date$: Observable; - - constructor( - private store: Store, - private datePipe: DatePipe, - private router: Router, - private route: ActivatedRoute - ) { - this.date$ = this.dateString$.pipe(map((date) => this.datePipe.transform(date, CONFIG_DATE_FORMAT))); - } - - restore() { - this.router.navigate(['../', 'edit', 'common'], { relativeTo: this.route }); - } - - cancel() { - this.store.dispatch(new CancelRestore()); - } -} diff --git a/ui/src/app/metadata/configuration/container/version-options.component.html b/ui/src/app/metadata/configuration/container/version-options.component.html deleted file mode 100644 index 837d42626..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.html +++ /dev/null @@ -1,46 +0,0 @@ -

- Source - Provider - Configuration -

- -
- - Loading... -
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/version-options.component.spec.ts b/ui/src/app/metadata/configuration/container/version-options.component.spec.ts deleted file mode 100644 index cbdf6f18f..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Component, ViewChild, NO_ERRORS_SCHEMA } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { VersionOptionsComponent } from './version-options.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { Metadata } from '../../domain/domain.type'; -import { ViewportScroller } from '@angular/common'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(VersionOptionsComponent, {static: true}) - public componentUnderTest: VersionOptionsComponent; -} - -describe('Metadata Version Options Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: VersionOptionsComponent; - let scroller: ViewportScroller; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - VersionOptionsComponent, - TestHostComponent - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).compileComponents(); - - scroller = TestBed.get(ViewportScroller); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); - - describe('setModel method', () => { - it('should set attributes based on the passed data', () => { - app.setModel({ id: 'foo', '@type': 'bar' } as Metadata); - expect(app.id).toBe('foo'); - expect(app.kind).toBe('provider'); - - app.setModel({ resourceId: 'baz' } as Metadata); - expect(app.id).toBe('baz'); - expect(app.kind).toBe('resolver'); - }); - }); - - describe('onScrollTo method', () => { - it('should set attributes based on the passed data', () => { - spyOn(scroller, 'scrollToAnchor'); - app.onScrollTo('foo'); - expect(scroller.scrollToAnchor).toHaveBeenCalledWith('foo'); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/version-options.component.ts b/ui/src/app/metadata/configuration/container/version-options.component.ts deleted file mode 100644 index 9059f079f..000000000 --- a/ui/src/app/metadata/configuration/container/version-options.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ViewportScroller } from '@angular/common'; -import { takeUntil, filter } from 'rxjs/operators'; - -import { - ConfigurationState, - getConfigurationSections, - getSelectedVersion, - getConfigurationModelEnabled, - getConfigurationModelType, - getVersionModelFilters, - getVersionLoading -} from '../reducer'; -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { MetadataVersion } from '../model/version'; -import { - ClearFilters -} from '../../filter/action/collection.action'; - -import { Metadata } from '../../domain/domain.type'; -import { getVersionModel, getVersionConfigurationSections } from '../reducer'; - -@Component({ - selector: 'version-options-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './version-options.component.html', - styleUrls: [] -}) -export class VersionOptionsComponent implements OnDestroy { - - protected ngUnsubscribe: Subject = new Subject(); - - configuration$: Observable = this.store.select(getVersionConfigurationSections); - isEnabled$: Observable = this.store.select(getConfigurationModelEnabled); - model$: Observable = this.store.select(getVersionModel); - type$: Observable = this.store.select(getConfigurationModelType); - filters$: Observable = this.store.select(getVersionModelFilters); - loading$: Observable = this.store.select(getVersionLoading); - id: string; - kind: string; - - constructor( - protected store: Store, - protected modalService: NgbModal, - protected scroller: ViewportScroller - ) { - this.model$ - .pipe( - takeUntil(this.ngUnsubscribe), - filter(model => !!model) - ) - .subscribe(p => this.setModel(p)); - } - - setModel(data: Metadata): void { - this.id = 'resourceId' in data ? data.resourceId : data.id; - this.kind = '@type' in data ? 'provider' : 'resolver'; - } - - onScrollTo(element): void { - this.scroller.scrollToAnchor(element); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - } -} diff --git a/ui/src/app/metadata/configuration/container/version.component.html b/ui/src/app/metadata/configuration/container/version.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/version.component.spec.ts b/ui/src/app/metadata/configuration/container/version.component.spec.ts deleted file mode 100644 index 559449b2b..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { VersionComponent } from './version.component'; -import * as fromConfiguration from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import * as fromResolvers from '../../resolver/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(VersionComponent, {static: true}) - public componentUnderTest: VersionComponent; -} - -describe('Metadata Version Page Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: VersionComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - StoreModule.forRoot({ - 'metadata-configuration': combineReducers(fromConfiguration.reducers), - 'provider': combineReducers(fromProviders.reducers), - 'resolver': combineReducers(fromResolvers.reducers) - }), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - VersionComponent, - TestHostComponent - ], - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/metadata/configuration/container/version.component.ts b/ui/src/app/metadata/configuration/container/version.component.ts deleted file mode 100644 index 22c31601b..000000000 --- a/ui/src/app/metadata/configuration/container/version.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Subscription, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import * as fromConfiguration from '../reducer'; -import { SelectVersionRequest } from '../action/version.action'; -import { map, withLatestFrom } from 'rxjs/operators'; - -@Component({ - selector: 'version-page', - templateUrl: './version.component.html', - styleUrls: [] -}) - -export class VersionComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - actionsSubscription: Subscription; - - constructor( - private store: Store, - private route: ActivatedRoute, - ) { - this.route - .params - .pipe( - withLatestFrom( - this.store.select(fromConfiguration.getConfigurationModelKind), - this.store.select(fromConfiguration.getConfigurationModelId) - ), - map(([ params, kind, id ]) => ({ version: params.version, id, type: kind })), - map(request => new SelectVersionRequest(request)) - ) - .subscribe(this.store); - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} - diff --git a/ui/src/app/metadata/configuration/effect/compare.effect.ts b/ui/src/app/metadata/configuration/effect/compare.effect.ts deleted file mode 100644 index bb6e077d2..000000000 --- a/ui/src/app/metadata/configuration/effect/compare.effect.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { catchError, withLatestFrom, map, filter, combineLatest, switchMap } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { MetadataHistoryService } from '../service/history.service'; -import { - CompareVersionRequest, - CompareActionTypes, - CompareVersionSuccess, - CompareVersionError, - SetMetadataVersions -} from '../action/compare.action'; -import { Store } from '@ngrx/store'; -import { State, getConfigurationModel } from '../reducer'; - -@Injectable() -export class CompareVersionEffects { - - @Effect() - compareVersionRequest$ = this.actions$.pipe( - ofType(CompareActionTypes.COMPARE_METADATA_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(getConfigurationModel) - ), - switchMap(([versions, model]) => { - const type = '@type' in model ? 'provider' : 'resolver'; - const id = '@type' in model ? model.resourceId : model.id; - return this.historyService.getVersions(id, versions, type).pipe( - map(v => new CompareVersionSuccess(v)), - catchError(err => of(new CompareVersionError(err))) - ); - }) - ); - - @Effect() - setVersionsOnSuccess$ = this.actions$.pipe( - ofType(CompareActionTypes.COMPARE_METADATA_SUCCESS), - map(action => action.payload), - map(versions => new SetMetadataVersions(versions)) - ); - - constructor( - private historyService: MetadataHistoryService, - private store: Store, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/configuration.effect.ts b/ui/src/app/metadata/configuration/effect/configuration.effect.ts deleted file mode 100644 index 91ce3d37a..000000000 --- a/ui/src/app/metadata/configuration/effect/configuration.effect.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, map, tap, withLatestFrom, filter } from 'rxjs/operators'; -import { of, Observable } from 'rxjs'; -import * as FileSaver from 'file-saver'; -import { Store } from '@ngrx/store'; - -import { MetadataConfigurationService } from '../service/configuration.service'; -import { - ConfigurationActionTypes, - SetMetadata, - SetConfigurationDefinition, - LoadSchemaRequest, - LoadSchemaSuccess, - SetConfigurationSchema, - LoadSchemaError, - LoadXmlSuccess, - LoadXmlError, - SetXml, - DownloadXml -} from '../action/configuration.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { State } from '../reducer/configuration.reducer'; -import { getConfigurationModel, getConfigurationXml } from '../reducer'; -import { MetadataResolver, MetadataProvider } from '../../domain/model'; -import { - SelectProviderSuccess, - ProviderCollectionActionTypes -} from '../../provider/action/collection.action'; -import { - SelectResolverSuccess, - ResolverCollectionActionTypes -} from '../../resolver/action/collection.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { Metadata } from '../../domain/domain.type'; -import { SelectVersion } from '../action/history.action'; -import { - SetDefinition, - LoadSchemaSuccess as LoadWizardSchemaSuccess, - LoadSchemaRequest as LoadWizardSchemaRequest -} from '../../../wizard/action/wizard.action'; - -@Injectable() -export class MetadataConfigurationEffects { - - @Effect() - loadMetadata$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - map(action => action.payload), - switchMap(payload => - this.historyService.getVersion(payload.id, payload.type, payload.version).pipe( - map((response: Metadata) => { - return (payload.type === 'resolver') ? - new SelectResolverSuccess(response as MetadataResolver) : - new SelectProviderSuccess(response as MetadataProvider); - }) - ) - ) - ); - - @Effect() - setMetadataVersion$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - map(action => action.payload), - map(({version}) => new SelectVersion(version)) - ); - - @Effect() - loadMetadataXml$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_METADATA), - filter(action => action.payload.type === 'resolver'), - switchMap(action => this.resolverService.preview(action.payload.id).pipe( - map(xml => new LoadXmlSuccess(xml)), - catchError(error => of(new LoadXmlError(error))) - )) - ); - - @Effect() - setXmlOnLoad$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_XML_SUCCESS), - map(action => new SetXml(action.payload)) - ); - - @Effect() - setDefinitionOnResolverDataLoad$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.SELECT_SUCCESS), - map(action => new SetConfigurationDefinition(this.configService.getDefinition('resolver'))) - ); - - @Effect() - setDefinitionOnProviderLoad$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS), - map(action => new SetConfigurationDefinition(this.configService.getDefinition(action.payload['@type']))) - ); - - @Effect() - loadSchemaOnDefinitionSet$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_DEFINITION), - map(action => new LoadSchemaRequest(action.payload.schema)) - ); - - @Effect() - setWizardDefinition$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_DEFINITION), - map(action => new SetDefinition(action.payload)) - ); - - @Effect() - setWizardSchema$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => new LoadWizardSchemaSuccess(action.payload)) - ); - - @Effect() - loadSchemaData$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_REQUEST), - switchMap(action => - this.configService - .loadSchema(action.payload) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaError(error))) - ) - ) - ); - - @Effect() - setSchema$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => new SetConfigurationSchema(action.payload)) - ); - - @Effect({dispatch: false}) - downloadXml$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.DOWNLOAD_XML), - withLatestFrom( - this.store.select(getConfigurationModel), - this.store.select(getConfigurationXml) - ), - tap(([action, entity, xml]) => { - const name = entity.name ? entity.name : (entity as MetadataResolver).serviceProviderName; - const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); - FileSaver.saveAs(blob, `${name}.xml`); - }) - ); - - constructor( - private configService: MetadataConfigurationService, - private actions$: Actions, - private resolverService: ResolverService, - private historyService: MetadataHistoryService, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/filter.effect.ts b/ui/src/app/metadata/configuration/effect/filter.effect.ts deleted file mode 100644 index 215ac755e..000000000 --- a/ui/src/app/metadata/configuration/effect/filter.effect.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { - LoadFilterSchemaRequest, - CompareFilterVersions, - SetFilterComparisonDefinition, - LoadFilterSchemaSuccess, - LoadFilterSchemaError, - SetFilterComparisonSchema -} from '../action/filter.action'; -import { Store } from '@ngrx/store'; -import { State } from '../reducer'; -import { FilterCompareActionTypes } from '../action/filter.action'; -import { MetadataConfigurationService } from '../service/configuration.service'; -import { switchMap, map, catchError } from 'rxjs/operators'; -import { of } from 'rxjs'; - -@Injectable() -export class FilterCompareVersionEffects { - - @Effect() - setDefinition$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.COMPARE_FILTERS), - map(action => action.payload), - map(comparison => { - const def = this.configService.getDefinition(comparison.modelType); - return new SetFilterComparisonDefinition(def); - }) - ); - - @Effect() - loadSchemaOnDefinitionSet$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.SET_DEFINITION), - map(action => action.payload), - map(def => new LoadFilterSchemaRequest(def.schema)) - ); - - @Effect() - loadSchemaData$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.LOAD_SCHEMA_REQUEST), - switchMap(action => - this.configService - .loadSchema(action.payload) - .pipe( - map(schema => new LoadFilterSchemaSuccess(schema)), - catchError(error => of(new LoadFilterSchemaError(error))) - ) - ) - ); - - @Effect() - loadSchemaSuccess$ = this.actions$.pipe( - ofType(FilterCompareActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => action.payload), - map(schema => new SetFilterComparisonSchema(schema)) - ); - - constructor( - private configService: MetadataConfigurationService, - private store: Store, - private actions$: Actions - ) {} -} diff --git a/ui/src/app/metadata/configuration/effect/history.effect.ts b/ui/src/app/metadata/configuration/effect/history.effect.ts deleted file mode 100644 index 0bda812ec..000000000 --- a/ui/src/app/metadata/configuration/effect/history.effect.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, map } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { LoadHistoryRequest, HistoryActionTypes, LoadHistorySuccess, LoadHistoryError, SetHistory } from '../action/history.action'; -import { MetadataHistoryService } from '../service/history.service'; - -@Injectable() -export class MetadataHistoryEffects { - - @Effect() - loadHistory$ = this.actions$.pipe( - ofType(HistoryActionTypes.LOAD_HISTORY_REQUEST), - switchMap(action => - this.historyService - .query(action.payload.id, action.payload.type) - .pipe( - map(history => new LoadHistorySuccess(history)), - catchError(error => of(new LoadHistoryError(error))) - ) - ) - ); - - @Effect() - loadHistorySuccess$ = this.actions$.pipe( - ofType(HistoryActionTypes.LOAD_HISTORY_SUCCESS), - map(action => new SetHistory(action.payload)) - ); - - constructor( - private historyService: MetadataHistoryService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/restore.effect.ts b/ui/src/app/metadata/configuration/effect/restore.effect.ts deleted file mode 100644 index f15f21569..000000000 --- a/ui/src/app/metadata/configuration/effect/restore.effect.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; -import { map, catchError, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { - RestoreActionTypes, - RestoreVersionRequest, - RestoreVersionSuccess, - RestoreVersionError, - CancelRestore, - UpdateRestorationChangesRequest, - UpdateRestorationChangesSuccess, - SetSavingStatus -} from '../action/restore.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; -import { Router } from '@angular/router'; - -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { Store } from '@ngrx/store'; -import { - ConfigurationState, - getConfigurationModel, - getConfigurationModelId, - getConfigurationModelKind, - getConfigurationDefinition, - getRestorationModel -} from '../reducer'; -import { SetMetadata } from '../action/configuration.action'; -import { removeNulls } from '../../../shared/util'; -import { getModel } from '../../../wizard/reducer'; -import { ClearProviderSelection } from '../../provider/action/collection.action'; -import { ClearResolverSelection } from '../../resolver/action/collection.action'; - - -@Injectable() -export class RestoreEffects { - - @Effect() - restoreVersion$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_REQUEST), - withLatestFrom( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind), - this.store.select(getConfigurationModel), - this.store.select(getRestorationModel) - ), - switchMap(([action, id, kind, current, version]) => - this.historyService.updateVersion(id, kind, removeNulls({ - ...version, - version: current.version - })).pipe( - map(v => new RestoreVersionSuccess({ id, type: kind, model: v })), - catchError(err => of(new RestoreVersionError(err))) - ) - ) - ); - - @Effect() - restoreVersionSaving$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_REQUEST), - map(() => new SetSavingStatus(true)) - ); - - @Effect() - restoreVersionSaved$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(() => new SetSavingStatus(false)) - ); - - @Effect() - restoreVersionError$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_ERROR), - map(() => new SetSavingStatus(false)) - ); - - @Effect({ dispatch: false }) - restoreVersionCancel$ = this.actions$.pipe( - ofType(RestoreActionTypes.CANCEL_RESTORE), - withLatestFrom( - this.store.select(getConfigurationModelId), - this.store.select(getConfigurationModelKind) - ), - switchMap(([action, id, kind]) => - this.router.navigate(['/', 'metadata', kind, id, 'configuration', 'history']) - ) - ); - - @Effect() - restoreVersionSuccessNotification$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map((data) => - new AddNotification(new Notification( - NotificationType.Success, - `Version Restored!`, - 5000 - )) - ) - ); - - @Effect({dispatch: false}) - restoreVersionSuccessRedirect$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - switchMap((data) => - this.router.navigate(['/metadata', data.type, data.id, 'configuration', 'options']) - ) - ); - - @Effect() - restoreVersionSuccessClear$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map(({ id, type }) => - type === 'provider' ? new ClearProviderSelection() : new ClearResolverSelection() - ) - ); - - @Effect() - restoreVersionSuccessReload$ = this.actions$.pipe( - ofType(RestoreActionTypes.RESTORE_VERSION_SUCCESS), - map(action => action.payload), - map(({id, type}) => - new SetMetadata({ id, type }) - ) - ); - - @Effect() - updateRestorationChanges$ = this.actions$.pipe( - ofType(RestoreActionTypes.UPDATE_RESTORATION_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(getConfigurationDefinition), - this.store.select(getConfigurationModelKind), - this.store.select(getConfigurationModel) - ), - map(([changes, definition, kind, original]) => { - let parsed = definition.parser(changes); - if (kind === 'provider') { - parsed = { - ...parsed, - metadataFilters: [ - ...original.metadataFilters, - ...(parsed.metadataFilters || []) - ] - }; - } - return (parsed); - }), - map(changes => new UpdateRestorationChangesSuccess(changes)) - ); - - constructor( - private store: Store, - private historyService: MetadataHistoryService, - private actions$: Actions, - private router: Router - ) { } -} diff --git a/ui/src/app/metadata/configuration/effect/version.effect.ts b/ui/src/app/metadata/configuration/effect/version.effect.ts deleted file mode 100644 index e48a60cd1..000000000 --- a/ui/src/app/metadata/configuration/effect/version.effect.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; -import { map, catchError, switchMap } from 'rxjs/operators'; - -import { - VersionActionTypes, - SelectVersionRequest, - SelectVersionError, - SelectVersionSuccess -} from '../action/version.action'; -import { MetadataHistoryService } from '../service/history.service'; -import { of } from 'rxjs'; - - -@Injectable() -export class VersionEffects { - - @Effect() - selectVersionFromId$ = this.actions$.pipe( - ofType(VersionActionTypes.SELECT_VERSION_REQUEST), - map(action => action.payload), - switchMap(({ type, id, version }) => this.historyService.getVersion(id, type, version).pipe( - map(v => new SelectVersionSuccess(v)), - catchError(err => of(new SelectVersionError(err))) - )) - ); - - constructor( - private historyService: MetadataHistoryService, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/configuration/model/compare.ts b/ui/src/app/metadata/configuration/model/compare.ts deleted file mode 100644 index 28038806a..000000000 --- a/ui/src/app/metadata/configuration/model/compare.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Metadata } from '../../domain/domain.type'; -import { FilterVersion } from './version'; - -export interface FilterComparison { - modelId: string; - modelType: string; - models: FilterVersion[]; -} diff --git a/ui/src/app/metadata/configuration/model/history.ts b/ui/src/app/metadata/configuration/model/history.ts deleted file mode 100644 index 180502423..000000000 --- a/ui/src/app/metadata/configuration/model/history.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MetadataVersion, FilterVersion } from './version'; - -export interface MetadataHistory { - versions: MetadataVersion[]; -} diff --git a/ui/src/app/metadata/configuration/model/metadata-configuration.ts b/ui/src/app/metadata/configuration/model/metadata-configuration.ts deleted file mode 100644 index 57316cdde..000000000 --- a/ui/src/app/metadata/configuration/model/metadata-configuration.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Section } from './section'; -import { FilterVersion } from './version'; - -export interface MetadataConfiguration { - sections: Section[]; - dates: String[]; -} - -export interface FilterConfiguration { - dates: string[]; - filters: FilterVersion[][]; -} diff --git a/ui/src/app/metadata/configuration/model/request.ts b/ui/src/app/metadata/configuration/model/request.ts deleted file mode 100644 index 0e4e16bec..000000000 --- a/ui/src/app/metadata/configuration/model/request.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface VersionRequest { - type: string; - id: string; - version: string; -} diff --git a/ui/src/app/metadata/configuration/model/schema.ts b/ui/src/app/metadata/configuration/model/schema.ts deleted file mode 100644 index 469650111..000000000 --- a/ui/src/app/metadata/configuration/model/schema.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Schema { - [prop: string]: any; -} diff --git a/ui/src/app/metadata/configuration/model/section.ts b/ui/src/app/metadata/configuration/model/section.ts deleted file mode 100644 index 50c6a5492..000000000 --- a/ui/src/app/metadata/configuration/model/section.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface Section { - id: string; - index: number; - label: string; - pageNumber: number; - properties: SectionProperty[]; - differences?: boolean; -} - -export interface SectionProperty { - label: string; - type: string; - value: any[]; - differences?: boolean; - properties?: SectionProperty[]; - widget?: { - id: string; - data?: any[]; - [propertyName: string]: any; - }; -} diff --git a/ui/src/app/metadata/configuration/model/version.ts b/ui/src/app/metadata/configuration/model/version.ts deleted file mode 100644 index bba3c7ced..000000000 --- a/ui/src/app/metadata/configuration/model/version.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface MetadataVersion { - id: string; - date: string; - creator: string; -} - -export interface FilterVersion { - resourceId: string; - name: string; - type: string; - comparable: boolean; -} diff --git a/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts deleted file mode 100644 index 4423c6be9..000000000 --- a/ui/src/app/metadata/configuration/reducer/compare.reducer.spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { reducer } from './compare.reducer'; -import * as fromCompare from './compare.reducer'; -import { MetadataResolver } from '../../domain/model'; -import { SetMetadataVersions, ClearVersions } from '../action/compare.action'; - -describe('Comparison Reducer', () => { - const initialState: fromCompare.State = { ...fromCompare.initialState }; - const models: MetadataResolver[] = [{ - id: 'foo', - serviceProviderName: 'foo', - '@type': 'MetadataResolver', - createdBy: 'admin' - }]; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('set versions action', () => { - it('should add the models to the state', () => { - const action = new SetMetadataVersions(models); - const result = reducer(initialState, action); - expect(result.models).toEqual(models); - expect(result.loaded).toBe(true); - }); - }); - - describe('clear versions action', () => { - it('should remove the models from the state', () => { - const action = new ClearVersions(); - const result = reducer(initialState, action); - expect(result.models).toEqual([]); - expect(result.loaded).toBe(false); - }); - }); - - describe('selector functions', () => { - describe('getModel', () => { - it('should retrieve the model from state', () => { - expect(fromCompare.getVersionModels({ ...initialState, models })).toBe(models); - }); - }); - describe('getVersionModelsLoaded', () => { - it('should retrieve the loaded state', () => { - expect(fromCompare.getVersionModelsLoaded({ ...initialState, loaded: true })).toBe(true); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/compare.reducer.ts b/ui/src/app/metadata/configuration/reducer/compare.reducer.ts deleted file mode 100644 index ea0ef1598..000000000 --- a/ui/src/app/metadata/configuration/reducer/compare.reducer.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CompareActionTypes, CompareActionsUnion } from '../action/compare.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface State { - models: Metadata[]; - loaded: boolean; - loading: boolean; - compareChangedOnly: boolean; - filter: string; -} - -export const initialState: State = { - models: [], - loaded: false, - loading: false, - compareChangedOnly: false, - filter: null -}; - -export function reducer(state = initialState, action: CompareActionsUnion): State { - switch (action.type) { - case CompareActionTypes.SET_VIEW_CHANGED: - return { - ...state, - compareChangedOnly: action.payload - }; - case CompareActionTypes.COMPARE_METADATA_REQUEST: - return { - ...state, - loading: true - }; - case CompareActionTypes.COMPARE_METADATA_ERROR: - case CompareActionTypes.COMPARE_METADATA_SUCCESS: - return { - ...state, - loading: false - }; - case CompareActionTypes.SET_VERSIONS: - return { - ...state, - models: action.payload, - loaded: true - }; - case CompareActionTypes.CLEAR_VERSIONS: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getVersionModels = (state: State) => state.models; -export const getVersionModelsLoaded = (state: State) => state.loaded; -export const getComparisonLoading = (state: State) => state.loading; -export const getViewChangedOnly = (state: State) => state.compareChangedOnly; -export const getFilterId = (state: State) => state.filter; diff --git a/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts deleted file mode 100644 index 714da74b4..000000000 --- a/ui/src/app/metadata/configuration/reducer/configuration.reducer.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { reducer } from './configuration.reducer'; -import * as fromConfig from './configuration.reducer'; -import * as actions from '../action/configuration.action'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { SCHEMA as schema } from '../../../../testing/form-schema.stub'; -import { MetadataResolver } from '../../domain/model'; - -describe('Configuration Reducer', () => { - const initialState: fromConfig.State = { ...fromConfig.initialState }; - - const definition = new MetadataSourceEditor(); - const model: MetadataResolver = { - id: 'foo', - serviceProviderName: 'foo', - '@type': 'MetadataResolver', - createdBy: 'admin' - }; - const xml = ``; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('SET_DEFINITION action', () => { - it('should set the state definition', () => { - const action = new actions.SetConfigurationDefinition(definition); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, definition }); - }); - }); - - describe('SET_SCHEMA action', () => { - it('should set the state schema', () => { - const action = new actions.SetConfigurationSchema(schema); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, schema }); - }); - }); - - describe('SET_METADATA action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetMetadata({ id: model.id, type: 'resolver' }); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, modelId: model.id, modelType: 'resolver' }); - }); - }); - - describe('SET_XML action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetXml(xml); - const result = reducer(initialState, action); - - expect(result).toEqual({ ...initialState, xml }); - }); - }); - - describe('CLEAR action', () => { - it('should clear the state and reset to initial state', () => { - const action = new actions.ClearConfiguration(); - const result = reducer({ - ...initialState, - modelType: 'resolver', - modelId: model.id, - definition, - schema - }, action); - - expect(result).toEqual(initialState); - }); - }); - - describe('selector functions', () => { - /* - export const getModel = (state: State) => state.model; - export const getDefinition = (state: State) => state.definition; - export const getSchema = (state: State) => state.schema; - export const getXml = (state: State) => state.xml; - */ - describe('getModel', () => { - it('should retrieve the model from state', () => { - expect(fromConfig.getModelKind({...initialState, modelType: 'resolver'})).toBe('resolver'); - }); - }); - describe('getDefinition', () => { - it('should retrieve the definition from state', () => { - expect(fromConfig.getDefinition({ ...initialState, definition })).toBe(definition); - }); - }); - describe('getSchema', () => { - it('should retrieve the schema from state', () => { - expect(fromConfig.getSchema({ ...initialState, schema })).toBe(schema); - }); - }); - describe('getXml', () => { - it('should retrieve the schema from state', () => { - expect(fromConfig.getXml({ ...initialState, xml })).toBe(xml); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts b/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts deleted file mode 100644 index d1dc13129..000000000 --- a/ui/src/app/metadata/configuration/reducer/configuration.reducer.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { ConfigurationActionTypes, ConfigurationActionsUnion } from '../action/configuration.action'; -import { Metadata } from '../../domain/domain.type'; -import { Wizard } from '../../../wizard/model'; -import { Schema } from '../model/schema'; - -export interface State { - modelType: string; - modelId: string; - schema: Schema; - definition: Wizard; - xml: string; - loading: boolean; -} - -export const initialState: State = { - modelType: null, - modelId: null, - schema: null, - definition: null, - xml: '', - loading: false -}; - -export function reducer(state = initialState, action: ConfigurationActionsUnion): State { - switch (action.type) { - case ConfigurationActionTypes.SET_SCHEMA: - return { - ...state, - schema: action.payload - }; - case ConfigurationActionTypes.SET_DEFINITION: - return { - ...state, - definition: action.payload - }; - case ConfigurationActionTypes.SET_METADATA: - return { - ...state, - modelType: action.payload.type, - modelId: action.payload.id - }; - case ConfigurationActionTypes.SET_XML: - return { - ...state, - xml: action.payload - }; - case ConfigurationActionTypes.CLEAR: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getModelKind = (state: State) => state.modelType; -export const getModelId = (state: State) => state.modelId; -export const getDefinition = (state: State) => state.definition; -export const getSchema = (state: State) => state.schema; -export const getXml = (state: State) => state.xml; diff --git a/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts deleted file mode 100644 index ed9685cac..000000000 --- a/ui/src/app/metadata/configuration/reducer/filter.reducer.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { reducer } from './filter.reducer'; -import * as fromFilterCompare from './filter.reducer'; -import { - SetFilterComparisonSchema, - ClearFilterComparison, - SetFilterComparisonDefinition, - CompareFilterVersions -} from '../action/filter.action'; -import { NameIDFilterConfiguration } from '../../filter/model/nameid-configuration.filter'; -import { FilterVersion } from '../model/version'; - -describe('Filter Comparison Reducer', () => { - const initialState: fromFilterCompare.State = { ...fromFilterCompare.initialState }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('SET_SCHEMA action', () => { - it('should add the provided schema to the state', () => { - const schema = {type: 'object', properties: { foo: { type: 'string' } }}; - const action = new SetFilterComparisonSchema(schema); - const result = reducer(initialState, action); - expect(result.schema).toEqual(schema); - }); - }); - - describe('SET_DEFINITION action', () => { - it('should add the provided definition to the state', () => { - const definition = NameIDFilterConfiguration; - const action = new SetFilterComparisonDefinition(definition); - const result = reducer(initialState, action); - expect(result.definition).toEqual(definition); - }); - }); - - describe('COMPARE_FILTERS action', () => { - it('should add model information to the state', () => { - const request = { - modelId: 'foo', - modelType: 'EntityAttributesFilter', - models: [{}, {}] as FilterVersion[] - }; - const action = new CompareFilterVersions(request); - const result = reducer(initialState, action); - expect(result.modelId).toEqual(request.modelId); - expect(result.modelType).toEqual(request.modelType); - expect(result.models).toEqual(request.models); - }); - }); - - describe('CLEAR action', () => { - it('should reset to the initial state', () => { - const action = new ClearFilterComparison(); - const result = reducer(initialState, action); - expect(result).toEqual(initialState); - }); - }); - - describe('selector functions', () => { - describe('getModel', () => { - it('should retrieve the model from state', () => { - const models = [{}, {}] as FilterVersion[]; - expect(fromFilterCompare.getModelId({ ...initialState, modelId: 'foo' })).toBe('foo'); - expect(fromFilterCompare.getModelType({ ...initialState, modelType: 'foo' })).toBe('foo'); - expect(fromFilterCompare.getModels({ ...initialState, models })).toBe(models); - }); - }); - describe('getLoading', () => { - it('should retrieve the loading state', () => { - expect(fromFilterCompare.getLoading({ ...initialState, loading: true })).toBe(true); - }); - }); - - describe('getSchema', () => { - it('should retrieve the schema from state', () => { - const schema = {}; - expect(fromFilterCompare.getSchema({ ...initialState, schema })).toBe(schema); - }); - }); - - describe('getDefinition', () => { - it('should retrieve the definition from state', () => { - const definition = NameIDFilterConfiguration; - expect(fromFilterCompare.getDefinition({ ...initialState, definition })).toBe(NameIDFilterConfiguration); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/filter.reducer.ts b/ui/src/app/metadata/configuration/reducer/filter.reducer.ts deleted file mode 100644 index 445038ab8..000000000 --- a/ui/src/app/metadata/configuration/reducer/filter.reducer.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { FilterCompareActionTypes, FilterCompareActionsUnion } from '../action/filter.action'; -import { Metadata } from '../../domain/domain.type'; -import { FormDefinition } from '../../../wizard/model'; -import { Schema } from '../model/schema'; -import { FilterVersion } from '../model/version'; - -export interface State { - models: FilterVersion[]; - modelType: string; - modelId: string; - schema: Schema; - definition: FormDefinition; - loading: boolean; -} - -export const initialState: State = { - models: null, - modelType: null, - modelId: null, - schema: null, - definition: null, - loading: false -}; - -export function reducer(state = initialState, action: FilterCompareActionsUnion): State { - switch (action.type) { - case FilterCompareActionTypes.SET_SCHEMA: - return { - ...state, - schema: action.payload - }; - case FilterCompareActionTypes.SET_DEFINITION: - return { - ...state, - definition: action.payload - }; - case FilterCompareActionTypes.COMPARE_FILTERS: - return { - ...state, - ...action.payload - }; - case FilterCompareActionTypes.CLEAR: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getModels = (state: State) => state.models; -export const getModelType = (state: State) => state.modelType; -export const getModelId = (state: State) => state.modelId; -export const getDefinition = (state: State) => state.definition; -export const getSchema = (state: State) => state.schema; -export const getLoading = (state: State) => state.loading; diff --git a/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts deleted file mode 100644 index a3bc830e5..000000000 --- a/ui/src/app/metadata/configuration/reducer/history.reducer.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { reducer } from './history.reducer'; -import * as fromHistory from './history.reducer'; -import * as actions from '../action/history.action'; -import { MetadataHistory } from '../model/history'; - -describe('History Reducer', () => { - - const baseState = fromHistory.initialState; - - const history: MetadataHistory = { - versions: [ - { - id: '1', - date: new Date().toLocaleDateString(), - creator: 'foo' - }, - { - id: '2', - date: new Date().toDateString(), - creator: 'foo' - } - ] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(fromHistory.initialState); - }); - }); - - describe('SET_HISTORY action', () => { - it('should set the state metadata model', () => { - const action = new actions.SetHistory(history); - const result = reducer(fromHistory.initialState, action); - - expect(Object.keys(result.entities)).toEqual(['1', '2']); - }); - }); - - describe('SELECT_VERSION action', () => { - it('should set the state metadata model', () => { - const action = new actions.SelectVersion('1'); - const result = reducer(baseState, action); - - expect(result).toEqual({ ...baseState, selectedVersionId: '1' }); - }); - }); - - describe('CLEAR action', () => { - it('should clear the state and reset to initial state', () => { - const action = new actions.ClearHistory(); - const result = reducer({ - ...baseState, - ...history - }, action); - - expect(result).toEqual(baseState); - }); - }); - - describe('selector functions', () => { - describe('getSelectedId', () => { - it('should return the selected version id', () => { - expect(fromHistory.getSelectedVersionId({ ...baseState, selectedVersionId: '1' })).toBe('1'); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/history.reducer.ts b/ui/src/app/metadata/configuration/reducer/history.reducer.ts deleted file mode 100644 index 6fcc154f7..000000000 --- a/ui/src/app/metadata/configuration/reducer/history.reducer.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { HistoryActionTypes, HistoryActionsUnion } from '../action/history.action'; -import { MetadataVersion } from '../model/version'; - -export interface HistoryState extends EntityState { - selectedVersionId: string; - loading: boolean; -} - -export function sortByDate(a: MetadataVersion, b: MetadataVersion): number { - return a.date.localeCompare(b.date); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataVersion) => model.id -}); - -export const initialState: HistoryState = adapter.getInitialState({ - selectedVersionId: null, - loading: false -}); - -export function reducer(state = initialState, action: HistoryActionsUnion): HistoryState { - switch (action.type) { - case HistoryActionTypes.LOAD_HISTORY_REQUEST: - return { - ...state, - loading: true - }; - case HistoryActionTypes.LOAD_HISTORY_ERROR: - case HistoryActionTypes.LOAD_HISTORY_SUCCESS: - return { - ...state, - loading: false - }; - case HistoryActionTypes.SET_HISTORY: - return adapter.addAll(action.payload.versions, { - ...state, - selectedVersionId: state.selectedVersionId - }); - case HistoryActionTypes.SELECT_VERSION: - return { - ...state, - selectedVersionId: action.payload - }; - case HistoryActionTypes.CLEAR_HISTORY: - return adapter.removeAll({ - ...initialState - }); - default: { - return state; - } - } -} - -export const getSelectedVersionId = (state: HistoryState) => state.selectedVersionId; -export const { - selectIds: selectVersionIds, - selectEntities: selectVersionEntities, - selectAll: selectAllVersions, - selectTotal: selectVersionTotal -} = adapter.getSelectors(); - -export const getHistoryLoading = (state: HistoryState) => state.loading; diff --git a/ui/src/app/metadata/configuration/reducer/index.spec.ts b/ui/src/app/metadata/configuration/reducer/index.spec.ts deleted file mode 100644 index d9dff5a83..000000000 --- a/ui/src/app/metadata/configuration/reducer/index.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - getConfigurationModelNameFn, - getConfigurationModelEnabledFn, - getConfigurationModelTypeFn, - getSelectedVersionNumberFn, - getSelectedIsCurrentFn -} from './index'; - -import { Metadata } from '../../domain/domain.type'; - -describe('Configuration Reducer', () => { - - describe('getConfigurationModelNameFn function', () => { - it('should return the name attribute', () => { - expect(getConfigurationModelNameFn({ serviceProviderName: 'foo' } as Metadata)).toBe('foo'); - expect(getConfigurationModelNameFn({ name: 'bar' } as Metadata)).toBe('bar'); - expect(getConfigurationModelNameFn(null)).toBe(''); - }); - }); - - describe('getConfigurationModelEnabledFn function', () => { - it('should return the enabled attribute', () => { - expect(getConfigurationModelEnabledFn({ serviceEnabled: true } as Metadata)).toBe(true); - expect(getConfigurationModelEnabledFn({ enabled: true } as Metadata)).toBe(true); - expect(getConfigurationModelEnabledFn(null)).toBe(false); - }); - }); - - describe('getConfigurationModelTypeFn function ', () => { - it('should return provider type if the object has an @type property', () => { - const md = { '@type': 'FilebackedHttpMetadataResolver' } as Metadata; - expect(getConfigurationModelTypeFn(md)).toBe('FilebackedHttpMetadataResolver'); - }); - it('should return resolver if no type is detected', () => { - const md = { serviceEnabled: true } as Metadata; - expect(getConfigurationModelTypeFn(md)).toBe('resolver'); - }); - }); - - describe('getSelectedVersionNumberFn function ', () => { - it('should return the selected version by id', () => { - const versions = [ { id: 'foo' }, { id: 'bar' } ]; - const id = 'foo'; - expect(getSelectedVersionNumberFn(versions, id)).toBe(1); - }); - }); - - describe('getSelectedIsCurrentFn function ', () => { - it('should return a boolean of whether the selected version is the most current version', () => { - const versions = [{ id: 'foo' }, { id: 'bar' }]; - const id = 'foo'; - expect(getSelectedIsCurrentFn(versions[0], versions)).toBe(true); - expect(getSelectedIsCurrentFn(versions[1], versions)).toBe(false); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/index.ts b/ui/src/app/metadata/configuration/reducer/index.ts deleted file mode 100644 index 07224ddfc..000000000 --- a/ui/src/app/metadata/configuration/reducer/index.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; - -import * as fromRoot from '../../../app.reducer'; -import * as fromConfiguration from './configuration.reducer'; -import * as fromHistory from './history.reducer'; -import * as fromCompare from './compare.reducer'; -import * as fromVersion from './version.reducer'; -import * as fromRestore from './restore.reducer'; -import * as fromFilter from './filter.reducer'; - -import { getConfigurationSectionsFn, getLimitedPropertiesFn } from './utilities'; -import { getModel } from '../../../wizard/reducer'; -import { getInCollectionFn } from '../../domain/domain.util'; -import { Metadata } from '../../domain/domain.type'; - -import * as fromResolver from '../../resolver/reducer'; -import * as fromProvider from '../../provider/reducer'; - -export interface ConfigurationState { - configuration: fromConfiguration.State; - history: fromHistory.HistoryState; - compare: fromCompare.State; - version: fromVersion.State; - restore: fromRestore.RestoreState; - filter: fromFilter.State; -} - -export const reducers = { - configuration: fromConfiguration.reducer, - history: fromHistory.reducer, - compare: fromCompare.reducer, - version: fromVersion.reducer, - restore: fromRestore.reducer, - filter: fromFilter.reducer -}; - -export interface State extends fromRoot.State { - 'metadata-configuration': ConfigurationState; -} - -export const getState = createFeatureSelector('metadata-configuration'); - -export const getConfigurationStateFn = (state: ConfigurationState) => state.configuration; -export const getHistoryStateFn = (state: ConfigurationState) => state.history; -export const getCompareStateFn = (state: ConfigurationState) => state.compare; -export const getVersionStateFn = (state: ConfigurationState) => state.version; -export const getRestoreStateFn = (state: ConfigurationState) => state.restore; -export const getFilterStateFn = (state: ConfigurationState) => state.filter; - -export const getConfigurationState = createSelector(getState, getConfigurationStateFn); -export const getConfigurationModelKind = createSelector(getConfigurationState, fromConfiguration.getModelKind); -export const getConfigurationModelId = createSelector(getConfigurationState, fromConfiguration.getModelId); - -export const getConfigurationDefinition = createSelector(getConfigurationState, fromConfiguration.getDefinition); -export const getSchema = createSelector(getConfigurationState, fromConfiguration.getSchema); -export const getConfigurationXml = createSelector(getConfigurationState, fromConfiguration.getXml); - -export const processSchemaFn = (definition, schema) => { - return definition && schema ? - definition.schemaPreprocessor ? - definition.schemaPreprocessor(schema) : schema - : schema; -}; - -export const getConfigurationSchema = createSelector(getConfigurationDefinition, getSchema, processSchemaFn); -export const getConfigurationModelEnabledFn = - (config: Metadata) => config ? ('serviceEnabled' in config) ? config.serviceEnabled : config.enabled : false; - -export const getConfigurationModelNameFn = - (config: Metadata) => config ? ('serviceProviderName' in config) ? config.serviceProviderName : config.name : ''; - -export const getConfigurationModelTypeFn = - (config: Metadata) => config ? ('@type' in config) ? config['@type'] : 'resolver' : null; - -export const filterPluginTypes = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; -export const isAdditionalFilter = (type) => filterPluginTypes.indexOf(type) === -1; - -export const getVersionModelFiltersFn = - (model, kind) => kind === 'provider' ? - model.metadataFilters ? model.metadataFilters.filter(filter => isAdditionalFilter(filter['@type'])) : - [] : null; - -export const getVersionModelFilterPluginsFn = (model, kind) => { - const filters = kind === 'provider' ? - model.metadataFilters ? model.metadataFilters.filter(filter => filterPluginTypes.indexOf(filter['@type']) > -1) : - [] : null; - return filters; -}; - -// Version History - -export const getHistoryState = createSelector(getState, getHistoryStateFn); - -export const getHistoryLoading = createSelector(getHistoryState, fromHistory.getHistoryLoading); -export const getVersionEntities = createSelector(getHistoryState, fromHistory.selectVersionEntities); -export const getSelectedVersionId = createSelector(getHistoryState, fromHistory.getSelectedVersionId); -export const getVersionIds = createSelector(getHistoryState, fromHistory.selectVersionIds); -export const getVersionCollection = createSelector(getHistoryState, getVersionIds, fromHistory.selectAllVersions); -export const getSelectedVersion = createSelector(getVersionEntities, getSelectedVersionId, getInCollectionFn); -export const getSelectedVersionNumberFn = (versions, selectedId) => versions.indexOf(versions.find(v => v.id === selectedId)) + 1; -export const getSelectedVersionNumber = createSelector( - getVersionCollection, - getSelectedVersionId, - getSelectedVersionNumberFn -); - -export const getSelectedIsCurrentFn = (selected, collection) => { - return selected ? collection[0].id === selected.id : false; -}; - -export const getSelectedIsCurrent = createSelector( - getSelectedVersion, - getVersionCollection, - getSelectedIsCurrentFn -); - - -// Version Comparison - -export const getCompareState = createSelector(getState, getCompareStateFn); -export const getComparisonLoading = createSelector(getCompareState, fromCompare.getComparisonLoading); -export const getComparisonModels = createSelector(getCompareState, fromCompare.getVersionModels); -export const getComparisonModelsLoaded = createSelector(getCompareState, fromCompare.getVersionModelsLoaded); -export const getComparisonFilterId = createSelector(getCompareState, fromCompare.getFilterId); - -export const getComparisonModelsFilteredFn = (models) => models.map((model) => { - return ({ - ...model, - metadataFilters: getVersionModelFilterPluginsFn( - model, - model.hasOwnProperty('@type') ? model.hasOwnProperty('metadataFilters') ? 'provider' : 'filter' : 'resolver' - ) - }); -}); - -export const getComparisonModelsFiltered = createSelector(getComparisonModels, getComparisonModelsFilteredFn); - -export const getComparisonConfigurations = createSelector( - getComparisonModelsFiltered, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getComparisonConfigurationCount = createSelector(getComparisonConfigurations, (config) => config ? config.dates.length : 0); - -export const getViewChangedOnly = createSelector(getCompareState, fromCompare.getViewChangedOnly); - -export const getLimitedConfigurationsFn = (configurations, limited) => { - return configurations ? ({ - ...configurations, - sections: limited ? configurations.sections : - configurations.sections.map(s => ({ - ...s, - properties: getLimitedPropertiesFn(s.properties), - })) - }) : configurations; -}; - -export const getLimitedComparisonConfigurations = createSelector( - getComparisonConfigurations, - getViewChangedOnly, - getLimitedConfigurationsFn -); - -export const getComparisonFilterListFn = (models) => models.map(m => getVersionModelFiltersFn(m, 'provider')); -export const getComparisonFilterList = createSelector(getComparisonModels, getComparisonFilterListFn); - -export const getComparisonDatesFn = (config) => config.map(m => m ? m.modifiedDate : null); -export const getComparisonDates = createSelector(getComparisonModels, getComparisonDatesFn); - -export const getComparisonFilterOrderedFn = (list) => - list.map(models => - models.map(filter => - ({ - ...filter, - comparable: list - .reduce((acc, v) => acc.concat(v), []) - .map(v => v.resourceId) - .some((id, index, coll) => { - return coll.indexOf(filter.resourceId) !== coll.lastIndexOf(filter.resourceId); - }) - }) -)); - -export const getComparisonFilterOrdered = createSelector(getComparisonFilterList, getComparisonFilterOrderedFn); - -export const getComparisonFilterConfiguration = createSelector( - getComparisonFilterOrdered, - getComparisonDates, - (filters, dates) => { - const rows = filters.reduce((num, version) => version.length > num ? version.length : num, 0); - const range = [...Array(rows).keys()]; - return { - dates, - filters: range.reduce((collection, index) => { - const val = filters.map(version => version[index]); - collection[index] = val; - return collection; - }, []) - }; - } -); - -export const getComparisonSelectedFilters = createSelector( - getComparisonModels, - getComparisonDates, - getComparisonFilterId, - (models, dates, id) => ({ - dates, - sections: [] - }) -); - -// Version Restoration - -export const getRestoreState = createSelector(getState, getRestoreStateFn); -export const getVersionState = createSelector(getState, getVersionStateFn); -export const getVersionLoading = createSelector(getVersionState, fromVersion.isVersionLoading); - -export const getVersionModel = createSelector(getVersionState, fromVersion.getVersionModel); -export const getVersionModels = createSelector(getVersionModel, (model) => model ? [model] : null); -export const getVersionConfigurationSections = createSelector( - getVersionModels, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getVersionModelFilters = createSelector( - getVersionModel, - getConfigurationModelKind, - getVersionModelFiltersFn -); - -export const getRestorationIsValid = createSelector(getRestoreState, fromRestore.isRestorationValid); -export const getRestorationIsSaved = createSelector(getRestoreState, fromRestore.isRestorationSaved); -export const getRestorationChanges = createSelector(getRestoreState, fromRestore.getChanges); -export const getRestorationIsSaving = createSelector(getRestoreState, fromRestore.isRestorationSaving); -export const getRestorationFormStatus = createSelector(getRestoreState, fromRestore.getFormStatus); -export const getInvalidRestorationForms = createSelector(getRestoreState, fromRestore.getInvalidRestorationForms); - -export const getFormattedModel = createSelector( - getVersionModel, - getConfigurationDefinition, - (model, definition) => definition ? definition.formatter(model) : null -); - -export const getFormattedChanges = createSelector( - getRestorationChanges, - getConfigurationDefinition, - (model, definition) => definition ? definition.formatter(model) : null -); - -export const getFormattedModelWithChanges = createSelector( - getVersionModel, - getRestorationChanges, - getConfigurationDefinition, - (model, changes, definition) => definition ? definition.formatter({ - ...model, - ...changes - }) : null -); - -export const getRestorationModel = createSelector( - getVersionModel, - getRestorationChanges, - getModel, - (model, changes, empty) => ({ - ...model, - ...empty, - ...changes - }) -); - -// Filter Comparison State - -export const getFilterState = createSelector(getState, getFilterStateFn); -export const getFilterComparisonDefinition = createSelector(getFilterState, fromFilter.getDefinition); -export const getFilterComparisonSchema = createSelector(getFilterState, fromFilter.getSchema); -export const getFilterComparisonModels = createSelector(getFilterState, fromFilter.getModels); -export const getFilterComparisonConfigurations = createSelector( - getFilterComparisonModels, - getFilterComparisonDefinition, - getFilterComparisonSchema, - getConfigurationSectionsFn -); - -export const getLimitedFilterComparisonConfiguration = createSelector( - getFilterComparisonConfigurations, - getViewChangedOnly, - getLimitedConfigurationsFn -); - -// Mixed states - -export const getConfigurationModelFn = (kind, version, provider, resolver) => { - return (kind === 'provider') ? provider : resolver; -}; - -export const getConfigurationModel = createSelector( - getConfigurationModelKind, - getSelectedVersionId, - fromProvider.getSelectedProvider, - fromResolver.getSelectedResolver, - getConfigurationModelFn -); -export const getConfigurationModelList = createSelector(getConfigurationModel, (model) => [model]); - -export const getConfigurationSections = createSelector( - getConfigurationModelList, - getConfigurationDefinition, - getConfigurationSchema, - getConfigurationSectionsFn -); - -export const getConfigurationModelEnabled = createSelector(getConfigurationModel, getConfigurationModelEnabledFn); -export const getConfigurationModelName = createSelector(getConfigurationModel, getConfigurationModelNameFn); -export const getConfigurationModelType = createSelector(getConfigurationModel, getConfigurationModelTypeFn); - -export const getConfigurationHasXml = createSelector(getConfigurationXml, xml => !!xml); -export const getConfigurationFilters = createSelector(getConfigurationModel, model => model.metadataFilters); -export const getConfigurationVersionDate = createSelector(getVersionModel, version => version && version.modifiedDate); diff --git a/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts deleted file mode 100644 index 97795549b..000000000 --- a/ui/src/app/metadata/configuration/reducer/restore.reducer.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { reducer } from './restore.reducer'; -import * as fromRestore from './restore.reducer'; -import { - RestoreActionTypes, - RestoreActionsUnion, - UpdateRestorationChangesSuccess, - SetSavingStatus, - UpdateRestoreFormStatus -} from '../action/restore.action'; -import { Metadata } from '../../domain/domain.type'; - -describe('Restore Reducer', () => { - - const baseState = fromRestore.initialState; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(fromRestore.initialState); - }); - }); - - describe(`${RestoreActionTypes.UPDATE_RESTORATION_SUCCESS} action`, () => { - it('should set the state metadata model', () => { - const serviceEnabled = true; - const action = new UpdateRestorationChangesSuccess({ serviceEnabled }); - const result = reducer(fromRestore.initialState, action); - - expect(result.changes).toEqual({serviceEnabled} as Metadata); - }); - }); - - describe(`${RestoreActionTypes.SET_SAVING_STATUS} action`, () => { - it('should set the state saving status', () => { - const action = new SetSavingStatus(true); - const result = reducer(fromRestore.initialState, action); - - expect(result.saving).toBe(true); - }); - }); - - describe(`${RestoreActionTypes.UPDATE_STATUS} action`, () => { - it('should set the state saving status', () => { - const action = new UpdateRestoreFormStatus({foo: 'INVALID'}); - const result = reducer(fromRestore.initialState, action); - - expect(result.status.foo).toBe('INVALID'); - }); - }); - - describe('selector function', () => { - describe('getChanges', () => { - it('should return the selected version id', () => { - expect(fromRestore.getChanges({ ...baseState, changes: { serviceEnabled: false } })).toEqual({ serviceEnabled: false }); - }); - }); - - describe('isRestorationSaved', () => { - it('should return false if there are outstanding changes', () => { - expect(fromRestore.isRestorationSaved({ ...baseState, changes: { name: 'too' } })).toBe(false); - }); - - it('should return true if there are no outstanding changes', () => { - expect(fromRestore.isRestorationSaved({ ...baseState, changes: {} })).toBe(true); - }); - }); - - describe('getFormStatus', () => { - it('should return the current form status', () => { - expect(fromRestore.getFormStatus({ ...baseState, status: { common: 'INVALID' } })).toEqual({ common: 'INVALID' }); - }); - }); - - describe('isRestorationSaving', () => { - it('should return the saving status', () => { - expect(fromRestore.isRestorationSaving({ ...baseState })).toBe(false); - expect(fromRestore.isRestorationSaving({ ...baseState, saving: true })).toBe(true); - }); - }); - - describe('isRestorationValid', () => { - it('should return false if any forms have an invalid status', () => { - expect(fromRestore.isRestorationValid({ ...baseState, status: { common: 'INVALID' } })).toBe(false); - }); - - it('should return true if all forms have a valid status', () => { - expect(fromRestore.isRestorationValid({ ...baseState, status: { common: 'VALID' } })).toBe(true); - }); - }); - - describe('getInvalidRestorationForms', () => { - it('should return the form names that are invalid', () => { - expect(fromRestore.getInvalidRestorationForms({ ...baseState, status: { common: 'INVALID' } })).toEqual(['common']); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/restore.reducer.ts b/ui/src/app/metadata/configuration/reducer/restore.reducer.ts deleted file mode 100644 index e0c58c2b7..000000000 --- a/ui/src/app/metadata/configuration/reducer/restore.reducer.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Metadata } from '../../domain/domain.type'; -import { RestoreActionTypes, RestoreActionsUnion } from '../action/restore.action'; - -export interface RestoreState { - saving: boolean; - status: { [key: string]: string }; - changes: Partial; -} - -export const initialState: RestoreState = { - saving: false, - status: {}, - changes: {} as Metadata -}; - -export function reducer(state = initialState, action: RestoreActionsUnion): RestoreState { - switch (action.type) { - case RestoreActionTypes.UPDATE_RESTORATION_SUCCESS: - return { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - case RestoreActionTypes.SET_SAVING_STATUS: - return { - ...state, - saving: action.payload - }; - case RestoreActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - -export const isRestorationSaved = (state: RestoreState) => !Object.keys(state.changes).length; -export const getChanges = (state: RestoreState) => state.changes; -export const isRestorationSaving = (state: RestoreState) => state.saving; -export const getFormStatus = (state: RestoreState) => state.status; - -export const isRestorationValid = (state: RestoreState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getInvalidRestorationForms = (state: RestoreState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/configuration/reducer/utilities.spec.ts b/ui/src/app/metadata/configuration/reducer/utilities.spec.ts deleted file mode 100644 index 0d8234bb5..000000000 --- a/ui/src/app/metadata/configuration/reducer/utilities.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { - getConfigurationSectionsFn, - getLimitedPropertiesFn, - assignValueToProperties -} from './utilities'; - -import { SCHEMA as schema } from '../../../../testing/form-schema.stub'; -import { MockMetadataWizard } from '../../../../testing/mockMetadataWizard'; - -describe('config reducer utilities', () => { - - const model = { - name: 'foo', - serviceEnabled: true, - foo: { - bar: 'bar', - baz: 'baz' - }, - list: [ - 'super', - 'cool' - ] - }; - - const props = [ - { - id: 'name', - items: null, - name: 'label.metadata-provider-name-dashboard-display-only', - properties: [], - type: 'string', - value: null, - widget: { id: 'string', help: 'message.must-be-unique' } - }, - { - id: 'serviceEnabled', - items: null, - name: 'serviceEnabled', - properties: [], - type: 'string', - value: null, - widget: { id: 'select', disabled: true } - }, - { - id: 'foo', - items: null, - name: 'foo', - type: 'object', - properties: [ - { - id: 'bar', - name: 'bar', - type: 'string', - properties: [] - }, - { - id: 'baz', - name: 'baz', - type: 'string', - properties: [] - } - ] - }, - { - id: 'list', - name: 'list', - type: 'array', - items: { - type: 'string' - }, - widget: { - id: 'datalist', - data: [ - { key: 'super', label: 'super' }, - { key: 'cool', label: 'cool' }, - { key: 'notcool', label: 'notcool' } - ] - } - } - ]; - - const definition = MockMetadataWizard; - - describe('assignValueToProperties function', () => { - it('should assign appropriate values to the given schema properties', () => { - const assigned = assignValueToProperties([model], props, definition); - expect(assigned[0].value).toEqual(['foo']); - expect(assigned[1].value).toEqual([true]); - }); - - it('should assign differences when passed multiple models', () => { - const assigned = assignValueToProperties([model, { - ...model, - name: 'bar', - list: [ - 'super', - 'notcool' - ] - }], props, definition); - expect(assigned[0].differences).toBe(true); - }); - }); - - describe('getLimitedPropertiesFn function', () => { - it('should filter properties without differences', () => { - const assigned = assignValueToProperties([model, { - ...model, - name: 'bar' - }], props, definition); - expect(getLimitedPropertiesFn(assigned).length).toBe(1); - }); - }); - - describe('getConfigurationSectionsFn', () => { - it('should parse the schema, definition, and model into a MetadataConfiguration', () => { - const config = getConfigurationSectionsFn([model], definition, schema); - expect(config.sections).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/utilities.ts b/ui/src/app/metadata/configuration/reducer/utilities.ts deleted file mode 100644 index 1cba47fbd..000000000 --- a/ui/src/app/metadata/configuration/reducer/utilities.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { MetadataConfiguration } from '../model/metadata-configuration'; -import { WizardStep } from '../../../wizard/model'; -import * as utils from '../../domain/utility/configuration'; -import { getSplitSchema } from '../../../wizard/reducer'; -import { SectionProperty } from '../model/section'; - -function omit(key, obj) { - if (!obj) { - return obj; - } - const { [key]: omitted, ...rest } = obj; - return rest; -} - -export const rollupDifferences = (prop) => { - let updates = { - ...prop - }; - - if (prop.properties) { - updates = { - ...updates, - properties: [ - ...prop.properties.map(p => rollupDifferences(p)) - ] - }; - } - - prop.differences = prop.properties.some(p => p.differences); - - return updates; -}; - -export const getConfigurationSectionsFn = (models, definition, schema): MetadataConfiguration => { - return !definition || !schema || !models ? null : - ({ - dates: models.map(m => m ? m.modifiedDate : null), - sections: definition.steps - .filter(step => step.id !== 'summary') - .map( - (step: WizardStep, num: number) => { - return ({ - id: step.id, - pageNumber: num + 1, - index: step.index, - label: step.label, - properties: utils.getStepProperties( - getSplitSchema(schema, step), - definition.formatter({}), - schema.definitions || {} - ) - }); - } - ) - .map((section: any) => { - return { - ...section, - properties: assignValueToProperties(models, section.properties, definition) - }; - }) - .map((section: any) => ({ - ...section, - differences: section.properties.some(prop => prop.differences) - })) - }); -}; - -const getDifferences = (models, prop) => { - return models.some((model, index, array) => { - if (!array) { - return false; - } - const prop1 = omit('modifiedDate', model[prop.id]); - const prop2 = omit('modifiedDate', array[0][prop.id]); - return JSON.stringify(prop1) !== JSON.stringify(prop2); - }); -}; - -export const assignValueToProperties = (models, properties, definition: any): any[] => { - return properties.map(prop => { - const differences = getDifferences(models, prop); - - const widget = prop.type === 'array' && prop.widget && prop.widget.data ? ({ - ...prop.widget, - data: prop.widget.data.map(item => ({ - ...item, - differences: models - .map((model) => { - const value = model[prop.id]; - return value ? value.indexOf(item.key) > -1 : false; - }) - .reduce((current, val) => current !== val ? true : false, false) - })) - }) : null; - - switch (prop.type) { - case 'object': - return { - ...prop, - properties: assignValueToProperties( - models.map(model => definition.formatter(model)[prop.id] || {}), - prop.properties, - definition - ), - differences: getDifferences(models, prop) - }; - default: - return { - ...prop, - differences, - value: models.map(model => { - return model[prop.id]; - }), - widget - }; - } - }); -}; - -export const getLimitedPropertiesFn = (properties: SectionProperty[]) => { - return ([ - ...properties - .filter(p => p.differences) - .map(p => { - const parsed = { ...p }; - if (p.widget && p.widget.data) { - parsed.widget = { - ...p.widget, - data: p.widget.data.filter(item => item.differences) - }; - } - if (p.properties) { - parsed.properties = getLimitedPropertiesFn(p.properties); - } - return parsed; - }) - ]); -}; diff --git a/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts b/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts deleted file mode 100644 index a564df384..000000000 --- a/ui/src/app/metadata/configuration/reducer/version.reducer.spec.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - reducer, - getVersionModel, - getVersionModelLoaded, - getSelectedMetadataId, - getSelectedVersionId, - getSelectedVersionType -} from './version.reducer'; -import * as fromVersion from './version.reducer'; -import { - VersionActionTypes, - SelectVersionRequest, - ClearVersion, - SelectVersionSuccess -} from '../action/version.action'; -import { Metadata } from '../../domain/domain.type'; -import { VersionRequest } from '../model/request'; - -describe('Restore Reducer', () => { - - let baseState; - - const req: VersionRequest = { - type: 'provider', - version: 'foo', - id: 'bar' - }; - - const model: Metadata = { - id: 'bar', - name: 'foo', - '@type': 'MetadataProvider', - type: 'provider', - resourceId: 'foo', - createdBy: 'bar' - }; - - beforeEach(() => { - baseState = { ...fromVersion.initialState }; - }); - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(baseState); - }); - }); - - describe(`${VersionActionTypes.SELECT_VERSION_REQUEST} action`, () => { - it('should set the needed metadata properties', () => { - const action = new SelectVersionRequest(req); - const result = reducer(baseState, action); - - expect(result.selectedMetadataId).toEqual(req.id); - }); - }); - - describe(`${VersionActionTypes.SELECT_VERSION_SUCCESS} action`, () => { - it('should set the needed metadata properties', () => { - const action = new SelectVersionSuccess(model as Metadata); - const result = reducer(baseState, action); - - expect(result).toEqual({ ...baseState, model, loaded: true }); - }); - }); - - describe(`${VersionActionTypes.CLEAR_VERSION} action`, () => { - it('should set the needed metadata properties', () => { - const action = new ClearVersion(); - const result = reducer(baseState, action); - - expect(result).toEqual(baseState); - }); - }); - - describe('selector function', () => { - describe('getSelectedMetadataId', () => { - it('should return the selected version id', () => { - expect(getVersionModel({ ...baseState, model })).toEqual(model); - }); - }); - - describe('getSelectedMetadataVersion', () => { - it('should return the selected version id', () => { - expect(getVersionModelLoaded({ ...baseState, loaded: true })).toBe(true); - }); - }); - - describe('getSelectedMetadataId', () => { - it('should return the selected resource id', () => { - expect(getSelectedMetadataId({ ...baseState, selectedMetadataId: req.id})).toEqual(req.id); - }); - }); - - describe('getSelectedMetadataType', () => { - it('should return the selected version type', () => { - expect(getSelectedVersionType({ ...baseState, selectedVersionType: req.type })).toEqual(req.type); - }); - }); - - describe('getSelectedMetadataType', () => { - it('should return the selected version id', () => { - expect(getSelectedVersionId({ ...baseState, selectedVersionId: req.version })).toEqual(req.version); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/configuration/reducer/version.reducer.ts b/ui/src/app/metadata/configuration/reducer/version.reducer.ts deleted file mode 100644 index caaf1f085..000000000 --- a/ui/src/app/metadata/configuration/reducer/version.reducer.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { VersionActionTypes, VersionActionsUnion } from '../action/version.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface State { - model: Metadata; - selectedVersionId: string; - selectedVersionType: string; - selectedMetadataId: string; - loaded: boolean; - loading: boolean; -} - -export const initialState: State = { - model: null, - selectedVersionId: null, - selectedMetadataId: null, - selectedVersionType: null, - loaded: false, - loading: false -}; - -export function reducer(state = initialState, action: VersionActionsUnion): State { - switch (action.type) { - case VersionActionTypes.SELECT_VERSION_REQUEST: - return { - ...state, - selectedMetadataId: action.payload.id, - selectedVersionId: action.payload.version, - selectedVersionType: action.payload.type, - loading: true - }; - case VersionActionTypes.SELECT_VERSION_SUCCESS: - return { - ...state, - model: action.payload, - loaded: true, - loading: false - }; - case VersionActionTypes.SELECT_VERSION_ERROR: - return { - ...state, - model: null, - loaded: false, - loading: false - }; - case VersionActionTypes.CLEAR_VERSION: - return { - ...initialState - }; - default: { - return state; - } - } -} - -export const getVersionModel = (state: State) => state.model; -export const getVersionModelLoaded = (state: State) => state.loaded; -export const isVersionLoading = (state: State) => state.loading; - -export const getSelectedMetadataId = (state: State) => state.selectedMetadataId; -export const getSelectedVersionId = (state: State) => state.selectedVersionId; -export const getSelectedVersionType = (state: State) => state.selectedVersionType; diff --git a/ui/src/app/metadata/configuration/service/configuration.service.spec.ts b/ui/src/app/metadata/configuration/service/configuration.service.spec.ts deleted file mode 100644 index e02d9bd80..000000000 --- a/ui/src/app/metadata/configuration/service/configuration.service.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { MetadataConfigurationService } from './configuration.service'; -import { FileBackedHttpMetadataProviderEditor } from '../../provider/model'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { of } from 'rxjs'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { Metadata } from '../../domain/domain.type'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getConfigurationSectionsFn } from '../reducer/utilities'; - -describe(`Configuration Service`, () => { - - let resolverService: any; - let providerService: any; - - let mockService = { - find: () => of([]) - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataConfigurationService, - { - provide: ResolverService, - useValue: mockService - }, - { - provide: MetadataProviderService, - useValue: mockService - } - ] - }); - - resolverService = TestBed.get(ResolverService); - providerService = TestBed.get(MetadataProviderService); - - }); - - describe('find method', () => { - it(`should call the resolver service when type is resolver`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(resolverService, 'find').and.callThrough(); - const type = 'resolver'; - const id = 'foo'; - service.find(id, type).subscribe(); - expect(resolverService.find).toHaveBeenCalledWith(id); - } - ))); - it(`should call the provider service when type is resolver`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(providerService, 'find').and.callThrough(); - const type = 'provider'; - const id = 'foo'; - service.find(id, type).subscribe(); - expect(providerService.find).toHaveBeenCalledWith(id); - } - ))); - it(`should throw an error when a type is not found`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - spyOn(providerService, 'find').and.callThrough(); - const type = 'bar'; - const id = 'foo'; - service.find(id, type).subscribe(null, (err) => { - expect(err).toEqual(new Error('Type not supported')); - }); - } - ))); - }); - - describe('loadSchema method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - const path = '/foo.json'; - service.loadSchema(path).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${path}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - }); - - describe('getDefinition method', () => { - it(`should retrieve the editor definition by model type`, waitForAsync(inject([MetadataConfigurationService, HttpTestingController], - (service: MetadataConfigurationService, backend: HttpTestingController) => { - const def = service.getDefinition('FileBackedHttpMetadataResolver'); - expect(def).toBe(FileBackedHttpMetadataProviderEditor); - } - ))); - - it(`should instantiate an editor for resolvers`, waitForAsync(inject([MetadataConfigurationService], - (service: MetadataConfigurationService) => { - const def = service.getDefinition('foo'); - expect(def instanceof MetadataSourceEditor).toBe(true); - } - ))); - }); - - describe('getMetadataConfiguration method', () => { - it('should return the parsed configuration', waitForAsync(inject([MetadataConfigurationService], - (service: MetadataConfigurationService) => { - const model = {} as Metadata; - const definition = {steps: []}; - const expected = getConfigurationSectionsFn([model], definition, SCHEMA); - expect(service.getMetadataConfiguration(model, definition, SCHEMA)).toEqual(expected); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/configuration/service/configuration.service.ts b/ui/src/app/metadata/configuration/service/configuration.service.ts deleted file mode 100644 index df8a3dba0..000000000 --- a/ui/src/app/metadata/configuration/service/configuration.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable, of, throwError } from 'rxjs'; -import { Metadata } from '../../domain/domain.type'; -import { Wizard } from '../../../wizard/model'; -import { MetadataSourceEditor } from '../../domain/model/wizards/metadata-source-editor'; -import { MetadataProviderEditorTypes } from '../../provider/model'; -import { Schema } from '../model/schema'; -import { TYPES } from '../configuration.values'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { MetadataFilterEditorTypes } from '../../filter/model'; -import { getConfigurationSectionsFn } from '../reducer/utilities'; - -@Injectable() -export class MetadataConfigurationService { - - constructor( - private resolverService: ResolverService, - private providerService: MetadataProviderService, - private http: HttpClient - ) {} - - find(id: string, type: string): Observable { - switch (type) { - case TYPES.resolver: - return this.resolverService.find(id); - case TYPES.provider: - return this.providerService.find(id); - default: - return throwError(new Error('Type not supported')); - } - } - - getDefinition(type: string): Wizard { - return MetadataProviderEditorTypes.find(def => def.type === type) || - MetadataFilterEditorTypes.find(def => def.type === type) || - new MetadataSourceEditor(); - } - - loadSchema(path: string): Observable { - return this.http.get(path); - } - - getMetadataConfiguration(model, definition, schema) { - return getConfigurationSectionsFn([model], definition, schema); - } -} - diff --git a/ui/src/app/metadata/configuration/service/history.service.spec.ts b/ui/src/app/metadata/configuration/service/history.service.spec.ts deleted file mode 100644 index 447be26be..000000000 --- a/ui/src/app/metadata/configuration/service/history.service.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { MetadataHistoryService } from './history.service'; -import { of } from 'rxjs'; -import { PATHS } from '../configuration.values'; -import { Metadata } from '../../domain/domain.type'; - -describe(`Attributes Service`, () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataHistoryService - ] - }); - }); - - describe('query method', () => { - it(`should return a MetadataHistory`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService) => { - service.query('foo', 'resolver').subscribe(history => { - expect(history).toBeDefined(); - }); - } - ))); - }); - - describe('getVersions method', () => { - it(`should join a list of observables`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService) => { - spyOn(service, 'getVersion').and.returnValue(of()); - service.getVersions('foo', ['abc', 'def'], 'resolver').subscribe(history => { - expect(service.getVersion).toHaveBeenCalledTimes(2); - }); - } - ))); - }); - - describe('getVersion method', () => { - it(`should get the primary version of the resource`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - service.getVersion(resourceId, type).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - it(`should get the provided version of the resource`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - const versionId = '1'; - service.getVersion(resourceId, type, versionId).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}/${service.path}/${versionId}` - && req.method === 'GET'; - }, `GET schema by path`); - } - ))); - }); - - describe('updateVersion method', () => { - it(`should send a put request`, waitForAsync(inject([MetadataHistoryService, HttpTestingController], - (service: MetadataHistoryService, backend: HttpTestingController) => { - const resourceId = 'foo'; - const type = 'resource'; - const versionId = '1'; - service.updateVersion(resourceId, type, {} as Metadata).subscribe(); - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}/${PATHS[type]}/${resourceId}` - && req.method === 'PUT'; - }, `PUT schema by path`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/configuration/service/history.service.ts b/ui/src/app/metadata/configuration/service/history.service.ts deleted file mode 100644 index 9e6a3d3f3..000000000 --- a/ui/src/app/metadata/configuration/service/history.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable, forkJoin } from 'rxjs'; -import { MetadataHistory } from '../model/history'; - -import { PATHS } from '../../configuration/configuration.values'; -import { MetadataVersion } from '../model/version'; -import { map } from 'rxjs/operators'; -import { Metadata } from '../../domain/domain.type'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class MetadataHistoryService { - - readonly base = API_BASE_PATH; - readonly path = `Versions`; - - constructor( - private http: HttpClient - ) { } - - query(resourceId: string, type: string): Observable { - return this.http.get(`${this.base}/${PATHS[type]}/${resourceId}/${this.path}`).pipe( - map(resp => ({ - versions: resp - })) - ); - } - - getVersions(resourceId: string, versions: string[], type: string): Observable { - return forkJoin(versions.map( - v => this.getVersion(resourceId, type, v) - )); - } - - getVersion(resourceId: string, type: string, versionId: string = null): Observable { - const api = versionId ? - `${this.base}/${PATHS[type]}/${resourceId}/${this.path}/${versionId}` - : - `${this.base}/${PATHS[type]}/${resourceId}`; - return this.http.get(api); - } - - updateVersion(resourceId: string, type: string, model: Metadata): Observable { - return this.http.put(`${this.base}/${PATHS[type]}/${resourceId}`, model); - } -} diff --git a/ui/src/app/metadata/configuration/service/index-resolver.service.ts b/ui/src/app/metadata/configuration/service/index-resolver.service.ts deleted file mode 100644 index 4bbc5e07e..000000000 --- a/ui/src/app/metadata/configuration/service/index-resolver.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { WizardState } from '../../../wizard/reducer'; -import { SetIndex } from '../../../wizard/action/wizard.action'; - -@Injectable() -export class IndexResolver implements Resolve { - constructor(private store: Store) { } - - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - this.store.dispatch(new SetIndex(route.params.index)); - } -} diff --git a/ui/src/app/metadata/domain/action/entity.action.ts b/ui/src/app/metadata/domain/action/entity.action.ts deleted file mode 100644 index c3f47e1ab..000000000 --- a/ui/src/app/metadata/domain/action/entity.action.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataEntity } from '../../domain/model'; - -export const PREVIEW_ENTITY = '[Domain] Preview Entity'; - -export class PreviewEntity implements Action { - readonly type = PREVIEW_ENTITY; - - constructor(public payload: { - id: string, - entity: MetadataEntity - }) { } -} - -export type Actions = - | PreviewEntity; diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.html b/ui/src/app/metadata/domain/component/editor-nav.component.html deleted file mode 100644 index 7307e79fb..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -
- -
-
diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts b/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts deleted file mode 100644 index 65e8f7865..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { EditorNavComponent, NAV_FORMATS } from './editor-nav.component'; -import { ValidFormIconComponent } from '../../../shared/component/valid-form-icon.component'; -import { WizardStep } from '../../../wizard/model'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(EditorNavComponent, {static: true}) - public componentUnderTest: EditorNavComponent; - - public format = NAV_FORMATS; -} - -describe('Editor Nav Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: EditorNavComponent; - let store: Store; - - let step: WizardStep = { - id: 'common', - label: 'Common Attributes', - index: 2, - initialValues: [] - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - EditorNavComponent, - ValidFormIconComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('getFilterId', () => { - it('should return a string based on provided step', () => { - expect(app.getFilterId(step)).toEqual(step.id); - }); - - it('should return "Filter List" when step is null', () => { - expect(app.getFilterId(null)).toEqual('filters'); - }); - }); - - describe('getFilterLabel', () => { - it('should return a string based on provided step', () => { - expect(app.getFilterLabel(step)).toEqual(step.label); - }); - it('should return "Filter List" when step is null', () => { - expect(app.getFilterLabel(null)).toEqual('Filter List'); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.ts b/ui/src/app/metadata/domain/component/editor-nav.component.ts deleted file mode 100644 index 7cf57ed1b..000000000 --- a/ui/src/app/metadata/domain/component/editor-nav.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; -import { skipWhile, map } from 'rxjs/operators'; - -import { WizardStep } from '../../../wizard/model'; -import * as fromWizard from '../../../wizard/reducer'; - -export enum NAV_FORMATS { - DROPDOWN = 'NAV_DROPDOWN', - TABS = 'NAV_TABS' -} - -@Component({ - selector: 'editor-nav', - templateUrl: './editor-nav.component.html', - styleUrls: [] -}) - -export class EditorNavComponent { - @Input() format: string; - @Input() status: string[] = []; - @Input() path: string = 'edit'; - - @Output() onPageSelect: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; - - currentPage$: Observable; - currentLabel$: Observable; - current$: Observable; - - index$: Observable; - routes$: Observable<{ path: string, label: string }[]>; - - getFilterId = p => p ? p.id : 'filters'; - getFilterLabel = p => p ? p.label : 'Filter List'; - - constructor( - private store: Store - ) { - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(skipWhile(i => !i)); - this.routes$ = this.store.select(fromWizard.getRoutes); - this.current$ = this.store.select(fromWizard.getCurrent); - this.currentPage$ = this.current$.pipe(map(this.getFilterId)); - this.currentLabel$ = this.current$.pipe(map(this.getFilterLabel)); - } -} - diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.html b/ui/src/app/metadata/domain/component/preview-dialog.component.html deleted file mode 100644 index 5a0571f94..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts b/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts deleted file mode 100644 index 819d93c7b..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ViewChild, Component } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { PreviewDialogComponent } from './preview-dialog.component'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(PreviewDialogComponent, {static: true}) - public formUnderTest: PreviewDialogComponent; -} - - -describe('Advanced Info Form Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - PreviewDialogComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.ts b/ui/src/app/metadata/domain/component/preview-dialog.component.ts deleted file mode 100644 index 9d08d4ea7..000000000 --- a/ui/src/app/metadata/domain/component/preview-dialog.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import * as FileSaver from 'file-saver'; -import { Subscription } from 'rxjs'; -import { MetadataEntity } from '../../domain/model'; - -@Component({ - selector: 'preview-dialog', - templateUrl: './preview-dialog.component.html' -}) -export class PreviewDialogComponent { - @Input() entity: MetadataEntity; - @Input() xml: string; - - sub: Subscription; - - constructor( - public activeModal: NgbActiveModal - ) {} - - preview(xml): void { - const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); - FileSaver.saveAs(blob, `${ this.entity.name }.xml`); - } -} diff --git a/ui/src/app/metadata/domain/component/summary-property.component.html b/ui/src/app/metadata/domain/component/summary-property.component.html deleted file mode 100644 index d1f76106c..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.html +++ /dev/null @@ -1,88 +0,0 @@ -
- - - - {{ property.name }} - {{ (property.value || !property.value) ? property.value : '-' }} - - - - - {{ property.name }} - - -

- - - - - - - - - - - -
- -
- {{ value[prop] }} -
-
- - -

-
    -
  • - {{ item }} -
  • -
-
- -

-
    -
  • - {{ item }} -
  • -
-
- - - - - - - - - - - - - - - - -
NameTrueFalse
{{ attr.label }} - - - -
-
-
-
- - - {{ property.name }} - - - - - -
-
diff --git a/ui/src/app/metadata/domain/component/summary-property.component.spec.ts b/ui/src/app/metadata/domain/component/summary-property.component.spec.ts deleted file mode 100644 index 307faa61b..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.spec.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { SummaryPropertyComponent } from './summary-property.component'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { Property } from '../model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { AttributesService } from '../service/attributes.service'; -import { of } from 'rxjs'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(SummaryPropertyComponent, {static: true}) - public componentUnderTest: SummaryPropertyComponent; - - private _property; - - get property(): Property { - return this._property; - } - - set property(prop: Property) { - this._property = prop; - } -} - -describe('Summary Property Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: SummaryPropertyComponent; - let service: AttributesService; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - MockI18nModule - ], - declarations: [ - SummaryPropertyComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry }, - { provide: AttributesService, useValue: { - query: (path: string) => of([]) - } } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - service = TestBed.get(AttributesService); - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('attribute list getter', () => { - it('should return the data from the property schema', waitForAsync(() => { - let list = [{ key: 'foo', label: 'foo' }]; - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null, - widget: { - id: 'foo', - data: list - } - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - - it('should return fetch data from the supplied path', waitForAsync(() => { - let list = [{key: 'foo', label: 'foo'}]; - spyOn(service, 'query').and.returnValue(of(list)); - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null, - widget: { - id: 'foo', - dataUrl: 'foo' - } - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - - it('should return an empty array if no data is found', waitForAsync(() => { - let list = []; - spyOn(service, 'query').and.returnValue(of(list)); - app.property = { - type: 'array', - name: 'foo', - value: ['foo', 'bar'], - items: null, - properties: null - }; - - app.attributeList$.subscribe(l => { - expect(l).toEqual(list); - }); - })); - }); -}); diff --git a/ui/src/app/metadata/domain/component/summary-property.component.ts b/ui/src/app/metadata/domain/component/summary-property.component.ts deleted file mode 100644 index 6b8b408a8..000000000 --- a/ui/src/app/metadata/domain/component/summary-property.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Property } from '../model/property'; -import { Observable, of } from 'rxjs'; -import { AttributesService } from '../service/attributes.service'; - -@Component({ - selector: 'summary-property', - templateUrl: './summary-property.component.html', - styleUrls: [] -}) - -export class SummaryPropertyComponent { - @Input() property: Property; - - constructor( - private attrService: AttributesService - ) {} - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(items: Property): string { - return items.widget ? items.widget.id : 'default'; - } - - get attributeList$(): Observable<{key: string, label: string}[]> { - if (this.property.widget && this.property.widget.hasOwnProperty('data')) { - return of(this.property.widget.data); - } - if (this.property.widget && this.property.widget.hasOwnProperty('dataUrl')) { - return this.attrService.query(this.property.widget.dataUrl); - } - return of([]); - } -} - diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html deleted file mode 100644 index a00c04202..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.html +++ /dev/null @@ -1,32 +0,0 @@ - -
- - - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts deleted file mode 100644 index 1a771f05c..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { UnsavedEntityComponent } from './unsaved-entity.dialog'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(UnsavedEntityComponent, {static: true}) - public componentUnderTest: UnsavedEntityComponent; -} - -describe('Unsaved Provider Dialog Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let cmp: UnsavedEntityComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockI18nModule - ], - declarations: [ - UnsavedEntityComponent, - TestHostComponent - ], - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - cmp = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(cmp).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts b/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts deleted file mode 100644 index 0df8d8715..000000000 --- a/ui/src/app/metadata/domain/component/unsaved-entity.dialog.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Subject } from 'rxjs'; - -@Component({ - selector: 'unsaved-entity', - templateUrl: './unsaved-entity.dialog.html' -}) -export class UnsavedEntityComponent { - readonly subject: Subject = new Subject(); - - @Input() message; - - constructor( - public activeModal: NgbActiveModal - ) { } - - close(): void { - this.activeModal.close(); - } - - dismiss(): void { - this.activeModal.dismiss(); - } -} diff --git a/ui/src/app/metadata/domain/domain.module.ts b/ui/src/app/metadata/domain/domain.module.ts deleted file mode 100644 index c3679435e..000000000 --- a/ui/src/app/metadata/domain/domain.module.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { EffectsModule } from '@ngrx/effects'; -import { CommonModule } from '@angular/common'; -import { NgbPopoverModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ResolverService } from './service/resolver.service'; -import { ListValuesService } from './service/list-values.service'; -import { ProviderStatusEmitter, ProviderValueEmitter } from './service/provider-change-emitter.service'; -import { EntityIdService } from './service/entity-id.service'; -import { EntityDraftService } from './service/draft.service'; - -import { MetadataProviderService } from './service/provider.service'; -import { EntityEffects } from './effect/entity.effect'; -import { PreviewDialogComponent } from './component/preview-dialog.component'; -import { MetadataFilterService } from './service/filter.service'; -import { AttributesService } from './service/attributes.service'; -import { I18nModule } from '../../i18n/i18n.module'; -import { SummaryPropertyComponent } from './component/summary-property.component'; - -import { UnsavedEntityComponent } from './component/unsaved-entity.dialog'; -import { EditorNavComponent } from './component/editor-nav.component'; -import { RouterModule } from '@angular/router'; -import { SharedModule } from '../../shared/shared.module'; - -export const COMPONENTS = [ - PreviewDialogComponent, - UnsavedEntityComponent, - SummaryPropertyComponent, - EditorNavComponent -]; - -export const DECLARATIONS = [ - ...COMPONENTS -]; - -@NgModule({ - declarations: DECLARATIONS, - entryComponents: COMPONENTS, - imports: [ - CommonModule, - I18nModule, - NgbPopoverModule, - RouterModule, - NgbDropdownModule, - SharedModule - ], - exports: DECLARATIONS, - providers: [] -}) -export class DomainModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootDomainModule, - providers: [ - ResolverService, - EntityIdService, - EntityDraftService, - ListValuesService, - ProviderStatusEmitter, - ProviderValueEmitter, - MetadataProviderService, - MetadataFilterService, - AttributesService - ] - }; - } -} - -@NgModule({ - imports: [ - DomainModule, - EffectsModule.forFeature([ - EntityEffects - ]) - ], -}) -export class RootDomainModule { } diff --git a/ui/src/app/metadata/domain/domain.type.ts b/ui/src/app/metadata/domain/domain.type.ts deleted file mode 100644 index e62766ed8..000000000 --- a/ui/src/app/metadata/domain/domain.type.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - MetadataProvider, - MetadataResolver, - MetadataFilter -} from './model'; - -import { - EntityAttributesFilterEntity, - FileBackedHttpMetadataResolver -} from './entity'; -import { - FileBackedHttpMetadataProvider -} from './model/providers'; - -export type Filter = - | EntityAttributesFilterEntity; - -export type Resolver = - | FileBackedHttpMetadataResolver; - -export type Provider = - | FileBackedHttpMetadataProvider; - -export type Entity = - | Filter - | Resolver - | Provider; - -export type Metadata = - | MetadataProvider - | MetadataResolver - | MetadataFilter; - -export enum MetadataTypes { - FILTER = '[Type] Metadata Filter', - PROVIDER = '[Type] Metadata Provider', - RESOLVER = '[Type] Metadata Resolver' -} diff --git a/ui/src/app/metadata/domain/domain.util.spec.ts b/ui/src/app/metadata/domain/domain.util.spec.ts deleted file mode 100644 index d8b749098..000000000 --- a/ui/src/app/metadata/domain/domain.util.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import * as util from './domain.util'; -import { MetadataProvider } from './model'; - -describe('Domain Utility methods', () => { - - describe('combineAllFn', () => { - it('should return true when the selected id is found', () => { - expect(util.combineAllFn(['foo'], ['bar'])).toEqual(['bar', 'foo']); - }); - }); - - describe('doesExistFn', () => { - it('should return true when the selected id is found', () => { - expect(util.doesExistFn(['foo', 'bar'], 'foo')).toBe(true); - }); - it('should return false when the selected id is not found', () => { - expect(util.doesExistFn(['foo'], 'bar')).toBe(false); - }); - }); - - describe('getInCollectionFn', () => { - const entities = { foo: {}, bar: {} }; - it('should return the entity with the given id', () => { - expect(util.getInCollectionFn(entities, 'foo')).toBe(entities.foo); - }); - it('should return null when provided a null id', () => { - expect(util.getInCollectionFn(entities, null)).toBeNull(); - }); - }); - - describe('getEntityIdsFn', () => { - const entities = [{ entityId: 'foo' }, { entityId: 'bar' }]; - it('should return a list of ids', () => { - expect(util.getEntityIdsFn(entities)).toEqual(['foo', 'bar']); - }); - }); - - describe('mergeProviderOrderFn', () => { - const providers = [ - { id: 'foo', name: 'foo', '@type': 'foo', enabled: true, xmlId: 'id', sortKey: 1, metadataFilters: [] }, - { id: 'bar', name: 'bar', '@type': 'bar', enabled: false, xmlId: 'id2', sortKey: 2, metadataFilters: [] }, - { id: 'baz', name: 'baz', '@type': 'baz', enabled: false, xmlId: 'id3', sortKey: 3, metadataFilters: [] } - ]; - it('1 should sort the list accordingly', () => { - let order = ['bar', 'foo', 'baz'], - ordered = util.mergeOrderFn([...providers], order); - expect(ordered.indexOf(providers[0])).toBe(1); - }); - - it('2 should sort the list accordingly', () => { - let order = ['foo', 'bar', 'baz'], - ordered = util.mergeOrderFn(providers, order); - expect(ordered.indexOf(providers[0])).toBe(0); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/domain.util.ts b/ui/src/app/metadata/domain/domain.util.ts deleted file mode 100644 index 2aeeac247..000000000 --- a/ui/src/app/metadata/domain/domain.util.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Metadata } from './domain.type'; - -/* - * Utility functions -*/ - -export const combineAllFn = (d, p) => [...p, ...d]; -export const doesExistFn = (ids, selected) => ids.indexOf(selected) > -1; -export const getInCollectionFn = (entities, selectedId) => { - return selectedId && entities[selectedId]; -}; -export const getEntityIdsFn = list => list.map(entity => entity.entityId); - -export const getId = (entity: Metadata): string => { - return entity.resourceId ? entity.resourceId : entity.id; -}; - -export const mergeOrderFn = (entities: Metadata[], order: string[]): Metadata[] => { - const ordered = [...entities.sort( - (a: Metadata, b: Metadata) => { - const aIndex = order.indexOf(getId(a)); - const bIndex = order.indexOf(getId(b)); - return aIndex > bIndex ? 1 : bIndex > aIndex ? -1 : 0; - } - )]; - return ordered; -}; diff --git a/ui/src/app/metadata/domain/effect/entity.effect.spec.ts b/ui/src/app/metadata/domain/effect/entity.effect.spec.ts deleted file mode 100644 index 1a8c18a0d..000000000 --- a/ui/src/app/metadata/domain/effect/entity.effect.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { TestBed, tick, fakeAsync } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { of } from 'rxjs'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { EntityEffects } from './entity.effect'; -import { EntityIdService } from '../service/entity-id.service'; -import { ResolverService } from '../service/resolver.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { EntityAttributesFilterEntity, FileBackedHttpMetadataResolver } from '../entity'; - -import * as fromRoot from '../../../app.reducer'; -import { StoreModule } from '@ngrx/store'; - -describe('Entity Effects', () => { - let effects: EntityEffects; - let providerService: any; - let idService: any; - let modal: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - EntityEffects, - { - provide: NgbModal, - useClass: NgbModalStub - }, - { - provide: ResolverService, - useValue: { preview: () => {} }, - }, - { - provide: EntityIdService, - useValue: { preview: () => { } }, - }, - { provide: Actions, useFactory: getActions } - ], - imports: [ - StoreModule.forRoot(fromRoot.reducers) - ] - }); - - effects = TestBed.get(EntityEffects); - providerService = TestBed.get(ResolverService); - idService = TestBed.get(EntityIdService); - modal = TestBed.get(NgbModal); - actions$ = TestBed.get(Actions); - }); - - describe('openModal', () => { - it('should open a modal window for a filter', fakeAsync(() => { - spyOn(modal, 'open').and.returnValue({componentInstance: {}}); - spyOn(idService, 'preview').and.returnValue(of('')); - effects.openModal({ id: 'foo', entity: new EntityAttributesFilterEntity()}); - expect(idService.preview).toHaveBeenCalled(); - tick(10); - expect(modal.open).toHaveBeenCalled(); - })); - - it('should open a modal window for a provider', fakeAsync(() => { - spyOn(modal, 'open').and.returnValue({ componentInstance: {} }); - spyOn(providerService, 'preview').and.returnValue(of('')); - effects.openModal({id: 'foo', entity: new FileBackedHttpMetadataResolver()}); - expect(providerService.preview).toHaveBeenCalled(); - tick(10); - expect(modal.open).toHaveBeenCalled(); - })); - }); -}); diff --git a/ui/src/app/metadata/domain/effect/entity.effect.ts b/ui/src/app/metadata/domain/effect/entity.effect.ts deleted file mode 100644 index ec722591f..000000000 --- a/ui/src/app/metadata/domain/effect/entity.effect.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; - -import { ResolverService } from '../service/resolver.service'; -import { PreviewDialogComponent } from '../component/preview-dialog.component'; -import { MetadataEntity } from '../model'; -import { MetadataTypes } from '../domain.type'; -import { EntityIdService } from '../service/entity-id.service'; -import * as entityActions from '../action/entity.action'; - -import * as fromRoot from '../../../app.reducer'; - -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; - -@Injectable() -export class EntityEffects { - - @Effect({ dispatch: false }) - previewEntityXml$ = this.actions$.pipe( - ofType(entityActions.PREVIEW_ENTITY), - map(action => action.payload), - tap(prev => this.openModal(prev)) - ); - - constructor( - private actions$: Actions, - private modalService: NgbModal, - private providerService: ResolverService, - private entityService: EntityIdService, - private store: Store - ) { } - - openModal(prev: { id: string, entity: MetadataEntity }): void { - let { id, entity } = prev, - request: Observable = entity.kind === MetadataTypes.FILTER ? - this.entityService.preview(id) : this.providerService.preview(id); - request.subscribe( - xml => { - let modal = this.modalService.open(PreviewDialogComponent, { - size: 'lg', - windowClass: 'modal-xl' - }); - modal.componentInstance.entity = entity; - modal.componentInstance.xml = xml; - }, - err => { - this.store.dispatch(new AddNotification(new Notification( - NotificationType.Danger, - `Unable to preview entity.`, - 8000 - ))); - } - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts deleted file mode 100644 index bb544cf0d..000000000 --- a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EntityAttributesFilterEntity } from './entity-attributes-filter'; - -describe('EntityAttributesFilter Entity', () => { - let entity: EntityAttributesFilterEntity; - beforeEach(() => { - entity = new EntityAttributesFilterEntity({ - resourceId: 'foo', - filterEnabled: false - }); - }); - - it('should be an instance', () => { - expect(entity).toBeDefined(); - expect(entity.resourceId).toBe('foo'); - expect(entity.enabled).toBe(entity.filterEnabled); - expect(entity.id).toBe(entity.resourceId); - expect(entity.getId()).toBe(entity.resourceId); - expect(entity.getDisplayId()).toBe(entity.resourceId); - expect(entity.isDraft()).toBe(false); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts deleted file mode 100644 index f536a5b38..000000000 --- a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { MetadataFilter, MetadataEntity, RelyingPartyOverrides } from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { FilterTarget } from '../../model'; - -export class EntityAttributesFilterEntity implements MetadataFilter, MetadataEntity { - createdDate?: string; - modifiedDate?: string; - version: string; - resourceId: string; - createdBy: string; - - name = ''; - filterEnabled = false; - audId: string; - type: string; - - relyingPartyOverrides = { - nameIdFormats: [] as string[], - authenticationMethods: [] as string[] - } as RelyingPartyOverrides; - - attributeRelease = [] as string[]; - - entityAttributesFilterTarget: FilterTarget = { - type: 'ENTITY', - value: [''] - }; - - constructor(obj?: Partial) { - Object.assign(this, { ...obj }); - } - - getId(): string { - return this.resourceId; - } - - getDisplayId(): string { - return this.resourceId; - } - - isDraft(): boolean { - return false; - } - - getCreationDate(): Date { - return new Date(this.createdDate); - } - - get id(): string { - return this.resourceId; - } - - set id(id: string) { - this.resourceId = id; - } - - get enabled(): boolean { - return this.filterEnabled; - } - - get kind(): string { - return MetadataTypes.FILTER; - } - - get entityId(): string { - return this.entityAttributesFilterTarget.value[0]; - } - - set entityId(val: string) { - this.entityAttributesFilterTarget.value[0] = val; - } - - serialize(): any { - return { - attributeRelease: this.attributeRelease, - relyingPartyOverrides: this.relyingPartyOverrides, - entityAttributesFilterTarget: this.entityAttributesFilterTarget, - filterEnabled: this.filterEnabled, - name: this.name, - '@type': 'EntityAttributes' - }; - } -} diff --git a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts b/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts deleted file mode 100644 index ba39ffbe2..000000000 --- a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NameIDFormatFilterEntity } from './nameid-format-filter'; - -describe('NameIDFormatFilterEntity Entity', () => { - let entity: NameIDFormatFilterEntity; - beforeEach(() => { - entity = new NameIDFormatFilterEntity({ - resourceId: 'foo', - filterEnabled: false - }); - }); - - it('should be an instance', () => { - expect(entity).toBeDefined(); - expect(entity.resourceId).toBe('foo'); - expect(entity.enabled).toBe(entity.filterEnabled); - expect(entity.id).toBe(entity.resourceId); - expect(entity.getId()).toBe(entity.resourceId); - expect(entity.getDisplayId()).toBe(entity.resourceId); - expect(entity.isDraft()).toBe(false); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts b/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts deleted file mode 100644 index 3d745f725..000000000 --- a/ui/src/app/metadata/domain/entity/filter/nameid-format-filter.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { MetadataFilter, MetadataEntity } from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { FilterTarget } from '../../model'; - -export class NameIDFormatFilterEntity implements MetadataFilter, MetadataEntity { - createdDate?: string; - modifiedDate?: string; - version: string; - resourceId: string; - createdBy: string; - - name = ''; - filterEnabled = false; - audId: string; - type: string; - - nameIdFormatFilterTarget: FilterTarget = { - type: 'ENTITY', - value: [''] - }; - - constructor(obj?: Partial) { - Object.assign(this, { ...obj }); - } - - getId(): string { - return this.resourceId; - } - - getDisplayId(): string { - return this.resourceId; - } - - isDraft(): boolean { - return false; - } - - getCreationDate(): Date { - return new Date(this.createdDate); - } - - get id(): string { - return this.resourceId; - } - - set id(id: string) { - this.resourceId = id; - } - - get enabled(): boolean { - return this.filterEnabled; - } - - get kind(): string { - return MetadataTypes.FILTER; - } - - serialize(): any { - return { - nameIdFormatFilterTarget: this.nameIdFormatFilterTarget, - filterEnabled: this.filterEnabled, - name: this.name, - '@type': 'EntityAttributes' - }; - } -} diff --git a/ui/src/app/metadata/domain/entity/index.ts b/ui/src/app/metadata/domain/entity/index.ts deleted file mode 100644 index 648255369..000000000 --- a/ui/src/app/metadata/domain/entity/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './filter/entity-attributes-filter'; -export * from './resolver/file-backed-http-metadata-resolver'; diff --git a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts deleted file mode 100644 index 627a22571..000000000 --- a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { FileBackedHttpMetadataResolver } from './file-backed-http-metadata-resolver'; -import { MetadataResolver } from '../../model'; - -describe('Resolver construct', () => { - - const config = { - id: 'foo', - entityId: 'string', - serviceProviderName: 'string', - organization: { - 'name': 'string', - 'displayName': 'string', - 'url': 'string' - }, - contacts: [ - { - 'name': 'string', - 'type': 'string', - 'emailAddress': 'string' - } - ], - mdui: { - 'displayName': 'string', - 'informationUrl': 'string', - 'privacyStatementUrl': 'string', - 'logoUrl': 'string', - 'logoHeight': 100, - 'logoWidth': 100, - 'description': 'string' - }, - securityInfo: { - 'x509CertificateAvailable': true, - 'authenticationRequestsSigned': true, - 'wantAssertionsSigned': true, - 'x509Certificates': [ - { - 'name': 'string', - 'type': 'string', - 'value': 'string' - } - ] - }, - assertionConsumerServices: [ - { - 'binding': 'string', - 'locationUrl': 'string', - 'makeDefault': true - } - ], - serviceProviderSsoDescriptor: { - 'protocolSupportEnum': 'string', - 'nameIdFormats': [ - 'string' - ] - }, - - logoutEndpoints: [ - { - 'url': 'string', - 'bindingType': 'string' - } - ], - serviceEnabled: true, - createdDate: 'December 17, 1995 03:24:00', - modifiedDate: 'December 17, 1995 03:24:00', - relyingPartyOverrides: { - 'signAssertion': true, - 'dontSignResponse': true, - 'turnOffEncryption': true, - 'useSha': true, - 'ignoreAuthenticationMethod': true, - 'omitNotBefore': true, - 'responderId': 'string', - 'nameIdFormats': [ - 'string' - ], - 'authenticationMethods': [ - 'string' - ] - }, - attributeRelease: [ - 'eduPersonPrincipalName', - 'uid', - 'mail' - ] - }; - - it('should populate its own values', () => { - const entity = new FileBackedHttpMetadataResolver(config); - Object.keys(config).forEach(key => { - expect(entity[key]).toEqual(config[key]); - }); - }); - - describe('isDraft method', () => { - it('should return false if no createDate defined', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.isDraft()).toBe(false); - }); - - it('should return false if no createDate defined', () => { - const { createdDate, ...rest } = config; - const entity = new FileBackedHttpMetadataResolver(rest as MetadataResolver); - expect(entity.isDraft()).toBe(true); - }); - }); - - describe('getCreationDate method', () => { - it('should return false if no createDate defined', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.getCreationDate()).toBeDefined(); - }); - - it('should return false if no createDate defined', () => { - const { createdDate, ...rest } = config; - const entity = new FileBackedHttpMetadataResolver(rest as MetadataResolver); - expect(entity.getCreationDate()).toBeNull(); - }); - }); - - describe('enabled getter', () => { - it('should return the serviceEnabled attribute', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.enabled).toBe(config.serviceEnabled); - }); - }); - - describe('serialize method', () => { - it('should return itself', () => { - const entity = new FileBackedHttpMetadataResolver(config); - expect(entity.serialize()).toBe(entity); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts deleted file mode 100644 index 81a2a2ca7..000000000 --- a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - Organization, - Contact, - MDUI, - LogoutEndpoint, - SecurityInfo, - Certificate, - SsoService, - IdpSsoDescriptor, - RelyingPartyOverrides, - MetadataResolver -} from '../../model'; -import { MetadataTypes } from '../../domain.type'; -import { MetadataEntity } from '../../model/metadata-entity'; - -export class FileBackedHttpMetadataResolver implements MetadataResolver, MetadataEntity { - id = ''; - createdDate?: string; - modifiedDate?: string; - version: string; - createdBy: string; - - entityId = ''; - serviceProviderName = ''; - organization = {} as Organization; - contacts = [] as Contact[]; - mdui = {} as MDUI; - - securityInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: false, - wantAssertionsSigned: false, - x509Certificates: [] as Certificate[] - } as SecurityInfo; - - assertionConsumerServices = [] as SsoService[]; - serviceProviderSsoDescriptor = { - nameIdFormats: [] - } as IdpSsoDescriptor; - - logoutEndpoints: LogoutEndpoint[] = []; - - serviceEnabled = false; - - relyingPartyOverrides = { - nameIdFormats: [] as string[], - authenticationMethods: [] as string[] - } as RelyingPartyOverrides; - - attributeRelease = [] as string[]; - - [property: string]: unknown; - - constructor(descriptor?: Partial) { - Object.assign(this, descriptor); - } - - getId(): string { - return this.id; - } - - getDisplayId(): string { - return this.entityId; - } - - isDraft(): boolean { - return this.createdDate ? false : true; - } - - getCreationDate(): Date { - return this.createdDate ? new Date(this.createdDate) : null; - } - - get name(): string { - return this.serviceProviderName; - } - - get enabled(): boolean { - return this.serviceEnabled; - } - - get kind(): string { - return MetadataTypes.RESOLVER; - } - - serialize(): any { - return this; - } -} diff --git a/ui/src/app/metadata/domain/model/index.ts b/ui/src/app/metadata/domain/model/index.ts deleted file mode 100644 index cd00d92fe..000000000 --- a/ui/src/app/metadata/domain/model/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './metadata-base'; -export * from './metadata-entity'; -export * from './metadata-filter'; -export * from './metadata-provider'; -export * from './metadata-resolver'; -export * from './properties/certificate'; -export * from './properties/contact'; -export * from './properties/filter-target'; -export * from './properties/logout-endpoint'; -export * from './properties/mdui'; -export * from './properties/organization'; -export * from './properties/relying-party-overrides'; -export * from './properties/security-info'; -export * from './properties/sso-descriptor'; -export * from './properties/sso-service'; diff --git a/ui/src/app/metadata/domain/model/metadata-base.ts b/ui/src/app/metadata/domain/model/metadata-base.ts deleted file mode 100644 index e8847a6ee..000000000 --- a/ui/src/app/metadata/domain/model/metadata-base.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface MetadataBase { - id?: string; - createdDate?: string; - createdBy: string; - modifiedDate?: string; - version?: string; -} diff --git a/ui/src/app/metadata/domain/model/metadata-entity.ts b/ui/src/app/metadata/domain/model/metadata-entity.ts deleted file mode 100644 index 699502c8f..000000000 --- a/ui/src/app/metadata/domain/model/metadata-entity.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface MetadataEntity { - name: string; - enabled: boolean; - kind: string; - - createdBy: string; - - getId(): string; - getDisplayId(): string; - isDraft(): boolean; - getCreationDate(): Date; - - serialize(): any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-filter.ts b/ui/src/app/metadata/domain/model/metadata-filter.ts deleted file mode 100644 index 46e53c4fb..000000000 --- a/ui/src/app/metadata/domain/model/metadata-filter.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { MetadataBase } from './metadata-base'; - -export interface MetadataFilter extends MetadataBase { - name: string; - filterEnabled?: boolean; - type: string; - resourceId: string | null; - - [key: string]: any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-provider.ts b/ui/src/app/metadata/domain/model/metadata-provider.ts deleted file mode 100644 index e0b0a09a2..000000000 --- a/ui/src/app/metadata/domain/model/metadata-provider.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - MetadataBase, -} from '../model'; -import { MetadataFilter } from './metadata-filter'; - -export interface MetadataProvider extends MetadataBase { - name: string; - '@type': string; - enabled: boolean; - resourceId: string; - xmlId: string; - sortKey: number; - metadataFilters: MetadataFilter[]; - reloadableMetadataResolverAttributes?: any; -} diff --git a/ui/src/app/metadata/domain/model/metadata-resolver.ts b/ui/src/app/metadata/domain/model/metadata-resolver.ts deleted file mode 100644 index e97c08d07..000000000 --- a/ui/src/app/metadata/domain/model/metadata-resolver.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - MetadataBase, - Organization, - Contact, - MDUI, - SecurityInfo, - SsoService, - IdpSsoDescriptor, - LogoutEndpoint, - RelyingPartyOverrides -} from '../model'; - -export interface MetadataResolver extends MetadataBase { - id: string; - resourceId?: string; - entityId?: string; - serviceProviderName: string; - organization?: Organization; - contacts?: Contact[]; - mdui?: MDUI; - securityInfo?: SecurityInfo; - assertionConsumerServices?: SsoService[]; - serviceProviderSsoDescriptor?: IdpSsoDescriptor; - logoutEndpoints?: LogoutEndpoint[]; - serviceEnabled?: boolean; - relyingPartyOverrides?: RelyingPartyOverrides; - attributeRelease?: string[]; - - [property: string]: unknown; -} diff --git a/ui/src/app/metadata/domain/model/properties/certificate.ts b/ui/src/app/metadata/domain/model/properties/certificate.ts deleted file mode 100644 index bb8ad9088..000000000 --- a/ui/src/app/metadata/domain/model/properties/certificate.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Certificate { - name: string; - type: string; - value: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/contact.ts b/ui/src/app/metadata/domain/model/properties/contact.ts deleted file mode 100644 index 52d1fe905..000000000 --- a/ui/src/app/metadata/domain/model/properties/contact.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Contact { - type: string; - name: string; - emailAddress: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/filter-target.ts b/ui/src/app/metadata/domain/model/properties/filter-target.ts deleted file mode 100644 index d1e7ad9ca..000000000 --- a/ui/src/app/metadata/domain/model/properties/filter-target.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface FilterTarget { - type: string; - value: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts b/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts deleted file mode 100644 index 31354277a..000000000 --- a/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface LogoutEndpoint { - url: string; - bindingType: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/mdui.ts b/ui/src/app/metadata/domain/model/properties/mdui.ts deleted file mode 100644 index 6e309f3f1..000000000 --- a/ui/src/app/metadata/domain/model/properties/mdui.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface MDUI { - displayName?: string; - informationUrl?: string; - privacyStatementUrl?: string; - logoUrl?: string; - logoHeight?: number; - logoWidth?: number; - description?: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/organization.ts b/ui/src/app/metadata/domain/model/properties/organization.ts deleted file mode 100644 index dd2e5116e..000000000 --- a/ui/src/app/metadata/domain/model/properties/organization.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Organization { - name?: string; - displayName?: string; - url?: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/release-attribute.ts b/ui/src/app/metadata/domain/model/properties/release-attribute.ts deleted file mode 100644 index 7edc37b6a..000000000 --- a/ui/src/app/metadata/domain/model/properties/release-attribute.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ReleaseAttribute { - key: string; - label: string; -} diff --git a/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts b/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts deleted file mode 100644 index b720992ab..000000000 --- a/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface RelyingPartyOverrides { - signAssertion?: boolean; - dontSignResponse?: boolean; - turnOffEncryption?: boolean; - useSha?: boolean; - ignoreAuthenticationMethod?: boolean; - omitNotBefore?: boolean; - responderId?: string; - nameIdFormats: string[]; - authenticationMethods: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/security-info.ts b/ui/src/app/metadata/domain/model/properties/security-info.ts deleted file mode 100644 index efa79867b..000000000 --- a/ui/src/app/metadata/domain/model/properties/security-info.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Certificate } from './certificate'; - -export interface SecurityInfo { - x509CertificateAvailable?: boolean; - authenticationRequestsSigned?: boolean; - wantAssertionsSigned?: boolean; - x509Certificates: Certificate[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts b/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts deleted file mode 100644 index 3b742e946..000000000 --- a/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IdpSsoDescriptor { - protocolSupportEnum: string; - nameIdFormats: string[]; -} diff --git a/ui/src/app/metadata/domain/model/properties/sso-service.ts b/ui/src/app/metadata/domain/model/properties/sso-service.ts deleted file mode 100644 index 2aa770b26..000000000 --- a/ui/src/app/metadata/domain/model/properties/sso-service.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface SsoService { - binding: string; - locationUrl: string; - makeDefault: boolean; -} diff --git a/ui/src/app/metadata/domain/model/property.ts b/ui/src/app/metadata/domain/model/property.ts deleted file mode 100644 index 51a4bf06e..000000000 --- a/ui/src/app/metadata/domain/model/property.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface Property { - title?: string; - type: string; - name: string; - value: any[]; - items: Property; - properties: Property[]; - differences?: boolean; - widget?: { - id: string; - data?: {key: string, label: string}[]; - dataUrl?: string; - differences?: string; - [propertyName: string]: any; - }; -} diff --git a/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts deleted file mode 100644 index 02d9ef01d..000000000 --- a/ui/src/app/metadata/domain/model/providers/base-metadata-provider.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MetadataProvider } from '../metadata-provider'; - -export interface BaseMetadataProvider extends MetadataProvider { - metadataFilters: any[]; -} diff --git a/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts deleted file mode 100644 index 5d3201836..000000000 --- a/ui/src/app/metadata/domain/model/providers/dynamic-http-metadata-provider.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface DynamicHttpMetadataProvider extends BaseMetadataProvider { - id: string; - metadataURL: string; - dynamicMetadataResolverAttributes: DynamicMetadataResolverAttributes; - httpMetadataResolverAttributes: HttpMetadataResolverAttributes; - maxConnectionsTotal: number; - maxConnectionsPerRoute: number; - supportedContentTypes: string[]; -} - -export interface DynamicMetadataResolverAttributes { - refreshDelayFactor: number; - minCacheDuration: string; - maxCacheDuration: string; - maxIdleEntityData: string; - removeIdleEntityData: boolean; - cleanupTaskInterval: string; - - persistentCacheManagerRef: string; - persistentCacheManagerDirectory: string; - persistentCacheKeyGeneratorRef: string; - initializeFromPersistentCacheInBackground: boolean; - backgroundInitializationFromCacheDelay: string; - initializationFromCachePredicateRef: string; -} - -export interface HttpMetadataResolverAttributes { - httpClientRef; - connectionRequestTimeout: string; - connectionTimeout: string; - socketTimeout: string; - disregardTLSCertificate: boolean; - tlsTrustEngineRef: string; - httpClientSecurityParametersRef: string; - proxyHost: string; - proxyPort: string; - proxyUser: string; - proxyPassword: string; - httpCaching: HttpCachingType; - httpCacheDirectory: string; - httpMaxCacheEntries: number; - httpMaxCacheEntrySize: number; -} - -export enum HttpCachingType { - NONE = 'none', - FILE = 'file', - MEMORY = 'memory' -} diff --git a/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts deleted file mode 100644 index 1d1e39291..000000000 --- a/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface FileBackedHttpMetadataProvider extends BaseMetadataProvider { - id: string; - metadataURL: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts deleted file mode 100644 index e884151c1..000000000 --- a/ui/src/app/metadata/domain/model/providers/file-system-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface FileSystemMetadataProvider extends BaseMetadataProvider { - id: string; - metadataFile: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/providers/index.ts b/ui/src/app/metadata/domain/model/providers/index.ts deleted file mode 100644 index 6bce32434..000000000 --- a/ui/src/app/metadata/domain/model/providers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './file-backed-http-metadata-provider'; -export * from './base-metadata-provider'; diff --git a/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts deleted file mode 100644 index b56f9237b..000000000 --- a/ui/src/app/metadata/domain/model/providers/local-dynamic-metadata-provider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseMetadataProvider } from './base-metadata-provider'; - -export interface LocalDynamicMetadataProvider extends BaseMetadataProvider { - id: string; - sourceDirectory: string; - reloadableMetadataResolverAttributes: any; -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts deleted file mode 100644 index 4bcca0481..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { MetadataSourceBase } from './metadata-source-base'; -import { MetadataResolver } from '../metadata-resolver'; - -describe('Metadata Source Base class', () => { - - let base = new MetadataSourceBase(); - const parser = base.parser; - const formatter = base.formatter; - const getValidators = base.getValidators; - - describe('parser', () => { - it('should return the provided object', () => { - let model = { - serviceProviderName: 'foo', - id: 'FileBackedHttpMetadataProvider' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should return the model', () => { - let model = { - serviceProviderName: 'foo', - id: 'FileBackedHttpMetadataProvider' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/entityId', - '/relyingPartyOverrides', - '/serviceProviderSsoDescriptor' - ]); - }); - - describe('root validator', () => { - it('should check for child errors', () => { - const validators = getValidators([]); - const validator = validators['/']; - const getPropertySpy = jasmine.createSpy('getProperty'); - const relyingPartyOverrides = { foo: 'bar', baz: 'foo' }; - const value = { relyingPartyOverrides }; - const error = { - code: 'INVALID_SIGNING', - path: `#/relyingPartyOverrides`, - message: 'message.invalid-signing', - params: [relyingPartyOverrides], - invalidate: false - }; - spyOn(validators, '/relyingPartyOverrides').and.returnValue(error); - - const validated = validator(value, null, { getProperty: getPropertySpy }); - - expect(validated).toBeUndefined(); - }); - }); - - describe('relying party validator', () => { - it('should check for child errors', () => { - const validators = getValidators([]); - const validator = validators['/relyingPartyOverrides']; - const relyingPartyOverrides = { signAssertion: false, dontSignResponse: true }; - const error = { - code: 'INVALID_SIGNING', - path: `#/relyingPartyOverrides`, - message: 'message.invalid-signing', - params: [relyingPartyOverrides], - invalidate: false - }; - - const validated = validator(relyingPartyOverrides, {path: '/relyingPartyOverrides'}); - - expect(validated).toEqual(error); - }); - - it('should return null if no error detected', () => { - const validators = getValidators([]); - const validator = validators['/relyingPartyOverrides']; - - expect(validator({ signAssertion: true, dontSignResponse: true }, { path: '/relyingPartyOverrides' })).toEqual(null); - expect(validator({ signAssertion: true, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); - expect(validator({ signAssertion: false, dontSignResponse: false }, { path: '/relyingPartyOverrides' })).toEqual(null); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts deleted file mode 100644 index 6cfd285c8..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { FormProperty } from 'ngx-schema-form/lib/model/formproperty'; -import { ArrayProperty } from 'ngx-schema-form/lib/model/arrayproperty'; -import { ObjectProperty } from 'ngx-schema-form/lib/model/objectproperty'; -import { getAllOtherIds } from '../../../resolver/reducer'; - -/*istanbul ignore next */ -export class MetadataSourceBase implements Wizard { - label = 'Metadata Source'; - type = '@MetadataProvider'; - steps: WizardStep[] = []; - schema = ''; - - validatorParams = [getAllOtherIds]; - - bindings = { - '/securityInfo/x509CertificateAvailable': [ - { - 'input': (event, property: FormProperty) => { - let available = !property.value, - parent = property.parent, - certs = parent.getProperty('x509Certificates'); - if (available && !certs.value.length) { - certs.setValue([ - { - name: '', - type: 'both', - value: '' - } - ], true); - } - - if (!available && certs.value.length > 0) { - certs.setValue([], true); - } - } - } - ], - '/assertionConsumerServices/*/makeDefault': [ - { - 'input': (event, property: FormProperty) => { - let parent = property.parent.parent as ArrayProperty; - let props = parent.properties as ObjectProperty[]; - props.forEach(prop => { - if (prop !== property) { - prop.setValue({ - ...prop.value, - makeDefault: false - }, false); - } - }); - } - } - ] - }; - - parser(changes: Partial, schema?: any): any { - if (!schema || !schema.properties) { - return changes; - } - if (schema.properties.hasOwnProperty('organization') && !changes.organization) { - changes.organization = {}; - } - return changes; - } - - formatter(changes: Partial, schema?: any): any { - return changes; - } - - getValidators(entityIdList: string[]): { [key: string]: any } { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, form_current.getProperty(key), form_current) : null; - if (error && error.invalidate) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/entityId': (value, property, form) => { - const err = entityIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value], - invalidate: true - } : null; - return err; - }, - '/relyingPartyOverrides': (value, property, form) => { - if (!value.signAssertion && value.dontSignResponse) { - return { - code: 'INVALID_SIGNING', - path: `#${property.path}`, - message: 'message.invalid-signing', - params: [value], - invalidate: false - }; - } - return null; - }, - '/serviceProviderSsoDescriptor': (value, property, form) => { - if (value.nameIdFormats && value.nameIdFormats.length && !value.protocolSupportEnum) { - return { - code: 'PROTOCOL_SUPPORT_ENUM_REQUIRED', - path: `#${property.path}`, - message: 'message.protocol-support-required', - params: [value], - invalidate: true - }; - } - return null; - } - }; - return validators; - } -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts deleted file mode 100644 index 65e2569c0..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { MetadataSourceBase } from './metadata-source-base'; -import API_BASE_PATH from '../../../../app.constant'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class MetadataSourceEditor extends MetadataSourceBase implements Wizard { - schema = `${API_BASE_PATH}/ui/MetadataSources`; - steps: WizardStep[] = [ - { - index: 1, - id: 'common', - label: 'label.sp-org-info', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization', - 'contacts' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 3, - id: 'metadata-ui', - label: 'label.metadata-ui', - fields: [ - 'mdui' - ] - }, - { - index: 4, - id: 'descriptor-info', - label: 'label.descriptor-info', - fields: [ - 'serviceProviderSsoDescriptor' - ] - }, - { - index: 5, - id: 'logout-endpoints', - label: 'label.logout-endpoints', - fields: [ - 'logoutEndpoints' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'logoutEndpoints' - ] - } - ] - }, - { - index: 6, - id: 'key-info', - label: 'label.key-info', - fields: [ - 'securityInfo' - ] - }, - { - index: 7, - id: 'assertion', - label: 'label.assertion', - fields: [ - 'assertionConsumerServices' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'assertionConsumerServices' - ] - } - ] - }, - { - index: 8, - id: 'relying-party', - label: 'label.relying-party', - fields: [ - 'relyingPartyOverrides' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'relyingPartyOverrides' - ] - } - ] - }, - { - index: 9, - id: 'attribute', - label: 'label.attribute-release', - fields: [ - 'attributeRelease' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'attributeRelease' - ] - } - ] - } - ]; -} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts deleted file mode 100644 index edf1209b0..000000000 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Wizard, WizardStep } from '../../../../wizard/model'; -import { MetadataResolver } from '../metadata-resolver'; -import { MetadataSourceBase } from './metadata-source-base'; -import API_BASE_PATH from '../../../../app.constant'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class MetadataSourceWizard extends MetadataSourceBase implements Wizard { - schema = `${API_BASE_PATH}/ui/MetadataSources`; - steps: WizardStep[] = [ - { - index: 1, - id: 'common', - label: 'label.name-and-entity-id', - fields: [ - 'serviceProviderName', - 'entityId' - ], - fieldsets: [ - { - type: 'section', - class: ['col-6'], - fields: [ - 'serviceProviderName', - 'entityId' - ] - } - ] - }, - { - index: 2, - id: 'org-info', - label: 'label.org-info', - fields: [ - 'organization', - 'contacts' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 3, - id: 'metadata-ui', - label: 'label.metadata-ui', - fields: [ - 'mdui' - ] - }, - { - index: 4, - id: 'descriptor-info', - label: 'label.descriptor-info', - fields: [ - 'serviceProviderSsoDescriptor' - ] - }, - { - index: 5, - id: 'logout-endpoints', - label: 'label.logout-endpoints', - fields: [ - 'logoutEndpoints' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'logoutEndpoints' - ] - } - ] - }, - { - index: 6, - id: 'key-info', - label: 'label.key-info', - fields: [ - 'securityInfo' - ] - }, - { - index: 7, - id: 'assertion', - label: 'label.assertion', - fields: [ - 'assertionConsumerServices' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'assertionConsumerServices' - ] - } - ] - }, - { - index: 8, - id: 'relying-party', - label: 'label.relying-party', - fields: [ - 'relyingPartyOverrides' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'relyingPartyOverrides' - ] - } - ] - }, - { - index: 9, - id: 'attribute', - label: 'label.attribute-release', - fields: [ - 'attributeRelease' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'attributeRelease' - ] - } - ] - }, - { - index: 10, - id: 'summary', - label: 'label.finished', - fields: [ - 'serviceEnabled' - ], - summary: true - } - ]; -} - diff --git a/ui/src/app/metadata/domain/service/attributes.service.spec.ts b/ui/src/app/metadata/domain/service/attributes.service.spec.ts deleted file mode 100644 index fdb3ded69..000000000 --- a/ui/src/app/metadata/domain/service/attributes.service.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { AttributesService } from './attributes.service'; -import { HttpClient, HttpClientModule, HttpRequest } from '@angular/common/http'; -import { of } from 'rxjs'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; - -describe(`Attributes Service`, () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - AttributesService - ] - }); - }); - - describe('query method', () => { - it(`should call the request attributes method`, waitForAsync(inject([AttributesService, HttpTestingController], - (service: AttributesService) => { - spyOn(service, 'requestAttributes').and.returnValue(of([])); - service.query().subscribe(() => { - expect(service.requestAttributes).toHaveBeenCalled(); - }); - } - ))); - }); - describe('requestAttributes method', () => { - it(`should send an expected GET request`, waitForAsync(inject([AttributesService, HttpTestingController], - (service: AttributesService, backend: HttpTestingController) => { - service.requestAttributes('foo').subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${'foo'}` - && req.method === 'GET'; - }, `GET attributes by term`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/attributes.service.ts b/ui/src/app/metadata/domain/service/attributes.service.ts deleted file mode 100644 index f07cd8e83..000000000 --- a/ui/src/app/metadata/domain/service/attributes.service.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError, shareReplay, map } from 'rxjs/operators'; -import { ReleaseAttribute } from '../model/properties/release-attribute'; -import API_BASE_PATH from '../../../app.constant'; - -const CACHE_SIZE = 1; - -@Injectable() -export class AttributesService { - - readonly endpoint = '/customAttributes'; - readonly base = API_BASE_PATH; - - private cache$: Observable; - - constructor( - private http: HttpClient - ) { } - - query(path: string = this.endpoint): Observable { - if (!this.cache$) { - this.cache$ = this.requestAttributes(path).pipe( - shareReplay(CACHE_SIZE) - ); - } - - return this.cache$; - } - - requestAttributes(path: string): Observable { - return this.http.get(`${this.base}${path}`, {}) - .pipe( - map(attrs => attrs.map((attr: any) => ({ key: attr.name, label: attr.displayName }))), - catchError(err => throwError([])) - ); - } -} diff --git a/ui/src/app/metadata/domain/service/draft.service.spec.ts b/ui/src/app/metadata/domain/service/draft.service.spec.ts deleted file mode 100644 index a8ae3cde8..000000000 --- a/ui/src/app/metadata/domain/service/draft.service.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { EntityDraftService } from './draft.service'; -import { FileBackedHttpMetadataResolver } from '../entity'; -import { MetadataResolver } from '../model'; - -describe(`EntityDraftService`, () => { - let service: EntityDraftService; - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - EntityDraftService - ] - }); - - service = TestBed.get(EntityDraftService); - }); - - describe('query', () => { - it(`should return an observable of the list from the store`, (done: DoneFn) => { - let list = [new FileBackedHttpMetadataResolver()]; - spyOn(service.storage, 'query').and.returnValue(list); - service.query().subscribe(l => { - expect(l).toEqual(list); - done(); - }); - }); - }); - describe('find', () => { - it(`should return an observable of the list from the store`, (done: DoneFn) => { - let id = 'foo'; - let e = new FileBackedHttpMetadataResolver({ id: id }); - let list = [e]; - spyOn(service.storage, 'query').and.returnValue(list); - service.find(id).subscribe(entity => { - expect(entity).toEqual(e); - done(); - }); - }); - - it(`should return a 404 error if not found`, (done: DoneFn) => { - let id = null; - service.find(id).subscribe(null, err => { - expect(err).toEqual(`404 - null not found in cache.`); - done(); - }); - }); - }); - - describe('exists', () => { - it('should check if the provided id exists in storage', () => { - spyOn(service.storage, 'query').and.returnValue([{id: 'bar'} as MetadataResolver]); - expect(service.exists('foo')).toBe(false); - expect(service.exists('bar')).toBe(true); - }); - - it('should use the provided attr', () => { - spyOn(service.storage, 'query').and.returnValue([ - { id: 'bar', serviceProviderName: 'foo' } as MetadataResolver - ]); - expect(service.exists('foo', 'serviceProviderName')).toBe(true); - expect(service.exists('bar', 'serviceProviderName')).toBe(false); - }); - }); - - describe('save', () => { - it('should add the provider to storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'add'); - service.save(resolver).subscribe(); - expect(service.storage.add).toHaveBeenCalledWith(resolver); - }); - }); - - describe('remove', () => { - it('should remove the provider from storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'removeByAttr'); - service.remove(resolver).subscribe(); - expect(service.storage.removeByAttr).toHaveBeenCalledWith(resolver.id, 'id'); - }); - }); - - describe('update', () => { - it('should remove the provider from storage', () => { - const resolver = { id: 'bar' } as MetadataResolver; - const updates = { id: 'foo', serviceProviderName: 'bar' }; - spyOn(service.storage, 'findByAttr').and.returnValue(resolver); - spyOn(service.storage, 'add'); - spyOn(service.storage, 'removeByAttr'); - service.update(resolver).subscribe(); - expect(service.storage.removeByAttr).toHaveBeenCalled(); - expect(service.storage.add).toHaveBeenCalled(); - expect(service.storage.findByAttr).toHaveBeenCalled(); - }); - - it('should return a 404 if not found', () => { - const resolver = { id: 'bar' } as MetadataResolver; - spyOn(service.storage, 'findByAttr').and.returnValue(null); - service.update(resolver).subscribe(null, (err) => { - expect(err).toBe(`404 - ${resolver.id} not found in cache.`); - expect(service.storage.findByAttr).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/service/draft.service.ts b/ui/src/app/metadata/domain/service/draft.service.ts deleted file mode 100644 index 05efe2ef0..000000000 --- a/ui/src/app/metadata/domain/service/draft.service.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Injectable } from '@angular/core'; - -import { Observable, of, throwError } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; - -import { MetadataResolver } from '../../domain/model'; -import { Storage } from '../../../shared/storage'; - -@Injectable() -export class EntityDraftService { - - readonly storage: Storage; - - constructor() { - this.storage = new Storage('provider_drafts'); - } - query(): Observable { - return of(this.storage.query()); - } - - find(id: string, attr: string = 'id'): Observable { - if (!id) { - return throwError(`404 - ${id} not found in cache.`); - } - return this.query().pipe( - switchMap( - list => of(list.find(entity => entity[attr] === id)) - ) - ); - } - - exists(id: string, attr: string = 'id'): boolean { - return this.storage.query().some(entity => entity[attr] === id); - } - - save(provider: MetadataResolver): Observable { - this.storage.add(provider); - return of(provider); - } - - remove(provider: MetadataResolver): Observable { - if (!!provider) { - this.storage.removeByAttr(provider.id, 'id'); - } - return of(provider); - } - - update(provider: MetadataResolver): Observable { - let stored = this.storage.findByAttr(provider.id, 'id'); - if (stored) { - stored = { ...stored, ...provider }; - this.storage.removeByAttr(provider.id, 'id'); - this.storage.add(stored); - return of(stored); - } else { - return throwError(`404 - ${provider.id} not found in cache.`); - } - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/entity-id.service.spec.ts b/ui/src/app/metadata/domain/service/entity-id.service.spec.ts deleted file mode 100644 index 9fdb54970..000000000 --- a/ui/src/app/metadata/domain/service/entity-id.service.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { EntityIdService } from './entity-id.service'; - - -describe(`EntityIdService`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - EntityIdService - ] - }); - }); - - describe('query', () => { - let query = { - term: 'foo', - limit: 10, - offset: 1 - }; - - it(`should send an expected GET request`, waitForAsync(inject([EntityIdService, HttpTestingController], - (service: EntityIdService, backend: HttpTestingController) => { - service.query(query).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.searchEndpoint}` - && req.method === 'GET'; - }, `GET EntityIds by term`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/entity-id.service.ts b/ui/src/app/metadata/domain/service/entity-id.service.ts deleted file mode 100644 index 58845dd09..000000000 --- a/ui/src/app/metadata/domain/service/entity-id.service.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; - -import { Observable, Subject, throwError } from 'rxjs'; -import { map, catchError } from 'rxjs/operators'; - -import { QueryParams } from '../../../core/model/query'; -import { MDUI } from '../model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class EntityIdService { - - readonly searchEndpoint = '/EntityIds/search'; - readonly entitiesEndpoint = '/entities'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) { } - - query(q: QueryParams): Observable { - let params: HttpParams = new HttpParams(); - Object.keys(q).forEach(key => params = params.set(key, q[key])); - const opts = { params: params }; - return this.http - .get(`${this.base}${this.searchEndpoint}`, opts) - .pipe( - map(resp => resp.entityIds), - catchError(err => throwError([])) - ); - } - - preview(id: string): Observable { - return this.http - .get(`${this.base}${this.entitiesEndpoint}/${encodeURIComponent(id)}`, { - headers: new HttpHeaders({ - 'Accept': 'application/xml' - }), - responseType: 'text' - }); - } - - findEntityById(id: string): Observable { - return this.http - .get(`${this.base}${this.entitiesEndpoint}/${encodeURIComponent(id)}`) - .pipe( - map(entity => entity.mdui as MDUI) - ); - } -} diff --git a/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts b/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts deleted file mode 100644 index d6c4a8392..000000000 --- a/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable, of } from 'rxjs'; -import { AbstractControl, FormBuilder, ReactiveFormsModule } from '@angular/forms'; - -let ids = ['foo', 'bar', 'baz']; - -describe(`Entity Validators service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - providers: [ - EntityValidators - ] - }); - }); - - describe('createUniqueIdValidator', () => { - it('should detect that a provided id is already used', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.createUniqueIdValidator(obs), - ctrl = fb.control('foo'); - validator(ctrl).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - - it('should detect that a provided id is NOT already used', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.createUniqueIdValidator(obs), - ctrl = fb.control('hi'); - validator(ctrl).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - }); - - describe('createOrgValidator', () => { - it('should detect that all controls in a group have a value', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - group.get('baz').patchValue('123'); - group.updateValueAndValidity(); - validator(group).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - - it('should not validate if all controls are empty', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - validator(group).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - - it('should not validate if all controls are empty', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(), - group = fb.group({ - foo: '', - bar: '', - baz: '' - }); - group.get('foo').patchValue('123'); - group.get('bar').patchValue('456'); - group.get('baz').patchValue('789'); - group.updateValueAndValidity(); - validator(group).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - - it('should return an empty observable when no control is provided', waitForAsync(inject([FormBuilder], (fb) => { - let validator = EntityValidators.createOrgValidator(); - validator(null).subscribe(next => { - expect(next).toBeFalsy(); - }); - }))); - }); - - describe('createUniqueIdValidator', () => { - it('should detect that a provided id is in the collection', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.existsInCollection(obs), - ctrl = fb.control('foo'); - validator(ctrl).subscribe(next => { - expect(next).toBeNull(); - }); - }))); - - it('should detect that a provided id is not in the collection', waitForAsync(inject([FormBuilder], (fb) => { - let obs = of(ids), - validator = EntityValidators.existsInCollection(obs), - ctrl = fb.control('hi'); - validator(ctrl).subscribe(next => { - expect(next).toBeTruthy(); - }); - }))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/entity-validators.service.ts b/ui/src/app/metadata/domain/service/entity-validators.service.ts deleted file mode 100644 index 638ba0c63..000000000 --- a/ui/src/app/metadata/domain/service/entity-validators.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { map, take, startWith } from 'rxjs/operators'; - -import { AbstractControl } from '@angular/forms'; - -export class EntityValidators { - static createUniqueIdValidator(ids$: Observable) { - return (control: AbstractControl) => { - return ids$.pipe( - map(ids => ids.filter(id => id === control.value)), - map(ids => !!ids.length), - map((isTaken: boolean) => isTaken ? { unique: true } : null), - take(1) - ); - }; - } - - static createOrgValidator() { - return (control: AbstractControl) => { - if (!control || !control.valueChanges) { - return of(null); - } - return control.valueChanges.pipe( - startWith(control.value), - map(values => { - let keys = Object.keys(values), - hasValue = keys.reduce((val, key) => val + (values[key] ? values[key] : ''), ''), - allHaveValue = keys.reduce((val, key) => { - return !values[key] ? false : val; - }, true); - if (!hasValue) { - return true; - } else { - return allHaveValue; - } - }), - map(isValid => { - return !isValid ? { org: true } : null; - }), - take(1) - ); - }; - } - - static existsInCollection(ids$: Observable) { - return (control: AbstractControl) => { - return ids$.pipe( - map(ids => ids.find(id => id === control.value)), - map(ids => ids && !!ids.length), - map((exists: boolean) => exists ? null : { exists: true }), - take(1) - ); - }; - } -} diff --git a/ui/src/app/metadata/domain/service/filter.service.spec.ts b/ui/src/app/metadata/domain/service/filter.service.spec.ts deleted file mode 100644 index bf8147a4d..000000000 --- a/ui/src/app/metadata/domain/service/filter.service.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { MetadataFilterService } from './filter.service'; -import { EntityAttributesFilterEntity } from '../entity'; - -describe(`Metadata Filter Service`, () => { - - const provider = 'foo'; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataFilterService - ] - }); - }); - - describe('query method', () => { - it(`should send an expected GET[] request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - service.query(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters` - && req.method === 'GET'; - }, `GET MetadataFilter collection`); - } - ))); - }); - describe('find method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - service.find(provider, id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters/${id}` - && req.method === 'GET'; - }, `GET MetadataFilter`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected PUT request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - const filter = new EntityAttributesFilterEntity({ resourceId: id }); - service.update(provider, filter).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters/${ id }` - && req.method === 'PUT'; - }, `PUT (update) MetadataFilter`); - } - ))); - }); - describe('save method', () => { - it(`should send an expected POST request`, waitForAsync(inject([MetadataFilterService, HttpTestingController], - (service: MetadataFilterService, backend: HttpTestingController) => { - const id = 'bar'; - const filter = new EntityAttributesFilterEntity({ resourceId: id }); - service.save(provider, filter).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${provider}/Filters` - && req.method === 'POST'; - }, `POST MetadataFilter`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/filter.service.ts b/ui/src/app/metadata/domain/service/filter.service.ts deleted file mode 100644 index fed08adec..000000000 --- a/ui/src/app/metadata/domain/service/filter.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -import { MetadataFilter } from '../../domain/model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class MetadataFilterService { - - readonly endpoint = '/MetadataResolvers'; - readonly order = 'FiltersPositionOrder'; - readonly base = API_BASE_PATH; - readonly path = 'Filters'; - - constructor( - private http: HttpClient - ) { } - query(providerId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.path}`); - } - - find(providerId: string, filterId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.path}/${filterId}`); - } - - update(providerId: string, filter: MetadataFilter): Observable { - return this.http.put(`${this.base}${this.endpoint}/${providerId}/${this.path}/${ filter.resourceId }`, filter); - } - - save(providerId: string, filter: MetadataFilter): Observable { - return this.http.post(`${this.base}${this.endpoint}/${providerId}/${this.path}`, filter); - } - - getOrder(providerId: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${providerId}/${this.order}`); - } - - setOrder(providerId: string, order: string[]): Observable { - return this.http.post(`${this.base}${this.endpoint}/${providerId}/${this.order}`, order); - } - - remove(providerId: string, filterId: string): Observable { - return this.http.delete(`${this.base}${this.endpoint}/${providerId}/${this.path}/${filterId}`); - } -} diff --git a/ui/src/app/metadata/domain/service/list-values.service.spec.ts b/ui/src/app/metadata/domain/service/list-values.service.spec.ts deleted file mode 100644 index a4b17614e..000000000 --- a/ui/src/app/metadata/domain/service/list-values.service.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable, of } from 'rxjs'; -import { ListValuesService } from './list-values.service'; -import { AttributesService } from './attributes.service'; -import { MockAttributeService } from '../../../../testing/attributes.stub'; - -describe(`ListValuesService`, () => { - let service: ListValuesService; - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [ - { provide: AttributesService, useClass: MockAttributeService }, - ListValuesService - ] - }); - service = TestBed.get(ListValuesService); - }); - - describe(`searchStringList method`, () => { - it('should match values', (done: DoneFn) => { - let list = of(['foo', 'bar', 'baz']), - query = of('foo'); - service.searchStringList(list)(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); - - describe(`searchFormats method`, () => { - it('should match the nameid formats', (done: DoneFn) => { - let query = of('unspecified'); - service.searchFormats(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); - - describe(`searchAuthenticationMethods method`, () => { - it('should match the nameid formats', (done: DoneFn) => { - let query = of('TimeSyncToken'); - service.searchAuthenticationMethods(query).subscribe((matches) => { - expect(matches.length).toBe(1); - done(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/service/list-values.service.ts b/ui/src/app/metadata/domain/service/list-values.service.ts deleted file mode 100644 index dff88ea7e..000000000 --- a/ui/src/app/metadata/domain/service/list-values.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; - -import { debounceTime, distinctUntilChanged, combineLatest } from 'rxjs/operators'; -import { AttributesService } from './attributes.service'; -import { ReleaseAttribute } from '../model/properties/release-attribute'; - -@Injectable() -export class ListValuesService { - constructor( - private attributes: AttributesService - ) {} - - readonly nameIdFormats: Observable = of([ - 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', - 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' - ]); - - readonly authenticationMethods: Observable = of([ - 'https://refeds.org/profile/mfa', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' - ]); - - get attributesToRelease(): Observable { - return this.attributes.query(); - } - - searchStringList = (list: Observable): Function => - (text$: Observable) => - text$.pipe( - debounceTime(100), - distinctUntilChanged(), - combineLatest( - list, - (term, formats) => formats.filter( - v => v.toLowerCase().match(term.toLowerCase()) - ) - .slice(0, 4)) - ) - - get searchFormats(): Function { - return this.searchStringList(this.nameIdFormats); - } - get searchAuthenticationMethods(): Function { - return this.searchStringList(this.authenticationMethods); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts deleted file mode 100644 index b96ee0416..000000000 --- a/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { EntityValidators } from './entity-validators.service'; -import { Observable } from 'rxjs'; -import { AbstractControl, FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { ProviderStatusEmitter, ProviderValueEmitter } from './provider-change-emitter.service'; - -describe(`Resolver Change emitter service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter - ] - }); - }); - - describe('ProviderStatusEmitter', () => { - it('should emit values', waitForAsync(inject([ProviderStatusEmitter], (emitter) => { - let val = 'foo'; - emitter.changeEmitted$.subscribe(n => { - expect(n).toEqual(val); - }); - emitter.emit(val); - }))); - }); - - describe('ProviderValueEmitter', () => { - it('should emit values', waitForAsync(inject([ProviderValueEmitter], (emitter) => { - let val = 'foo'; - emitter.changeEmitted$.subscribe(n => { - expect(n).toEqual(val); - }); - emitter.emit(val); - }))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts deleted file mode 100644 index 64c527a04..000000000 --- a/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; - -@Injectable() -export class ProviderValueEmitter implements ChangeEmitter { - private subj = new Subject(); - changeEmitted$ = this.subj.asObservable(); - emit(change: any) { - this.subj.next(change); - } -} - -@Injectable() -export class ProviderStatusEmitter implements ChangeEmitter { - private subj = new Subject(); - changeEmitted$ = this.subj.asObservable(); - emit(change: string) { - this.subj.next(change); - } -} - -export interface ChangeEmitter { - changeEmitted$: Observable; - emit(change: string): void; -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/domain/service/provider.service.spec.ts b/ui/src/app/metadata/domain/service/provider.service.spec.ts deleted file mode 100644 index dabc06e6c..000000000 --- a/ui/src/app/metadata/domain/service/provider.service.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { MetadataProviderService } from './provider.service'; -import { MetadataProvider } from '../model'; - -describe(`Metadata Provider Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - MetadataProviderService - ] - }); - }); - - describe('query method', () => { - it(`should send an expected GET[] request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}` - && req.method === 'GET'; - }, `GET MetadataResolvers collection`); - } - ))); - }); - describe('find method', () => { - it(`should send an expected GET request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - service.find(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${id}` - && req.method === 'GET'; - }, `GET MetadataResolvers collection`); - } - ))); - }); - describe('update method', () => { - it(`should send an expected PUT request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - const provider = { resourceId: id }; - service.update(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}/${id}` - && req.method === 'PUT'; - }, `PUT (update) MetadataResolvers collection`); - } - ))); - }); - describe('save method', () => { - it(`should send an expected POST request`, waitForAsync(inject([MetadataProviderService, HttpTestingController], - (service: MetadataProviderService, backend: HttpTestingController) => { - const id = 'foo'; - const provider = { resourceId: id }; - service.save(provider).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}` - && req.method === 'POST'; - }, `POST MetadataResolvers collection`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/provider.service.ts b/ui/src/app/metadata/domain/service/provider.service.ts deleted file mode 100644 index b48e8876f..000000000 --- a/ui/src/app/metadata/domain/service/provider.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataProvider } from '../../domain/model'; -import API_BASE_PATH from '../../../app.constant'; - - -@Injectable() -export class MetadataProviderService { - - readonly endpoint = '/MetadataResolvers'; - readonly order = '/MetadataResolversPositionOrder'; - readonly base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) {} - query(): Observable { - return this.http.get(`${this.base}${this.endpoint}`).pipe( - map(providers => providers.filter(p => p['@type'] !== 'BaseMetadataResolver')), - map(providers => providers.map(p => ({ ...p, id: p.resourceId }))) - ); - } - - find(id: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${id}`); - } - - update(provider: MetadataProvider): Observable { - return this.http.put(`${this.base}${this.endpoint}/${provider.resourceId}`, provider); - } - - save(provider: MetadataProvider): Observable { - return this.http.post(`${this.base}${this.endpoint}`, provider); - } - - getOrder(): Observable { - return this.http.get<{ [resourceIds: string]: string[] }>(`${this.base}${this.order}`).pipe( - map( - (order: {[resourceIds: string]: string[]}) => order.resourceIds - ) - ); - } - - setOrder(order: string[]): Observable { - return this.http.post(`${this.base}${this.order}`, { resourceIds: order }); - } -} diff --git a/ui/src/app/metadata/domain/service/resolver.service.spec.ts b/ui/src/app/metadata/domain/service/resolver.service.spec.ts deleted file mode 100644 index edace7e1f..000000000 --- a/ui/src/app/metadata/domain/service/resolver.service.spec.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { TestBed, inject, waitForAsync } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { ResolverService } from './resolver.service'; -import API_BASE_PATH from '../../../app.constant'; - - -describe(`Resolver Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - ResolverService - ] - }); - }); - - describe('query', () => { - it(`should send an expected query request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.query().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptors` - && req.method === 'GET'; - }, `GET EntityDescriptors collection`); - } - ))); - - it(`should emit 'true' for 200 Ok`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.query().subscribe((next) => { - expect(next).toBeTruthy(); - }); - - backend.expectOne(`${API_BASE_PATH}/EntityDescriptors`).flush(['foo'], { status: 200, statusText: 'Ok' }); - } - ))); - }); - - describe('queryForAdmin', () => { - it(`should send an expected query request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.queryForAdmin().subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptor/disabledNonAdmin` - && req.method === 'GET'; - }, `GET EntityDescriptors collection for an admin`); - } - ))); - - it(`should emit 'true' for 200 Ok`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.queryForAdmin().subscribe((next) => { - expect(next).toBeTruthy(); - }); - - backend.expectOne(`${API_BASE_PATH}/EntityDescriptor/disabledNonAdmin`).flush(['foo'], { status: 200, statusText: 'Ok' }); - } - ))); - }); - - describe('find', () => { - let id = 'foo'; - - it(`should send an expected GET request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.find(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${API_BASE_PATH}/EntityDescriptor/${id}` - && req.method === 'GET'; - }, `GET EntityDescriptor by id`); - } - ))); - }); - - describe('update', () => { - let id = 'foo', - serviceProviderName = 'Test Provider', - createdBy = 'admin'; - - it(`should send an expected PUT request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.update({id, serviceProviderName, createdBy}).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `${ API_BASE_PATH }/EntityDescriptor/${id}` - && req.method === 'PUT'; - }, `PUT EntityDescriptor by id`); - } - ))); - }); - - describe('create', () => { - let id = 'foo', - serviceProviderName = 'Test Provider', - createdBy = 'admin'; - - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.save({ id, serviceProviderName, createdBy }).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST'; - }, `POST new EntityDescriptor`); - } - ))); - }); - - describe('remove', () => { - let id = 'foo'; - - it(`should send an expected PUT request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.remove(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor/${id}` - && req.method === 'DELETE'; - }, `DELETE an EntityDescriptor`); - } - ))); - }); - - describe('preview', () => { - let id = 'foo'; - - it(`should send an expected GET request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - service.preview(id).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor/${id}` - && req.method === 'GET' - && req.headers.get('Accept') === 'application/xml' - && req.responseType === 'text'; - }, `GET an EntityDescriptor (xml)`); - } - ))); - }); - - describe('upload', () => { - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - const name = 'foo', xml = ''; - service.upload(name, xml).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST' - && req.headers.get('Content-Type') === 'application/xml'; - }, `POST new EntityDescriptor`); - } - ))); - }); - - describe('createFromUrl', () => { - it(`should send an expected POST request`, waitForAsync(inject([ResolverService, HttpTestingController], - (service: ResolverService, backend: HttpTestingController) => { - const name = 'foo', url = 'http://goo.gle'; - service.createFromUrl(name, url).subscribe(); - - backend.expectOne((req: HttpRequest) => { - return req.url === `api/EntityDescriptor` - && req.method === 'POST' - && req.headers.get('Content-Type') === 'application/x-www-form-urlencoded' - && req.body === `metadataUrl=${url}`; - }, `POST new EntityDescriptor`); - } - ))); - }); -}); diff --git a/ui/src/app/metadata/domain/service/resolver.service.ts b/ui/src/app/metadata/domain/service/resolver.service.ts deleted file mode 100644 index a29c7f0d7..000000000 --- a/ui/src/app/metadata/domain/service/resolver.service.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Observable, throwError, of } from 'rxjs'; -import { catchError } from 'rxjs/operators'; -import { MetadataResolver } from '../model'; -import API_BASE_PATH from '../../../app.constant'; - -@Injectable() -export class ResolverService { - - private endpoint = '/EntityDescriptor'; - private base = API_BASE_PATH; - - constructor( - private http: HttpClient - ) {} - - query(): Observable { - return this.http.get(`${ this.base }${ this.endpoint }s`, {}); - } - - queryForAdmin(): Observable { - return this.http.get(`${this.base}${this.endpoint}/disabledNonAdmin`, {}); - } - - find(id: string): Observable { - return this.http.get(`${ this.base }${ this.endpoint }/${ id }`); - } - - update(provider: MetadataResolver): Observable { - return this.http.put(`${this.base}${this.endpoint}/${provider.id}`, provider); - } - - save(provider: MetadataResolver): Observable { - const { id, ...p } = provider; - return this.http.post(`${this.base}${this.endpoint}`, p); - } - - remove(id: string): Observable { - return this.http.delete(`${this.base}${this.endpoint}/${id}`); - } - - upload(name: string, xml: string): Observable { - return this.http.post(`${this.base}${this.endpoint}`, xml, { - headers: new HttpHeaders().set('Content-Type', 'application/xml'), - params: new HttpParams().set('spName', name) - }).pipe(catchError(error => throwError({ - errorCode: error.status, - errorMessage: `Unable to upload file ... ${error.error.errorMessage}` - }))); - } - - createFromUrl(name: string, url: string): Observable { - let body = `metadataUrl=${url}`; - return this.http.post(`${this.base}${this.endpoint}`, body, { - headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'), - params: new HttpParams().set('spName', name) - }).pipe(catchError(error => throwError( - { - errorCode: error.status, - errorMessage: `Unable to upload file ... ${error.error.errorMessage}` - } - ))); - } - - preview(id: string): Observable { - return this.http.get(`${this.base}${this.endpoint}/${id}`, { - headers: new HttpHeaders({ - 'Accept': 'application/xml' - }), - responseType: 'text' - }); - } -} diff --git a/ui/src/app/metadata/domain/utility/configuration.spec.ts b/ui/src/app/metadata/domain/utility/configuration.spec.ts deleted file mode 100644 index 336b71464..000000000 --- a/ui/src/app/metadata/domain/utility/configuration.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { getStepProperties, getDefinition, getPropertyItemSchema, getStepProperty } from './configuration'; -import * as utils from './configuration'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; - -describe('domain utility functions', () => { - describe('getStepProperties function', () => { - it('should return an empty array of schema or schema.properties is not defined', () => { - expect(getStepProperties(null, {})).toEqual([]); - expect(getStepProperties({}, {})).toEqual([]); - }); - - it('should return a formatted list of properties', () => { - expect(getStepProperties(SCHEMA, {}).length).toBe(4); - }); - }); - - describe('getDefinitions method', () => { - it('should retrieve the definitions from the json schema', () => { - const definition = { - id: 'foo', - title: 'bar', - description: 'baz', - type: 'string' - }; - expect(getDefinition('/foo/bar', {bar: definition})).toBe(definition); - }); - }); - - describe('getPropertyItemSchema method', () => { - it('should return null if no items are provided', () => { - expect(getPropertyItemSchema(null, SCHEMA.definitions)).toBeNull(); - }); - it('should retrieve the definitions from the items schema', () => { - expect(getPropertyItemSchema({$ref: 'description'}, SCHEMA.definitions)).toBe(SCHEMA.definitions.description); - }); - it('should return the item itself if no $ref', () => { - let item = {}; - expect(getPropertyItemSchema(item, SCHEMA.definitions)).toBe(item); - }); - }); - - describe('getStepProperty method', () => { - const model = { - name: 'foo', - type: 'bar', - description: 'baz' - }; - it('should return null if no items are provided', () => { - expect(getStepProperty(null, null, SCHEMA.definitions)).toBeNull(); - }); - - it('should retrieve the property $ref definition if available', () => { - const property = getStepProperty( - { $ref: 'description' }, - model, - SCHEMA.definitions - ); - expect(property.type).toBe('string'); - }); - }); -}); - diff --git a/ui/src/app/metadata/domain/utility/configuration.ts b/ui/src/app/metadata/domain/utility/configuration.ts deleted file mode 100644 index 2d5572cb4..000000000 --- a/ui/src/app/metadata/domain/utility/configuration.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Property } from '../model/property'; - -export function getDefinition(path: string, definitions: any): any { - let def = path.split('/').pop(); - return definitions[def]; -} - -export function getPropertyItemSchema(items: any, definitions: any): any { - if (!items) { return null; } - return items.$ref ? getDefinition(items.$ref, definitions) : items; -} - -export function getStepProperty(property, model, definitions): Property { - if (!property) { return null; } - property = property.$ref ? { ...property, ...getDefinition(property.$ref, definitions) } : property; - return { - name: property.title, - value: model, - type: property.type, - items: getPropertyItemSchema(property.items, definitions), - properties: getStepProperties( - property, - model, - definitions - ), - widget: property.widget instanceof String ? { id: property.widget } : { ...property.widget } - }; -} - - -export function getStepProperties(schema: any, model: any, definitions: any = {}): Property[] { - if (!schema || !schema.properties) { return []; } - return Object - .keys(schema.properties) - .map(property => { - return { - ...getStepProperty( - schema.properties[property], - model && model.hasOwnProperty(property) ? model[property] : null, - definitions - ), - id: property - }; - }); -} diff --git a/ui/src/app/metadata/filter/action/collection.action.ts b/ui/src/app/metadata/filter/action/collection.action.ts deleted file mode 100644 index 8c14693e2..000000000 --- a/ui/src/app/metadata/filter/action/collection.action.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; - -export enum FilterCollectionActionTypes { - SELECT_FILTER_REQUEST = '[Metadata Filter Collection] Select Filter Request', - SELECT_FILTER_SUCCESS = '[Metadata Filter Collection] Select Filter Success', - SELECT_FILTER_FAIL = '[Metadata Filter Collection] Select Filter Fail', - - UPDATE_FILTER_REQUEST = '[Metadata Filter Collection] Update Filter Request', - UPDATE_FILTER_SUCCESS = '[Metadata Filter Collection] Update Filter Success', - UPDATE_FILTER_FAIL = '[Metadata Filter Collection] Update Filter Fail', - UPDATE_FILTER_CONFLICT = '[Metadata Filter Collection] Update Filter Conflict', - - LOAD_FILTER_REQUEST = '[Metadata Filter Collection] Load Filter Request', - LOAD_FILTER_SUCCESS = '[Metadata Filter Collection] Load Filter Success', - LOAD_FILTER_ERROR = '[Metadata Filter Collection] Load Filter Error', - - ADD_FILTER_REQUEST = '[Metadata Filter Collection] Add Filter Request', - ADD_FILTER_SUCCESS = '[Metadata Filter Collection] Add Filter Success', - ADD_FILTER_FAIL = '[Metadata Filter Collection] Add Filter Fail', - - REMOVE_FILTER_REQUEST = '[Metadata Filter Collection] Remove Filter Request', - REMOVE_FILTER_SUCCESS = '[Metadata Filter Collection] Remove Filter Success', - REMOVE_FILTER_FAIL = '[Metadata Filter Collection] Remove Filter Fail', - - CLEAR_FILTERS = '[Metadata Filter Collection] Clear Filters', - - SET_ORDER_FILTER_REQUEST = '[Metadata Filter Collection] Set Order Filter Request', - SET_ORDER_FILTER_SUCCESS = '[Metadata Filter Collection] Set Order Filter Success', - SET_ORDER_FILTER_FAIL = '[Metadata Filter Collection] Set Order Filter Fail', - - GET_ORDER_FILTER_REQUEST = '[Metadata Filter Collection] Get Order Filter Request', - GET_ORDER_FILTER_SUCCESS = '[Metadata Filter Collection] Get Order Filter Success', - GET_ORDER_FILTER_FAIL = '[Metadata Filter Collection] Get Order Filter Fail', - - CHANGE_FILTER_ORDER_UP = '[Metadata Filter Collection] Change Order Up', - CHANGE_FILTER_ORDER_DOWN = '[Metadata Filter Collection] Change Order Down' - -} - -export class SelectFilter implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_SUCCESS; - - constructor(public payload: MetadataFilter) { } -} - -export class SelectFilterFail implements Action { - readonly type = FilterCollectionActionTypes.SELECT_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class LoadFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_SUCCESS; - - constructor(public payload: MetadataFilter[]) { } -} - -export class LoadFilterError implements Action { - readonly type = FilterCollectionActionTypes.LOAD_FILTER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_REQUEST; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string; - }) { } -} - -export class UpdateFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS; - - constructor(public payload: { - providerId: string, - update: Update - }) { } -} - -export class UpdateFilterFail implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateFilterConflict implements Action { - readonly type = FilterCollectionActionTypes.UPDATE_FILTER_CONFLICT; - - constructor(public payload: { - providerId: string, - filter: MetadataFilter - }) { } -} - -export class AddFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_REQUEST; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string - }) { } -} - -export class AddFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_SUCCESS; - - constructor(public payload: { - filter: MetadataFilter, - providerId: string - }) { } -} - -export class AddFilterFail implements Action { - readonly type = FilterCollectionActionTypes.ADD_FILTER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_REQUEST; - - constructor(public payload: string) { } -} - -export class RemoveFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveFilterFail implements Action { - readonly type = FilterCollectionActionTypes.REMOVE_FILTER_FAIL; - - constructor(public error: Error) { } -} - -export class ClearFilters implements Action { - readonly type = FilterCollectionActionTypes.CLEAR_FILTERS; -} - -export class SetOrderFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_REQUEST; - - constructor(public payload: { - order: string[], - providerId: string - }) { } -} - -export class SetOrderFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS; - - constructor(public payload: string) { } -} - -export class SetOrderFilterFail implements Action { - readonly type = FilterCollectionActionTypes.SET_ORDER_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class GetOrderFilterRequest implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_REQUEST; - - constructor() { } -} - -export class GetOrderFilterSuccess implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class GetOrderFilterFail implements Action { - readonly type = FilterCollectionActionTypes.GET_ORDER_FILTER_FAIL; - - constructor(public payload: Error) { } -} - -export class ChangeFilterOrderUp implements Action { - readonly type = FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP; - - constructor(public payload: { - id: string, - providerId: string - }) { } -} - -export class ChangeFilterOrderDown implements Action { - readonly type = FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN; - - constructor(public payload: { - id: string, - providerId: string - }) { } -} - -export type FilterCollectionActionsUnion = - | LoadFilterRequest - | LoadFilterSuccess - | LoadFilterError - | AddFilterRequest - | AddFilterSuccess - | AddFilterFail - | RemoveFilterRequest - | RemoveFilterSuccess - | RemoveFilterFail - | SelectFilter - | SelectFilterSuccess - | SelectFilterFail - | UpdateFilterRequest - | UpdateFilterSuccess - | UpdateFilterFail - | UpdateFilterConflict - | ClearFilters - | ChangeFilterOrderDown - | ChangeFilterOrderUp - | GetOrderFilterRequest - | GetOrderFilterSuccess - | GetOrderFilterFail - | SetOrderFilterRequest - | SetOrderFilterSuccess - | SetOrderFilterFail; diff --git a/ui/src/app/metadata/filter/action/editor.action.ts b/ui/src/app/metadata/filter/action/editor.action.ts deleted file mode 100644 index 7ea0a867b..000000000 --- a/ui/src/app/metadata/filter/action/editor.action.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum EditorActionTypes { - UPDATE_STATUS = '[Filter Editor] Update Status', - CLEAR = '[Filter Editor] Clear' -} - -export class UpdateStatus implements Action { - readonly type = EditorActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class ClearEditor implements Action { - readonly type = EditorActionTypes.CLEAR; -} - -export type EditorActionUnion = - | UpdateStatus - | ClearEditor; diff --git a/ui/src/app/metadata/filter/action/filter.action.spec.ts b/ui/src/app/metadata/filter/action/filter.action.spec.ts deleted file mode 100644 index 921f12385..000000000 --- a/ui/src/app/metadata/filter/action/filter.action.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FilterActionTypes, CancelCreateFilter, SelectId } from './filter.action'; - -describe('Filter Actions', () => { - it('should provide actions', () => { - expect(new CancelCreateFilter('id').type).toBe(FilterActionTypes.CANCEL_CREATE_FILTER); - expect(new SelectId('foo').type).toBe(FilterActionTypes.SELECT_ID); - }); -}); diff --git a/ui/src/app/metadata/filter/action/filter.action.ts b/ui/src/app/metadata/filter/action/filter.action.ts deleted file mode 100644 index b13e2ee8f..000000000 --- a/ui/src/app/metadata/filter/action/filter.action.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { MDUI } from '../../domain/model'; - -export enum FilterActionTypes { - SELECT_ID = '[Filter] Select Entity ID', - SELECT_FILTER_TYPE = '[Filter] Select Filter Type', - UPDATE_FILTER = '[Filter] Update Filter', - CANCEL_CREATE_FILTER = '[Filter] Cancel Create Filter', - CLEAR_FILTER = '[Filter] Clear Filter', - LOAD_ENTITY_PREVIEW = '[Filter] Load Preview data', - LOAD_ENTITY_PREVIEW_SUCCESS = '[Filter] Load Preview data success', - LOAD_ENTITY_PREVIEW_ERROR = '[Filter] Load Preview data error', - - RESET_CHANGES = '[Filter] Reset Changes' -} - -export class SelectId implements Action { - readonly type = FilterActionTypes.SELECT_ID; - - constructor(public payload: string) { } -} - -export class LoadEntityPreview implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW; - - constructor(public payload: string) { } -} -export class LoadEntityPreviewSuccess implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS; - - constructor(public payload: MDUI) { } -} -export class LoadEntityPreviewError implements Action { - readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_ERROR; - - constructor(public payload: string) { } -} - -export class CancelCreateFilter implements Action { - readonly type = FilterActionTypes.CANCEL_CREATE_FILTER; - - constructor(public payload: string) { } -} - -export class ClearFilter implements Action { - readonly type = FilterActionTypes.CLEAR_FILTER; -} - -export class UpdateFilterChanges implements Action { - readonly type = FilterActionTypes.UPDATE_FILTER; - - constructor(public payload: Partial) { } -} - -export class SelectFilterType implements Action { - readonly type = FilterActionTypes.SELECT_FILTER_TYPE; - - constructor(public payload: string) { } -} - -export class ResetChanges implements Action { - readonly type = FilterActionTypes.RESET_CHANGES; -} - -export type FilterActionsUnion = - | SelectId - | SelectFilterType - | UpdateFilterChanges - | CancelCreateFilter - | LoadEntityPreview - | LoadEntityPreviewSuccess - | LoadEntityPreviewError - | ClearFilter - | ResetChanges; diff --git a/ui/src/app/metadata/filter/action/search.action.spec.ts b/ui/src/app/metadata/filter/action/search.action.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/action/search.action.ts b/ui/src/app/metadata/filter/action/search.action.ts deleted file mode 100644 index cd9638a54..000000000 --- a/ui/src/app/metadata/filter/action/search.action.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Action } from '@ngrx/store'; - -import { QueryParams } from '../../../core/model/query'; - -export enum SearchActionTypes { - QUERY_ENTITY_IDS = '[Filter] Query Entity Ids', - VIEW_MORE_IDS = '[Filter] View More Ids Modal', - CANCEL_VIEW_MORE = '[Filter] Cancel View More', - CLEAR_SEARCH = '[Filter] Clear Search', - LOAD_ENTITY_IDS_SUCCESS = '[Entity ID Collection] Load Entity Ids Success', - LOAD_ENTITY_IDS_ERROR = '[Entity ID Collection] Load Entity Ids Error' -} - -export class QueryEntityIds implements Action { - readonly type = SearchActionTypes.QUERY_ENTITY_IDS; - - constructor(public payload: QueryParams) { } -} - -export class ViewMoreIds implements Action { - readonly type = SearchActionTypes.VIEW_MORE_IDS; - - constructor(public payload: string) { } -} - -export class ClearSearch implements Action { - readonly type = SearchActionTypes.CLEAR_SEARCH; -} - -export class CancelViewMore implements Action { - readonly type = SearchActionTypes.CANCEL_VIEW_MORE; -} - -export class LoadEntityIdsSuccess implements Action { - readonly type = SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class LoadEntityIdsError implements Action { - readonly type = SearchActionTypes.LOAD_ENTITY_IDS_ERROR; - - constructor(public payload: Error) { } -} - -export type SearchActionsUnion = - | ViewMoreIds - | CancelViewMore - | ClearSearch - | LoadEntityIdsSuccess - | LoadEntityIdsError - | QueryEntityIds; diff --git a/ui/src/app/metadata/filter/component/filter-list.component.html b/ui/src/app/metadata/filter/component/filter-list.component.html deleted file mode 100644 index 780b16a69..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -
Filter NameFilter TypeEnabled?EditDelete
-
- - -
-
{{ i + 1 }}{{ filter.name }}{{ filter['@type'] }} -
-
- - -
- -
-
- - - Edit - - - -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/filter-list.component.scss b/ui/src/app/metadata/filter/component/filter-list.component.scss deleted file mode 100644 index e1a2e17b9..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -:host { - .table { - .td-sm { - max-width: 100px; - } - .td-xs { - max-width: 20px; - } - .td-lg { - width: 30%; - } - - td { - vertical-align: middle; - } - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/filter-list.component.spec.ts b/ui/src/app/metadata/filter/component/filter-list.component.spec.ts deleted file mode 100644 index 44cc812cb..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FilterListComponent } from './filter-list.component'; -import { RouterModule } from '@angular/router'; - -describe('Filter List Component', () => { - let fixture: ComponentFixture; - let instance: FilterListComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - RouterModule - ], - declarations: [ - FilterListComponent - ], - }); - - fixture = TestBed.createComponent(FilterListComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - expect(instance).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/filter/component/filter-list.component.ts b/ui/src/app/metadata/filter/component/filter-list.component.ts deleted file mode 100644 index 4335c865f..000000000 --- a/ui/src/app/metadata/filter/component/filter-list.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { MetadataFilter } from '../../domain/model'; - -import {} from '../../filter/action/collection.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'filter-list', - templateUrl: './filter-list.component.html', - styleUrls: ['./filter-list.component.scss'] -}) -export class FilterListComponent { - - @Input() filters: MetadataFilter[]; - @Input() disabled: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - @Output() onToggleEnabled: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; - - constructor() {} -} diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.html b/ui/src/app/metadata/filter/component/search-dialog.component.html deleted file mode 100644 index 032f056d5..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
- - - -
diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.scss b/ui/src/app/metadata/filter/component/search-dialog.component.scss deleted file mode 100644 index 543de14e3..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .scrolled { - max-height: 400px; - overflow: scroll; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts b/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts deleted file mode 100644 index 325c74dbf..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NgbModalModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { SearchDialogComponent } from './search-dialog.component'; -import { NgbActiveModalStub } from '../../../../testing/modal.stub'; -import * as fromFilter from '../reducer'; -import { SharedModule } from '../../../shared/shared.module'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -describe('Search Dialog', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: SearchDialogComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NgbActiveModal, useClass: NgbActiveModalStub } - ], - imports: [ - ReactiveFormsModule, - NgbModalModule, - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - }), - SharedModule, - MockI18nModule - ], - declarations: [ - SearchDialogComponent - ], - }); - - fixture = TestBed.createComponent(SearchDialogComponent); - instance = fixture.componentInstance; - - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should dispatch a search action', () => { - fixture.detectChanges(); - instance.search('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should dispatch a search action with the default string if not provided', () => { - fixture.detectChanges(); - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.ts b/ui/src/app/metadata/filter/component/search-dialog.component.ts deleted file mode 100644 index 545684077..000000000 --- a/ui/src/app/metadata/filter/component/search-dialog.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, AfterViewInit, Input, OnInit, SimpleChange, SimpleChanges } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable } from 'rxjs'; - -import { Store } from '@ngrx/store'; - -import * as fromFilter from '../reducer'; -import { QueryEntityIds } from '../action/search.action'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -@Component({ - selector: 'search-dialog', - templateUrl: './search-dialog.component.html', - styleUrls: ['./search-dialog.component.scss'] -}) -export class SearchDialogComponent implements OnInit, AfterViewInit { - - @Input() term: string; - @Input() source = 'InCommon'; - - matches$: Observable; - loading$: Observable; - - selected: string; - - limit = 100; - dbounce = 500; - - form: FormGroup = this.fb.group({ - search: ['', [Validators.minLength(4)]], - entityId: [''] - }); - - constructor( - public activeModal: NgbActiveModal, - private store: Store, - private fb: FormBuilder - ) { - this.matches$ = this.store.select(fromFilter.getEntityCollection); - } - - ngOnInit(): void { - let search = this.form.get('search'); - search.setValue(this.term); - } - - ngAfterViewInit(): void { - const { term, limit } = this; - this.store.dispatch(new QueryEntityIds({ term, limit })); - } - - search(term: string = ''): void { - this.store.dispatch(new QueryEntityIds({ term, limit: this.limit })); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/container/edit-filter-step.component.html b/ui/src/app/metadata/filter/container/edit-filter-step.component.html deleted file mode 100644 index ad969fd9e..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter-step.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/edit-filter-step.component.ts b/ui/src/app/metadata/filter/container/edit-filter-step.component.ts deleted file mode 100644 index 963add6bf..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter-step.component.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Subject, Observable, Subscription } from 'rxjs'; - -import * as fromFilter from '../reducer'; -import { FormDefinition, WizardStep } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { UpdateFilterChanges } from '../action/filter.action'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { map, withLatestFrom, filter, takeUntil, distinctUntilChanged, skip } from 'rxjs/operators'; -import * as fromWizard from '../../../wizard/reducer'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; - -@Component({ - selector: 'edit-filter-step-page', - templateUrl: './edit-filter-step.component.html' -}) -export class EditFilterStepComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject<{ value: any[] }>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - definition$: Observable>; - definition: FormDefinition; - schema$: Observable; - bindings$: Observable; - - model$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - isValid: boolean; - type$: Observable; - - validators$: Observable<{ [key: string]: any }>; - status$: Observable; - step$: Observable; - - actions: any; - - defSub: Subscription; - currentPage: string; - - constructor( - private store: Store, - private ref: ChangeDetectorRef - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - - this.defSub = this.definition$.subscribe(d => this.definition = d); - - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.step$ = this.store.select(fromWizard.getCurrent); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.model$ = this.store.select(fromFilter.getSelectedFilter); - this.type$ = this.model$.pipe(map(f => f && f.hasOwnProperty('@type') ? f['@type'] : '')); - - this.valueChangeEmitted$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(changes => this.store.dispatch(new UpdateFilterChanges(changes.value))); - - this.statusChangeEmitted$ - .pipe( - skip(1), - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.model$), - distinctUntilChanged() - ) - .subscribe(([errors, model]) => { - this.updateStatus(errors); - }); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - - this.status$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => { - this.ref.detach(); - setTimeout(() => { - this.ref.detectChanges(); - this.ref.reattach(); - }, 250); - }) - - this.validators$ = this.store.select(fromFilter.getFilterNames).pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom( - this.store.select(fromFilter.getSelectedFilter), - this.definition$ - ), - map(([names, provider, definition]) => definition.getValidators( - names.filter(n => n !== provider.name) - )) - ); - - this.store - .select(fromFilter.getFilter) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(filter => this.filter = filter); - - this.actions = { - preview: (property: any, parameters: any) => { - this.preview(parameters.filterId); - } - }; - - this.store.select(fromWizard.getWizardIndex).pipe(takeUntil(this.ngUnsubscribe)).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.defSub.unsubscribe(); - } - - preview(id: string): void { - this.store.dispatch(new PreviewEntity({ - id, - entity: this.definition.getEntity(this.filter) - })); - } -} - diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.html b/ui/src/app/metadata/filter/container/edit-filter.component.html deleted file mode 100644 index 394c27aea..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
-
-
- -    - - Edit Filter – {{ type$ | async }} - - -
-
-
-
-
-
-
-
- - -
-
-
- -   - -
-
-
-
-
- - -
-
- -
-
-
-
-
-
diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts b/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts deleted file mode 100644 index 9d7e31a46..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromFilter from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { SharedModule } from '../../../shared/shared.module'; -import { EditFilterComponent } from './edit-filter.component'; -import { SchemaFormModule } from 'ngx-schema-form'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { HttpClientModule } from '@angular/common/http'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataFilterTypes } from '../model'; -import { RouterTestingModule } from '@angular/router/testing'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { ActivatedRoute } from '@angular/router'; - -describe('Edit Metadata Filter Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: EditFilterComponent; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { providerId: 'foo' }; - let child: ActivatedRouteStub = new ActivatedRouteStub(); - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter, - FormBuilder, - NgbPopoverConfig, - NavigatorService, - SchemaService, - { - provide: ActivatedRoute, useValue: activatedRoute - } - ], - imports: [ - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - ReactiveFormsModule, - NgbPopoverModule, - SharedModule, - HttpClientModule, - SchemaFormModule.forRoot(), - MockI18nModule - ], - declarations: [ - EditFilterComponent - ], - }); - - fixture = TestBed.createComponent(EditFilterComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch'); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('preview method', () => { - it('should dispatch a preview action', () => { - fixture.detectChanges(); - instance.definition = MetadataFilterTypes.EntityAttributes; - instance.preview('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/container/edit-filter.component.ts b/ui/src/app/metadata/filter/container/edit-filter.component.ts deleted file mode 100644 index 1df2ac5d6..000000000 --- a/ui/src/app/metadata/filter/container/edit-filter.component.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Subject, Observable, Subscription, combineLatest } from 'rxjs'; - -import * as fromFilter from '../reducer'; -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { UpdateFilterRequest } from '../action/collection.action'; -import { CancelCreateFilter } from '../action/filter.action'; -import { PreviewEntity } from '../../domain/action/entity.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { map, filter, takeUntil, withLatestFrom, skip } from 'rxjs/operators'; -import * as fromWizard from '../../../wizard/reducer'; -import { ActivatedRoute } from '@angular/router'; -import { LoadSchemaRequest, SetIndex } from '../../../wizard/action/wizard.action'; - -@Component({ - selector: 'edit-filter-page', - templateUrl: './edit-filter.component.html' -}) -export class EditFilterComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - definition: FormDefinition; - schema$: Observable; - - model$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - isValid$: Observable; - isInvalid$: Observable; - cantSave$: Observable; - type$: Observable; - - status$: Observable; - - actions: any; - - defSub: Subscription; - - formats = NAV_FORMATS; - providerId: string; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)) - - this.defSub = this.definition$.subscribe(d => this.definition = d); - - this.providerId = this.route.snapshot.params.providerId; - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s), takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - let startIndex$ = this.route.firstChild.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.model$ = this.store.select(fromFilter.getSelectedFilter); - this.type$ = this.model$.pipe(map(f => f && f.hasOwnProperty('@type') ? f['@type'] : '')); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - - this.isValid$ = this.store.select(fromFilter.getFilterIsValid); - this.isInvalid$ = this.isValid$.pipe(map(v => !v)); - this.cantSave$ = this.store.select(fromFilter.cantSaveFilter).pipe(skip(1)); - - this.store - .select(fromFilter.getFilter) - .subscribe(filter => this.filter = filter); - - this.actions = { - preview: (property: any, parameters: any) => { - this.preview(parameters.filterId); - } - }; - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.defSub.unsubscribe(); - } - - save(id: string): void { - this.store.dispatch(new UpdateFilterRequest({ - filter: this.filter, - providerId: id - })); - } - - cancel(id: string): void { - this.store.dispatch(new CancelCreateFilter(id)); - } - - preview(id: string): void { - this.store.dispatch(new PreviewEntity({ - id, - entity: this.definition.getEntity(this.filter) - })); - } -} - diff --git a/ui/src/app/metadata/filter/container/filter.component.html b/ui/src/app/metadata/filter/container/filter.component.html deleted file mode 100644 index eb3040a74..000000000 --- a/ui/src/app/metadata/filter/container/filter.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/filter.component.spec.ts b/ui/src/app/metadata/filter/container/filter.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/filter.component.ts b/ui/src/app/metadata/filter/container/filter.component.ts deleted file mode 100644 index bd6054990..000000000 --- a/ui/src/app/metadata/filter/container/filter.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { LoadFilterRequest } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import * as fromProviders from '../../provider/reducer'; -import { SelectProviderRequest } from '../../provider/action/collection.action'; -import { MetadataProvider } from '../../domain/model'; - -@Component({ - selector: 'filter-page', - templateUrl: './filter.component.html', - styleUrls: [], - providers: [] -}) -export class FilterComponent implements OnDestroy { - filterSelectSubscription: Subscription; - filters$: Observable; - provider$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - const params$ = this.route.params.pipe(distinctUntilChanged()); - - this.filterSelectSubscription = params$.pipe( - map(params => new LoadFilterRequest(params.providerId)) - ).subscribe(this.store); - } - - ngOnDestroy() { - this.filterSelectSubscription.unsubscribe(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/container/new-filter-step.component.html b/ui/src/app/metadata/filter/container/new-filter-step.component.html deleted file mode 100644 index f8d748c37..000000000 --- a/ui/src/app/metadata/filter/container/new-filter-step.component.html +++ /dev/null @@ -1,15 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/new-filter-step.component.ts b/ui/src/app/metadata/filter/container/new-filter-step.component.ts deleted file mode 100644 index a927b5d8c..000000000 --- a/ui/src/app/metadata/filter/container/new-filter-step.component.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { FormBuilder } from '@angular/forms'; -import { Subject, Observable } from 'rxjs'; - -import { takeUntil, shareReplay, withLatestFrom, map, switchMap, filter, distinctUntilChanged } from 'rxjs/operators'; - - -import * as fromFilter from '../reducer'; -import { FormDefinition, WizardStep } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { UpdateFilterChanges } from '../action/filter.action'; -import { ActivatedRoute } from '@angular/router'; -import * as fromWizard from '../../../wizard/reducer'; -import { SetIndex } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; - -@Component({ - selector: 'new-filter-step-page', - templateUrl: './new-filter-step.component.html' -}) -export class NewFilterStepComponent implements OnDestroy, OnInit { - - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject<{ value: any[] }>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - definition$: Observable>; - schema$: Observable; - - changes$: Observable; - isSaving$: Observable; - filter: MetadataFilter; - - validators$: Observable<{ [key: string]: any }>; - - options$: Observable[]>; - - step$: Observable; - - currentPage: string; - - constructor( - private store: Store, - private schemaService: SchemaService, - private fb: FormBuilder, - private route: ActivatedRoute - ) { - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.changes$ = this.store.select(fromFilter.getFilter); - this.step$ = this.store.select(fromWizard.getCurrent); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.schema$ = this.store.select(fromWizard.getSchema); - - this.validators$ = this.definition$.pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.store.select(fromFilter.getFilterNames)), - map(([definition, names]) => definition.getValidators(names)) - ); - - let startIndex$ = this.route.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - } - - ngOnInit(): void { - this.valueChangeEmitted$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(changes => this.store.dispatch(new UpdateFilterChanges(changes.value))); - this.statusChangeEmitted$ - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged() - ) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store - .select(fromFilter.getFilter) - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.definition$), - map(([filter, definition]) => definition.parser(filter)) - ) - .subscribe(filter => this.filter = filter); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/filter/container/new-filter.component.html b/ui/src/app/metadata/filter/container/new-filter.component.html deleted file mode 100644 index 3976b1ff9..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.html +++ /dev/null @@ -1,63 +0,0 @@ -
-
-
-
-
- -    - New Filter - -
-
-
-
-
-
-
-
- - -
-
-
- -   - -
-
-
-
-
- - -
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/new-filter.component.spec.ts b/ui/src/app/metadata/filter/container/new-filter.component.spec.ts deleted file mode 100644 index 18c7e067e..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NewFilterComponent } from './new-filter.component'; -import * as fromFilter from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { SharedModule } from '../../../shared/shared.module'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { SchemaService } from '../../../schema-form/service/schema.service'; -import { HttpClientModule } from '@angular/common/http'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { RouterTestingModule } from '@angular/router/testing'; -import { ActivatedRoute } from '@angular/router'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; - -describe('New Metadata Filter Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: NewFilterComponent; - - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { providerId: 'foo' }; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderStatusEmitter, - ProviderValueEmitter, - FormBuilder, - NgbPopoverConfig, - NavigatorService, - SchemaService, - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry }, - { - provide: ActivatedRoute, useValue: activatedRoute - } - ], - imports: [ - StoreModule.forRoot({ - 'filter': combineReducers(fromFilter.reducers), - 'wizard': combineReducers(fromWizard.reducers) - }), - ReactiveFormsModule, - NgbPopoverModule, - SharedModule, - HttpClientModule, - SchemaFormModule.forRoot(), - MockI18nModule, - RouterTestingModule - ], - declarations: [ - NewFilterComponent - ], - }); - - fixture = TestBed.createComponent(NewFilterComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('cancel method', () => { - it('should dispatch a cancel changes action', () => { - fixture.detectChanges(); - instance.cancel(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/container/new-filter.component.ts b/ui/src/app/metadata/filter/container/new-filter.component.ts deleted file mode 100644 index 51907707a..000000000 --- a/ui/src/app/metadata/filter/container/new-filter.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Validators, FormBuilder, FormGroup } from '@angular/forms'; -import { Subject, Observable, of, combineLatest } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { takeUntil, withLatestFrom, map, filter, distinctUntilChanged, skip } from 'rxjs/operators'; - -import * as fromFilter from '../reducer'; -import { MetadataFilterEditorTypes, MetadataFilterTypes } from '../model'; -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { AddFilterRequest } from '../action/collection.action'; -import { CancelCreateFilter, SelectFilterType } from '../action/filter.action'; -import * as fromWizard from '../../../wizard/reducer'; -import { LoadSchemaRequest, SetDefinition, SetIndex } from '../../../wizard/action/wizard.action'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'new-filter-page', - templateUrl: './new-filter.component.html' -}) -export class NewFilterComponent implements OnDestroy, OnInit { - - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - schema$: Observable; - - isSaving$: Observable; - filter: MetadataFilter; - isValid$: Observable; - isInvalid$: Observable; - cantSave$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - form: FormGroup = this.fb.group({ - type: ['', Validators.required] - }); - - options$: Observable[]>; - - formats = NAV_FORMATS; - - status$: Observable; - - type$: Observable = this.store.select(fromFilter.getFilterType); - - constructor( - private store: Store, - private fb: FormBuilder, - private route: ActivatedRoute - ) { - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - this.isValid$ = this.store.select(fromFilter.getFilterIsValid); - this.isInvalid$ = this.isValid$.pipe(map(v => !v)); - - this.cantSave$ = this.store.select(fromFilter.cantSaveFilter).pipe(skip(1)); - - this.definition$ = this.store.select(fromFilter.getFilterType).pipe( - takeUntil(this.ngUnsubscribe), - filter(t => !!t), - map(t => MetadataFilterTypes[t]) - ); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s), takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - let startIndex$ = this.route.params.pipe(map(p => p.form || 'filters'), takeUntil(this.ngUnsubscribe)); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.status$ = this.store.select(fromFilter.getInvalidEditorForms); - this.options$ = of(Object.values(MetadataFilterTypes)); - - this.form.get('type').valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged() - ) - .subscribe(type => { - this.store.dispatch(new SelectFilterType(type)); - }); - - this.type$.pipe( - takeUntil(this.ngUnsubscribe) - ).subscribe((t: string) => { - if (t) { - this.store.dispatch(new SetDefinition({ - ...MetadataFilterEditorTypes.find(def => def.type === t) - })); - } - }); - } - - ngOnInit(): void { - this.store - .select(fromFilter.getFilter) - .pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.definition$), - map(([filter, definition]) => definition.parser(filter)) - ) - .subscribe(filter => this.filter = filter); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - save(): void { - this.store.dispatch(new AddFilterRequest({ - filter: this.filter, - providerId: this.route.snapshot.params.providerId - })); - } - - cancel(): void { - this.store.dispatch(new CancelCreateFilter(this.route.snapshot.params.providerId)); - } -} diff --git a/ui/src/app/metadata/filter/container/select-filter.component.html b/ui/src/app/metadata/filter/container/select-filter.component.html deleted file mode 100644 index 3793ba3bf..000000000 --- a/ui/src/app/metadata/filter/container/select-filter.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/select-filter.component.scss b/ui/src/app/metadata/filter/container/select-filter.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/select-filter.component.spec.ts b/ui/src/app/metadata/filter/container/select-filter.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/filter/container/select-filter.component.ts b/ui/src/app/metadata/filter/container/select-filter.component.ts deleted file mode 100644 index 55bdabb4e..000000000 --- a/ui/src/app/metadata/filter/container/select-filter.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { SelectFilter } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import { MetadataFilterEditorTypes } from '../model'; -import { SetDefinition } from '../../../wizard/action/wizard.action'; - -@Component({ - selector: 'select-filter-page', - templateUrl: './select-filter.component.html', - styleUrls: ['./select-filter.component.scss'], - providers: [NgbPopoverConfig] -}) -export class SelectFilterComponent implements OnDestroy { - actionsSubscription: Subscription; - filterSubscription: Subscription; - filter$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - this.actionsSubscription = this.route.params.pipe( - distinctUntilChanged(), - map(params => new SelectFilter(params.filterId)) - ).subscribe(store); - - this.filter$ = this.store.select(fromFilter.getSelectedFilter); - - this.filterSubscription = this.filter$.subscribe(f => { - this.setDefinition(f); - }); - } - - setDefinition(filter: MetadataFilter): void { - if (filter) { - this.store.dispatch(new SetDefinition({ - ...MetadataFilterEditorTypes.find(def => def.type === filter['@type']) - })); - } - } - - ngOnDestroy() { - this.actionsSubscription.unsubscribe(); - this.filterSubscription.unsubscribe(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/effect/collection.effect.spec.ts b/ui/src/app/metadata/filter/effect/collection.effect.spec.ts deleted file mode 100644 index d89c931ad..000000000 --- a/ui/src/app/metadata/filter/effect/collection.effect.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { MetadataFilter } from '../../domain/model'; -import { FilterCollectionEffects } from './collection.effect'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import { Router } from '@angular/router'; -import { RouterStub } from '../../../../testing/router.stub'; - -describe('Filter Collection Effects', () => { - let effects: FilterCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - FilterCollectionEffects, - { - provide: MetadataProviderService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (f: MetadataFilter) => { }, - update: (f: MetadataFilter) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(FilterCollectionEffects); - draftService = TestBed.get(MetadataProviderService); - actions$ = TestBed.get(Actions); - }); -}); diff --git a/ui/src/app/metadata/filter/effect/collection.effect.ts b/ui/src/app/metadata/filter/effect/collection.effect.ts deleted file mode 100644 index db94eacaf..000000000 --- a/ui/src/app/metadata/filter/effect/collection.effect.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute, Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { switchMap, map, catchError, tap, combineLatest, skipWhile, debounceTime, withLatestFrom } from 'rxjs/operators'; - -import { - LoadFilterRequest, - LoadFilterSuccess, - LoadFilterError, - UpdateFilterRequest, - UpdateFilterSuccess, - UpdateFilterFail, - SelectFilter, - SelectFilterSuccess, - SelectFilterFail, - AddFilterRequest, - AddFilterSuccess, - AddFilterFail, - GetOrderFilterRequest, - GetOrderFilterSuccess, - GetOrderFilterFail, - SetOrderFilterRequest, - SetOrderFilterSuccess, - SetOrderFilterFail, - ChangeFilterOrderUp, - ChangeFilterOrderDown, - RemoveFilterRequest, - RemoveFilterSuccess, - RemoveFilterFail, - UpdateFilterConflict -} from '../action/collection.action'; -import { FilterCollectionActionTypes } from '../action/collection.action'; -import * as fromFilter from '../reducer'; -import * as fromProvider from '../../provider/reducer'; -import { MetadataFilter } from '../../domain/model'; -import { array_move } from '../../../shared/util'; -import { MetadataFilterService } from '../../domain/service/filter.service'; -import { SelectProviderRequest } from '../../provider/action/collection.action'; -import { UpdateFilterChanges, ClearFilter } from '../action/filter.action'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { NotificationType, Notification } from '../../../notification/model/notification'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromI18n from '../../../i18n/reducer'; - -/* istanbul ignore next */ -@Injectable() -export class FilterCollectionEffects { - - @Effect() - loadFilters$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.LOAD_FILTER_REQUEST), - map(action => action.payload), - skipWhile(providerId => !providerId), - switchMap(providerId => - this.filterService - .query(providerId) - .pipe( - map(filters => new LoadFilterSuccess(filters)), - catchError(error => of(new LoadFilterError(error))) - ) - ) - ); - @Effect() - selectFilterRequest$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SELECT_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([filterId, providerId]) => { - return this.filterService - .find(providerId, filterId) - .pipe( - map(p => new SelectFilterSuccess(p)), - catchError(error => of(new SelectFilterFail(error))) - ); - } - ) - ); - - @Effect() - selectFilterRequestSetChanges$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SELECT_FILTER_SUCCESS), - map(action => action.payload), - map(filter => new UpdateFilterChanges({...filter, type: filter['@type']})) - ); - - @Effect() - addFilter$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_REQUEST), - map(action => action.payload), - switchMap(({filter, providerId}) => { - return this.filterService - .save(providerId, filter as MetadataFilter) - .pipe( - map(saved => new AddFilterSuccess({ - filter: saved, - providerId: providerId - })), - catchError(error => of(new AddFilterFail(error))) - ); - }) - ); - @Effect({ dispatch: false }) - addFilterSuccessRedirect$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(action => action.payload), - tap(({ providerId }) => this.navigateToParent(providerId)) - ); - - @Effect() - addFilterSuccessReloadParent$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(action => action.payload), - map(({ providerId }) => new SelectProviderRequest(providerId)) - ); - - @Effect() - addFilterSuccessResetState$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - map(() => new ClearFilter()) - ); - - @Effect() - addFilterFailNotification$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_FAIL), - map(action => action.payload.error), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - const message = error.errorMessage || error.cause || 'message.filter-fail'; - const translated = this.i18nService.translate(message, null, messages); - return new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${translated}`, - 8000 - ) - ); - }) - ); - - @Effect() - updateFilterFailNotification$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_FAIL), - map(action => action.payload.error), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - const message = error.errorMessage || error.cause || 'message.filter-fail'; - const translated = this.i18nService.translate(message, null, messages); - return new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${translated}`, - 8000 - ) - ); - }) - ); - - @Effect() - updateFilter$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getSelectedFilter)), - switchMap(([action, original]) => { - const { filter, providerId } = action; - delete filter.modifiedDate; - delete filter.createdDate; - - const updates = ({ ...original, ...filter }); - - return this.filterService - .update(providerId, updates) - .pipe( - map(resp => new UpdateFilterSuccess({ - providerId, - update: { - id: resp.resourceId, - changes: resp - } - })), - catchError(err => of(err.status === 409 ? new UpdateFilterConflict({ - filter: updates, - providerId - }) : new UpdateFilterFail(err))) - ); - }) - ); - @Effect() - updateFilterSuccessReloadProvider$ = this.actions$.pipe( - ofType( - FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS, - FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS, - FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS - ), - map((action) => { - const { payload } = action; - const { providerId } = payload; - return new SelectProviderRequest(providerId); - }) - ); - - @Effect({ dispatch: false }) - updateFilterSuccessRedirect$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS), - map(action => action.payload), - tap(({ providerId }) => this.navigateToParent(providerId)) - ); - - @Effect() - updateFilterSuccessResetState$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS), - map(() => new ClearFilter()) - ); - - @Effect() - getOrderWithLoad$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.LOAD_FILTER_SUCCESS), - map(() => new GetOrderFilterRequest()) - ); - - @Effect() - getOrder$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.GET_ORDER_FILTER_REQUEST), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([action, providerId]) => - this.filterService.getOrder(providerId).pipe( - map(order => new GetOrderFilterSuccess(order)), - catchError(err => of(new GetOrderFilterFail(err))) - ) - ) - ); - - @Effect() - setOrder$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SET_ORDER_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromFilter.getPluginFilterOrder) - ), - switchMap(([{order, providerId}, pluginOrder]) => - this.filterService.setOrder(providerId, [...pluginOrder, ...order]).pipe( - map(() => new SetOrderFilterSuccess(providerId)), - catchError(err => of(new SetOrderFilterFail(err))) - ) - ) - ); - - @Effect() - getOrderOnUpdate$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.SET_ORDER_FILTER_SUCCESS), - map(() => new GetOrderFilterRequest()) - ); - - @Effect() - changeOrderUp$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_UP), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getAdditionalFilterOrder)), - map(([{ id, providerId }, order]) => { - const index = order.indexOf(id); - if (index > 0) { - const newOrder = array_move(order, index, index - 1); - return new SetOrderFilterRequest({ order: newOrder, providerId }); - } else { - return new SetOrderFilterFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - @Effect() - changeOrderDown$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.CHANGE_FILTER_ORDER_DOWN), - map(action => action.payload), - withLatestFrom(this.store.select(fromFilter.getAdditionalFilterOrder)), - map(([{id, providerId}, order]) => { - const index = order.indexOf(id); - if (index < order.length - 1) { - const newOrder = array_move(order, index, index + 1); - return new SetOrderFilterRequest({ order: newOrder, providerId }); - } else { - return new SetOrderFilterFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - @Effect() - removeFilterRequest$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.REMOVE_FILTER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - switchMap(([filterId, providerId]) => - this.filterService.remove(providerId, filterId).pipe( - map(removed => new RemoveFilterSuccess(removed)), - catchError(err => of(new RemoveFilterFail(err))) - ) - ) - ); - - @Effect() - removeFilterSuccess$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - map(([filter, providerId]) => new LoadFilterRequest(providerId)) - ); - - constructor( - private actions$: Actions, - private router: Router, - private route: ActivatedRoute, - private filterService: MetadataFilterService, - private store: Store, - private i18nService: I18nService - ) { } - - navigateToParent(id) { - this.router.navigate( - [ - '/', - 'metadata', - 'provider', - id, - 'configuration', - 'options' - ], - { - fragment: 'filters' - } - ); - } -} diff --git a/ui/src/app/metadata/filter/effect/editor.effect.ts b/ui/src/app/metadata/filter/effect/editor.effect.ts deleted file mode 100644 index bd8eaf261..000000000 --- a/ui/src/app/metadata/filter/effect/editor.effect.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { SchemaService } from '../../../schema-form/service/schema.service'; - -import { map, switchMap, catchError, debounceTime } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { - LoadSchemaRequest, - LoadSchemaSuccess, - LoadSchemaFail, - SetDefinition, - WizardActionTypes -} from '../../../wizard/action/wizard.action'; -import { ResetChanges } from '../action/filter.action'; - -import { CancelContentionAction, ContentionActionTypes } from '../../../contention/action/contention.action'; - -@Injectable() -export class EditorEffects { - - @Effect() - $loadSchemaRequest = this.actions$.pipe( - ofType(WizardActionTypes.LOAD_SCHEMA_REQUEST), - map(action => action.payload), - debounceTime(100), - switchMap((schemaPath: string) => - this.schemaService - .get(schemaPath) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaFail(error))) - ) - ) - ); - - @Effect() - $resetChanges = this.actions$.pipe( - ofType(WizardActionTypes.SET_DEFINITION), - map(() => new ResetChanges()) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new ResetChanges()) - ); - - constructor( - private schemaService: SchemaService, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/filter/effect/filter.effect.ts b/ui/src/app/metadata/filter/effect/filter.effect.ts deleted file mode 100644 index 2bdc60bc9..000000000 --- a/ui/src/app/metadata/filter/effect/filter.effect.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, switchMap, catchError, withLatestFrom, tap, combineLatest, skipWhile } from 'rxjs/operators'; - -import { ActivatedRoute, Router } from '@angular/router'; - -import * as fromFilter from '../reducer'; -import * as fromProvider from '../../provider/reducer'; -import * as fromRoot from '../../../app.reducer'; -import { - FilterCollectionActionTypes, - UpdateFilterConflict, - UpdateFilterRequest -} from '../action/collection.action'; -import { - SelectId, - FilterActionTypes, - LoadEntityPreviewSuccess, - LoadEntityPreviewError, - CancelCreateFilter -} from '../action/filter.action'; -import { EntityIdService } from '../../domain/service/entity-id.service'; -import { ShowContentionAction } from '../../../contention/action/contention.action'; -import { MetadataFilter } from '../../domain/model'; -import { ContentionService } from '../../../contention/service/contention.service'; -import { MetadataFilterService } from '../../domain/service/filter.service'; - -@Injectable() -export class FilterEffects { - - @Effect() - loadEntityMdui$ = this.actions$.pipe( - ofType(FilterActionTypes.SELECT_ID), - map(action => action.payload), - switchMap(query => - this.idService.findEntityById(query).pipe( - map(data => new LoadEntityPreviewSuccess(data)), - catchError(error => of(new LoadEntityPreviewError(error))) - ) - ) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.UPDATE_FILTER_CONFLICT), - map(action => action.payload), - withLatestFrom( - this.store.select(fromFilter.getSelectedFilter) - ), - switchMap(([{ providerId, filter }, current]) => - this.filterService.find(providerId, filter.resourceId).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, filter, data, { - resolve: (obj) => this.store.dispatch(new UpdateFilterRequest({ - filter: { ...obj }, - providerId - })), - reject: (obj) => this.store.dispatch(new CancelCreateFilter(providerId)) - }))) - ) - ) - ); - - @Effect({ dispatch: false }) - cancelChanges$ = this.actions$.pipe( - ofType(FilterActionTypes.CANCEL_CREATE_FILTER), - map(action => action.payload), - tap((providerId) => { - this.router.navigate(['/', 'metadata', 'provider', providerId, 'configuration']); - }) - ); - - constructor( - private store: Store, - private actions$: Actions, - private router: Router, - private route: ActivatedRoute, - private idService: EntityIdService, - private filterService: MetadataFilterService, - private contentionService: ContentionService - ) { } -} diff --git a/ui/src/app/metadata/filter/effect/search.effect.ts b/ui/src/app/metadata/filter/effect/search.effect.ts deleted file mode 100644 index 2225bd91a..000000000 --- a/ui/src/app/metadata/filter/effect/search.effect.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; - -import { catchError, map, debounceTime, switchMap, withLatestFrom } from 'rxjs/operators'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { State } from '../../../app.reducer'; - -import { - SearchActionTypes, - QueryEntityIds, - LoadEntityIdsError, - LoadEntityIdsSuccess, - ViewMoreIds, - CancelViewMore -} from '../action/search.action'; - -import { SearchDialogComponent } from '../component/search-dialog.component'; -import { EntityIdService } from '../../domain/service/entity-id.service'; -import { from } from 'rxjs'; -import { SelectId } from '../action/filter.action'; -import * as fromProvider from '../../provider/reducer'; - - -@Injectable() -export class SearchIdEffects { - - private dbounce = 500; - @Effect() - loadEntityIds$ = this.actions$.pipe( - ofType(SearchActionTypes.QUERY_ENTITY_IDS), - map(action => action.payload), - debounceTime(this.dbounce), - withLatestFrom(this.store.select(fromProvider.getSelectedProviderId)), - map(([query, resourceId]) => ({ ...query, resourceId })), - switchMap(query => - this.idService.query(query).pipe( - map(ids => new LoadEntityIdsSuccess(ids)), - catchError(error => of(new LoadEntityIdsError(error))) - ) - ) - ); - - @Effect() - viewMore$ = this.actions$.pipe( - ofType(SearchActionTypes.VIEW_MORE_IDS), - map(action => action.payload), - switchMap(q => { - const modal = this.modalService.open(SearchDialogComponent) as NgbModalRef; - const res = modal.result; - modal.componentInstance.term = q; - return from(res).pipe( - map(id => new SelectId(id)), - catchError(() => of(new CancelViewMore())) - ); - }) - ); - - constructor( - private actions$: Actions, - private modalService: NgbModal, - private idService: EntityIdService, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/filter/filter.module.ts b/ui/src/app/metadata/filter/filter.module.ts deleted file mode 100644 index e7c3bfcff..000000000 --- a/ui/src/app/metadata/filter/filter.module.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { ReactiveFormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { NewFilterComponent } from './container/new-filter.component'; -import { reducers } from './reducer'; -import { FilterEffects } from './effect/filter.effect'; -import { NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import { SearchDialogComponent } from './component/search-dialog.component'; -import { SharedModule } from '../../shared/shared.module'; -import { EditFilterComponent } from './container/edit-filter.component'; -import { SelectFilterComponent } from './container/select-filter.component'; -import { SearchIdEffects } from './effect/search.effect'; -import { FilterExistsGuard } from './guard/filter-exists.guard'; -import { DomainModule } from '../domain/domain.module'; -import { ModuleWithProviders } from '@angular/compiler/src/core'; -import { FilterCollectionEffects } from './effect/collection.effect'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { I18nModule } from '../../i18n/i18n.module'; -import { FilterComponent } from './container/filter.component'; -import { FilterListComponent } from './component/filter-list.component'; -import { EditFilterStepComponent } from './container/edit-filter-step.component'; -import { NewFilterStepComponent } from './container/new-filter-step.component'; - -@NgModule({ - declarations: [ - NewFilterComponent, - NewFilterStepComponent, - EditFilterComponent, - EditFilterStepComponent, - SelectFilterComponent, - SearchDialogComponent, - FilterComponent, - FilterListComponent - ], - entryComponents: [ - SearchDialogComponent - ], - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPopoverModule, - NgbModalModule, - SharedModule, - DomainModule, - HttpClientModule, - RouterModule, - FormModule, - I18nModule - ], - exports: [ - FilterListComponent - ] -}) -export class FilterModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootFilterModule, - providers: [ - FilterExistsGuard - ] - }; - } -} - -@NgModule({ - imports: [ - FilterModule, - StoreModule.forFeature('filter', reducers), - EffectsModule.forFeature([FilterEffects, SearchIdEffects, FilterCollectionEffects]), - ], -}) -export class RootFilterModule { } diff --git a/ui/src/app/metadata/filter/guard/filter-exists.guard.ts b/ui/src/app/metadata/filter/guard/filter-exists.guard.ts deleted file mode 100644 index 048e5ae9f..000000000 --- a/ui/src/app/metadata/filter/guard/filter-exists.guard.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; -import { select, Store } from '@ngrx/store'; -import { Observable, of } from 'rxjs'; -import { catchError, filter, map, switchMap, take, tap } from 'rxjs/operators'; - -import * as fromCollection from '../reducer'; -import { MetadataProviderService } from '../../domain/service/provider.service'; - -/** - * Guards are hooks into the route resolution process, providing an opportunity - * to inform the router's navigation process whether the route should continue - * to activate this route. Guards must return an of true or false. - */ -@Injectable() -export class FilterExistsGuard implements CanActivate { - constructor( - private store: Store, - private mdResolverService: MetadataProviderService, - private router: Router - ) { } - - waitForCollectionToLoad(): Observable { - return this.store.pipe( - select(fromCollection.getFilterCollectionIsLoaded), - filter(loaded => loaded), - take(1) - ); - } - - hasFilterInStore(id: string): Observable { - return this.store.pipe( - select(fromCollection.getFilterEntities), - map(entities => !!entities[id]), - take(1) - ); - } - - hasFilterInApi(id: string): Observable { - return this.store.select(fromCollection.getAllFilters).pipe( - map(filters => filters.find(f => f.resourceId === id)), - map(filter => !!filter), - catchError(() => { - this.router.navigate(['/dashboard']); - return of(false); - }) - ); - } - - hasFilter(id: string): Observable { - return this.hasFilterInStore(id).pipe( - switchMap(inStore => { - if (inStore) { - return of(inStore); - } - - return this.hasFilterInApi(id); - }) - ); - } - canActivate(route: ActivatedRouteSnapshot): Observable { - return this.waitForCollectionToLoad().pipe( - switchMap(() => this.hasFilter(route.params['id'])) - ); - } -} diff --git a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts deleted file mode 100644 index 6117c9427..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { EntityAttributesFilter } from './entity-attributes.filter'; - -export const EntityAttributesFilterConfiguration: Wizard = { - ...EntityAttributesFilter, - steps: [ - { - id: 'common', - label: 'label.target', - index: 1, - fields: [ - 'name', - '@type', - 'resourceId', - 'filterEnabled', - 'entityAttributesFilterTarget' - ] - }, - { - id: 'options', - label: 'label.options', - index: 2, - initialValues: [], - fields: [ - 'relyingPartyOverrides' - ] - }, - { - id: 'attributes', - label: 'label.attributes', - index: 3, - fields: [ - 'attributeRelease' - ] - } - ] -}; diff --git a/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts b/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts deleted file mode 100644 index 552b94023..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes.filter.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { EntityAttributesFilter } from './entity-attributes.filter'; - -describe('Entity Attributes filter form', () => { - describe('getValidators', () => { - it('should return an empty object for validators', () => { - expect(Object.keys(EntityAttributesFilter.getValidators())).toEqual([ - '/', - '/name', - '/relyingPartyOverrides', - '/entityAttributesFilterTarget' - ]); - }); - - describe('name `/name` validator', () => { - const validators = EntityAttributesFilter.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = EntityAttributesFilter.getValidators(['foo', 'bar']); - - it('should return a list of child errors', () => { - expect(validators['/']({ name: 'foo' }, { path: '/name' }, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, { path: '/foo' }, {})).toBeUndefined(); - }); - }); - }); - - describe('transformer', () => { - it('should add modify the object', () => { - expect(EntityAttributesFilter.formatter({})).toEqual({}); - expect(EntityAttributesFilter.parser({}).relyingPartyOverrides).toBeDefined(); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes.filter.ts deleted file mode 100644 index b310e6a85..000000000 --- a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { removeNulls } from '../../../shared/util'; -import { EntityAttributesFilterEntity } from '../../domain/entity'; -import { RegexValidator } from '../../../shared/validation/regex.validator'; -import { getFilterNames } from '../reducer'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const EntityAttributesFilter: FormDefinition = { - label: 'EntityAttributes', - type: 'EntityAttributes', - schema: `${API_BASE_PATH}/ui/EntityAttributesFilters`, - getEntity(filter: MetadataFilter): EntityAttributesFilterEntity { - return new EntityAttributesFilterEntity(filter); - }, - validatorParams: [getFilterNames], - getValidators(namesList: string[] = []): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, { path: `/${key}` }, form_current) : null; - if (error && error.invalidate) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value], - invalidate: true - } : null; - return err; - }, - '/relyingPartyOverrides': (value, property, form) => { - if (!value.signAssertion && value.dontSignResponse) { - return { - code: 'INVALID_SIGNING', - path: `#${property.path}`, - message: 'message.invalid-signing', - params: [value], - invalidate: false - }; - } - return null; - }, - '/entityAttributesFilterTarget': (value, property, form) => { - if (!form || !form.value || !form.value.entityAttributesFilterTarget || - form.value.entityAttributesFilterTarget.entityAttributesFilterTargetType !== 'REGEX') { - return null; - } - return checkRegex(value.value[0]) ? null : { - code: 'INVALID_REGEX', - path: `#${property.path}`, - message: 'message.invalid-regex-pattern', - params: [value.value[0]], - invalidate: true - }; - }, - }; - return validators; - }, - parser: (changes: any): MetadataFilter => { - return { - ...changes, - relyingPartyOverrides: removeNulls(new EntityAttributesFilterEntity(changes).relyingPartyOverrides) - }; - }, - formatter: (changes: MetadataFilter): any => changes -}; diff --git a/ui/src/app/metadata/filter/model/index.ts b/ui/src/app/metadata/filter/model/index.ts deleted file mode 100644 index e07edc9f8..000000000 --- a/ui/src/app/metadata/filter/model/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { EntityAttributesFilter } from './entity-attributes.filter'; -import { NameIDFilter } from './nameid.filter'; -import { EntityAttributesFilterConfiguration } from './entity-attributes-configuration.filter'; -import { NameIDFilterConfiguration } from './nameid-configuration.filter'; - -export const MetadataFilterTypes = { - EntityAttributes: EntityAttributesFilterConfiguration, - NameIDFormat: NameIDFilter -}; - -export const MetadataFilterEditorTypes = [ - EntityAttributesFilterConfiguration, - NameIDFilterConfiguration -]; - -export * from './entity-attributes.filter'; -export * from './nameid.filter'; diff --git a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts b/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts deleted file mode 100644 index 5520f4919..000000000 --- a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { NameIDFilter } from './nameid.filter'; - -export const NameIDFilterConfiguration: Wizard = { - ...NameIDFilter, - steps: [ - { - id: 'common', - label: 'label.target', - index: 1, - fields: [ - 'name', - 'filterEnabled', - '@type', - 'resourceId', - 'nameIdFormatFilterTarget' - ] - }, - { - id: 'options', - label: 'label.options', - index: 1, - initialValues: [], - fields: [ - 'removeExistingFormats', - 'formats' - ] - } - ] -}; diff --git a/ui/src/app/metadata/filter/model/nameid.filter.spec.ts b/ui/src/app/metadata/filter/model/nameid.filter.spec.ts deleted file mode 100644 index e3d3aca36..000000000 --- a/ui/src/app/metadata/filter/model/nameid.filter.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { NameIDFilter } from './nameid.filter'; - -describe('NameID Format filter form', () => { - describe('getValidators', () => { - it('should return an empty object for validators', () => { - expect(Object.keys(NameIDFilter.getValidators())).toEqual([ - '/', - '/name', - '/nameIdFormatFilterTarget' - ]); - }); - - describe('name `/name` validator', () => { - const validators = NameIDFilter.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = NameIDFilter.getValidators(['foo', 'bar']); - - it('should return a list of child errors', () => { - expect(validators['/']({ name: 'foo' }, { path: '/name' }, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, { path: '/foo' }, {})).toBeUndefined(); - }); - }); - }); - - describe('transformer', () => { - it('should add modify the object', () => { - expect(NameIDFilter.formatter({})).toEqual({}); - expect(NameIDFilter.parser({})).toEqual({}); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/model/nameid.filter.ts b/ui/src/app/metadata/filter/model/nameid.filter.ts deleted file mode 100644 index a095513ea..000000000 --- a/ui/src/app/metadata/filter/model/nameid.filter.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { FormDefinition } from '../../../wizard/model'; -import { MetadataFilter } from '../../domain/model'; -import { NameIDFormatFilterEntity } from '../../domain/entity/filter/nameid-format-filter'; -import { RegexValidator } from '../../../shared/validation/regex.validator'; -import { getFilterNames } from '../reducer'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const NameIDFilter: FormDefinition = { - label: 'NameIDFormat', - type: 'NameIDFormat', - schema: `${API_BASE_PATH}/ui/NameIdFormatFilter`, - getEntity(filter: MetadataFilter): NameIDFormatFilterEntity { - return new NameIDFormatFilterEntity(filter); - }, - validatorParams: [getFilterNames], - getValidators(namesList: string[] = []): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - // iterate all customer - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, { path: `/${key}` }, form_current) : null; - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value] - } : null; - return err; - }, - '/nameIdFormatFilterTarget': (value, property, form) => { - if (!form || !form.value || !form.value.nameIdFormatFilterTarget || - form.value.nameIdFormatFilterTarget.nameIdFormatFilterTargetType !== 'REGEX') { - return null; - } - return checkRegex(value.value[0]) ? null : { - code: 'INVALID_REGEX', - path: `#${property.path}`, - message: 'message.invalid-regex-pattern', - params: [value.value[0]] - }; - } - }; - return validators; - }, - parser: (changes: any): MetadataFilter => changes, - formatter: (changes: MetadataFilter): any => changes -}; diff --git a/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts deleted file mode 100644 index 5c11032cd..000000000 --- a/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { reducer, initialState as snapshot } from './collection.reducer'; -import * as fromFilter from './collection.reducer'; -import { - FilterCollectionActionTypes, - LoadFilterSuccess, - UpdateFilterSuccess, - SelectFilter, - SelectFilterSuccess, - AddFilterRequest, - UpdateFilterRequest, - AddFilterSuccess, - AddFilterFail, - UpdateFilterFail, - RemoveFilterFail, - RemoveFilterRequest, - RemoveFilterSuccess -} from '../action/collection.action'; -import { EntityAttributesFilterEntity } from '../../domain/entity/filter/entity-attributes-filter'; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterCollectionActionTypes.SELECT_FILTER_REQUEST}`, () => { - it('should set the selected id in the store', () => { - const selectedFilterId = 'foo'; - const action = new SelectFilter(selectedFilterId); - const result = reducer(snapshot, action); - expect(result).toEqual({...snapshot, selectedFilterId}); - }); - }); - - describe(`${FilterCollectionActionTypes.LOAD_FILTER_SUCCESS}`, () => { - it('should add the loaded filters to the collection', () => { - spyOn(fromFilter.adapter, 'addAll').and.callThrough(); - const filters = [ - new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }), - new EntityAttributesFilterEntity({ resourceId: 'bar', createdDate: new Date().toLocaleDateString() }) - ]; - const action = new LoadFilterSuccess(filters); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${FilterCollectionActionTypes.SELECT_FILTER_SUCCESS}`, () => { - it('should add the loaded filter to the collection', () => { - spyOn(fromFilter.adapter, 'addOne').and.callThrough(); - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new SelectFilterSuccess(filter); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.addOne).toHaveBeenCalled(); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_REQUEST}`, () => { - it('should set saving to true', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new AddFilterRequest({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_REQUEST}`, () => { - it('should set saving to true', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new UpdateFilterRequest({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_SUCCESS}`, () => { - it('should set saving to false', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new AddFilterSuccess({ - filter, - providerId: 'foo' - }); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const action = new AddFilterFail(new Error('error')); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const filter = new EntityAttributesFilterEntity({ resourceId: 'foo', createdDate: new Date().toLocaleDateString() }); - const action = new UpdateFilterFail(filter); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_FAIL}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterFail(new Error('foo')); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_REQUEST}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterRequest('foo'); - expect(reducer(snapshot, action).saving).toBe(true); - }); - }); - - describe(`${FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS}`, () => { - it('should set saving to false', () => { - const action = new RemoveFilterSuccess('foo'); - expect(reducer(snapshot, action).saving).toBe(false); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS}`, () => { - it('should update the filter in the collection', () => { - spyOn(fromFilter.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'foo', - changes: new EntityAttributesFilterEntity({ resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }), - }; - const action = new UpdateFilterSuccess({ - update, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - expect(fromFilter.adapter.updateOne).toHaveBeenCalled(); - }); - }); - - describe('selector methods', () => { - describe('getSelectedFilterId', () => { - it('should return the state selectedFilterId', () => { - expect(fromFilter.getSelectedFilterId(snapshot)).toBe(snapshot.selectedFilterId); - }); - }); - - describe('getIsLoaded', () => { - it('should return the state loaded', () => { - expect(fromFilter.getIsLoaded(snapshot)).toBe(snapshot.loaded); - }); - }); - - describe('getError', () => { - it('should return the state saving', () => { - expect(fromFilter.getIsSaving(snapshot)).toBe(snapshot.saving); - }); - }); - - describe('getOrder', () => { - it('should return the state order', () => { - expect(fromFilter.getOrder(snapshot)).toBe(snapshot.order); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/collection.reducer.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.ts deleted file mode 100644 index 1a3ebcb7e..000000000 --- a/ui/src/app/metadata/filter/reducer/collection.reducer.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; -import { MetadataFilter } from '../../domain/model'; - -export interface CollectionState extends EntityState { - selectedFilterId: string | null; - loaded: boolean; - saving: boolean; - order: string[]; -} - -export function sortByDate(a: MetadataFilter, b: MetadataFilter): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataFilter) => model.resourceId -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedFilterId: null, - loaded: false, - saving: false, - order: [] -}); - -export function reducer(state = initialState, action: FilterCollectionActionsUnion): CollectionState { - switch (action.type) { - case FilterCollectionActionTypes.LOAD_FILTER_SUCCESS: { - let s = adapter.addAll(action.payload, { - ...state, - selectedFilterId: state.selectedFilterId, - loaded: true - }); - return s; - } - - case FilterCollectionActionTypes.SELECT_FILTER_SUCCESS: { - return adapter.addOne(action.payload, { - ...state, - selectedFilterId: action.payload.resourceId - }); - } - - case FilterCollectionActionTypes.ADD_FILTER_REQUEST: - case FilterCollectionActionTypes.UPDATE_FILTER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: { - return adapter.updateOne(action.payload.update, { - ...state, - saving: false - }); - } - - case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: - case FilterCollectionActionTypes.ADD_FILTER_FAIL: - case FilterCollectionActionTypes.REMOVE_FILTER_FAIL: - case FilterCollectionActionTypes.UPDATE_FILTER_FAIL: { - return { - ...state, - saving: false - }; - } - - case FilterCollectionActionTypes.REMOVE_FILTER_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state, - saving: false - }); - } - - case FilterCollectionActionTypes.REMOVE_FILTER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case FilterCollectionActionTypes.SELECT_FILTER_REQUEST: { - return { - ...state, - selectedFilterId: action.payload, - }; - } - case FilterCollectionActionTypes.GET_ORDER_FILTER_SUCCESS: { - return { - ...state, - order: action.payload - }; - } - - case FilterCollectionActionTypes.CLEAR_FILTERS: { - return { - ...initialState - }; - } - - default: { - return state; - } - } -} - -export const getSelectedFilterId = (state: CollectionState) => state.selectedFilterId; -export const getIsLoaded = (state: CollectionState) => state.loaded; -export const getIsSaving = (state: CollectionState) => state.saving; -export const getOrder = (state: CollectionState) => state.order; -export const { - selectIds: selectFilterIds, - selectEntities: selectFilterEntities, - selectAll: selectAllFilters, - selectTotal: selectFilterTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/metadata/filter/reducer/editor.reducer.ts b/ui/src/app/metadata/filter/reducer/editor.reducer.ts deleted file mode 100644 index dcb0620f4..000000000 --- a/ui/src/app/metadata/filter/reducer/editor.reducer.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { EditorActionTypes, EditorActionUnion } from '../action/editor.action'; - -export interface EditorState { - status: { [key: string]: string }; -} - -export const initialState: EditorState = { - status: {} -}; - -export function reducer(state = initialState, action: EditorActionUnion): EditorState { - switch (action.type) { - case EditorActionTypes.CLEAR: { - return { - ...initialState - }; - } - case EditorActionTypes.UPDATE_STATUS: { - //console.log(action) - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - - - -export const isEditorValid = (state: EditorState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getFormStatus = (state: EditorState) => state.status; -export const getInvalidForms = (state: EditorState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts deleted file mode 100644 index 3689e9f16..000000000 --- a/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { reducer, initialState as snapshot } from './filter.reducer'; -import * as fromFilter from './filter.reducer'; -import { SelectId, LoadEntityPreviewSuccess, UpdateFilterChanges, FilterActionTypes, CancelCreateFilter } from '../action/filter.action'; -import { MDUI } from '../../domain/model'; -import { MetadataFilter } from '../../domain/model'; - -const mdui: MDUI = { - displayName: 'foo', - informationUrl: 'bar', - privacyStatementUrl: 'baz', - logoUrl: '', - logoHeight: 100, - logoWidth: 100, - description: '', -}; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterActionTypes.SELECT_ID} action`, () => { - it('should set selected property to the provided payload', () => { - const id = 'foo'; - const result = reducer(snapshot, new SelectId(id)); - expect(result.selected).toBe(id); - }); - }); - - describe(`${FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS} action`, () => { - it('should set preview property to the provided payload', () => { - let sampleMdui = { ...mdui }; - const result = reducer(snapshot, new LoadEntityPreviewSuccess(sampleMdui)); - expect(result.preview).toEqual(sampleMdui); - }); - }); - - describe(`${FilterActionTypes.UPDATE_FILTER} action`, () => { - it('should update the state of changes', () => { - const changes = { filterEnabled: false }; - const current = { ...snapshot, changes: { filterEnabled: true } as MetadataFilter }; - const result = reducer(current, new UpdateFilterChanges(changes)); - expect(result.changes.filterEnabled).toBe(false); - }); - }); - describe(`${FilterActionTypes.CANCEL_CREATE_FILTER} action`, () => { - it('should set saving to true', () => { - const result = reducer(snapshot, new CancelCreateFilter('foo')); - expect(result).toEqual(fromFilter.initialState); - }); - }); - - describe('selector methods', () => { - describe('getSelected', () => { - it('should return the state selected', () => { - expect(fromFilter.getSelected(snapshot)).toBe(snapshot.selected); - }); - }); - - describe('getChanges', () => { - it('should return the state changes', () => { - expect(fromFilter.getFilterChanges(snapshot)).toBe(snapshot.changes); - }); - }); - - describe('getPreview', () => { - it('should return the state preview', () => { - expect(fromFilter.getPreview(snapshot)).toBe(snapshot.preview); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/filter.reducer.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.ts deleted file mode 100644 index bda4668ca..000000000 --- a/ui/src/app/metadata/filter/reducer/filter.reducer.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - FilterActionTypes, - FilterActionsUnion -} from '../action/filter.action'; -import { MetadataFilter, MDUI } from '../../domain/model'; - -export interface FilterState { - selected: string | null; - changes: MetadataFilter | null; - preview: MDUI | null; -} - -export const initialState: FilterState = { - selected: null, - changes: null, - preview: null -}; - -export function reducer(state = initialState, action: FilterActionsUnion): FilterState { - switch (action.type) { - case FilterActionTypes.SELECT_ID: { - return { - ...state, - selected: action.payload - }; - } - case FilterActionTypes.SELECT_FILTER_TYPE: { - return { - ...state, - changes: { - type: action.payload - } - }; - } - case FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS: { - return { - ...state, - preview: action.payload - }; - } - case FilterActionTypes.UPDATE_FILTER: { - const s = { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - return s; - } - case FilterActionTypes.CLEAR_FILTER: - case FilterActionTypes.CANCEL_CREATE_FILTER: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getSelected = (state: FilterState) => state.selected; -export const getFilterChanges = (state: FilterState) => state.changes; -export const getPreview = (state: FilterState) => state.preview; diff --git a/ui/src/app/metadata/filter/reducer/index.spec.ts b/ui/src/app/metadata/filter/reducer/index.spec.ts deleted file mode 100644 index 0a136de68..000000000 --- a/ui/src/app/metadata/filter/reducer/index.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import * as selectors from './index'; - -describe('filter selectors', () => { - describe('mergeFn', () => { - it('should return merged objects', () => { - expect(selectors.mergeFn({foo: 'bar' }, { resourceId: 'baz' })).toEqual({foo: 'bar', resourceId: 'baz'}); - }); - }); - - describe('isAdditionalFilter', () => { - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }]; - expect(selectors.filterTypeFn(filters)).toEqual(filters); - }); - - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }, { '@type': 'EntityRoleWhiteList' }]; - expect(selectors.filterTypeFn(filters).length).toBe(1); - }); - }); - - describe('isFilterPlugin', () => { - it('should return false for entity attributes type', () => { - expect(selectors.isFilterPlugin('EntityAttributes')).toBe(false); - }); - selectors.filterPluginTypes.forEach(type => { - it(`should return false for ${ type } type`, () => { - expect(selectors.isFilterPlugin(type)).toBe(true); - }); - }); - }); - - describe('isAdditionalFilter', () => { - it('should return false for entity attributes type', () => { - expect(selectors.isAdditionalFilter('EntityAttributes')).toBe(true); - }); - selectors.filterPluginTypes.forEach(type => { - it(`should return false for ${ type } type`, () => { - expect(selectors.isAdditionalFilter(type)).toBe(false); - }); - }); - }); - - describe('filterTypeFn', () => { - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }]; - expect(selectors.filterTypeFn(filters)).toEqual(filters); - }); - - it('should return filtered objects', () => { - const filters = [{ '@type': 'EntityAttributes' }, { '@type': 'EntityRoleWhiteList' }]; - expect(selectors.filterTypeFn(filters).length).toBe(1); - }); - }); - - describe('filterOrderFn', () => { - it('should return the ordered & filtered entities when they are not filter plugins', () => { - const filters = {'foo': { '@type': 'EntityAttributes' }}; - const order = ['foo']; - expect(selectors.filterOrderFn(filters, order)).toEqual(order); - }); - - it('should return entities that exist in the collection of additional filters', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['bar']; - expect(selectors.filterOrderFn(filters, order)).toEqual([]); - }); - - it('should return only additional filters', () => { - const filters = { 'foo': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo']; - expect(selectors.filterOrderFn(filters, order)).toEqual([]); - }); - - it('should return filtered objects', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' }, 'bar': { '@type': 'EntityRoleWhiteList' }}; - const order = ['foo', 'bar']; - expect(selectors.filterOrderFn(filters, order).length).toBe(1); - }); - }); - - describe('pluginOrderFn', () => { - it('should return the ordered & filtered entities when they are filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo']; - expect(selectors.pluginOrderFn(filters, order)).toEqual(order); - }); - - it('should return entities that exist in the collection of filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['bar']; - expect(selectors.pluginOrderFn(filters, order)).toEqual([]); - }); - - it('should return only filter plugins', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' } }; - const order = ['foo']; - expect(selectors.pluginOrderFn(filters, order)).toEqual([]); - }); - - it('should return filtered objects', () => { - const filters = { 'foo': { '@type': 'EntityAttributes' }, 'bar': { '@type': 'EntityRoleWhiteList' } }; - const order = ['foo', 'bar']; - expect(selectors.pluginOrderFn(filters, order).length).toBe(1); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/index.ts b/ui/src/app/metadata/filter/reducer/index.ts deleted file mode 100644 index ee2da9bf3..000000000 --- a/ui/src/app/metadata/filter/reducer/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../core/reducer'; -import * as fromFilter from './filter.reducer'; -import * as fromSearch from './search.reducer'; -import * as fromCollection from './collection.reducer'; -import * as fromEditor from './editor.reducer'; -import * as utils from '../../domain/domain.util'; -import { MetadataFilter } from '../../domain/model'; - -export interface FilterState { - filter: fromFilter.FilterState; - search: fromSearch.SearchState; - editor: fromEditor.EditorState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - filter: fromFilter.reducer, - editor: fromEditor.reducer, - search: fromSearch.reducer, - collection: fromCollection.reducer -}; - -export interface State extends fromRoot.State { - 'filter': FilterState; -} - -export const getFiltersFromStateFn = (state: FilterState) => state.filter; -export const getSearchFromStateFn = (state: FilterState) => state.search; -export const getCollectionFromStateFn = (state: FilterState) => state.collection; -export const getEditorStateFn = (state: FilterState) => state.editor; - -export const getFilterState = createFeatureSelector('filter'); - -export const getFilterFromState = createSelector(getFilterState, getFiltersFromStateFn); - -export const getSelected = createSelector(getFilterFromState, fromFilter.getSelected); -export const getFilter = createSelector(getFilterFromState, fromFilter.getFilterChanges); -export const getPreview = createSelector(getFilterFromState, fromFilter.getPreview); -export const getEditorState = createSelector(getFilterState, getEditorStateFn); - - -/* - * Select pieces of Search Collection -*/ - -export const getSearchFromState = createSelector(getFilterState, getSearchFromStateFn); -export const getEntityCollection = createSelector(getSearchFromState, fromSearch.getEntityIds); -export const getIsLoading = createSelector(getSearchFromState, fromSearch.getLoading); -export const getError = createSelector(getSearchFromState, fromSearch.getError); -export const getTerm = createSelector(getSearchFromState, fromSearch.getTerm); -export const getViewingMore = createSelector(getSearchFromState, fromSearch.getViewMore); - -/* - * Select pieces of Filter Collection -*/ -export const getCollectionState = createSelector(getFilterState, getCollectionFromStateFn); -export const getAllFilters = createSelector(getCollectionState, fromCollection.selectAllFilters); -export const getCollectionSaving = createSelector(getCollectionState, fromCollection.getIsSaving); -export const getCollectionOrder = createSelector(getCollectionState, fromCollection.getOrder); - -export const getFilterEntities = createSelector(getCollectionState, fromCollection.selectFilterEntities); -export const getSelectedFilterId = createSelector(getCollectionState, fromCollection.getSelectedFilterId); -export const getSelectedFilter = createSelector(getFilterEntities, getSelectedFilterId, utils.getInCollectionFn); -export const getFilterIds = createSelector(getCollectionState, fromCollection.selectFilterIds); -export const getFilterCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); - -export const filterPluginTypes = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; -export const isAdditionalFilter = (type) => filterPluginTypes.indexOf(type) === -1; -export const isFilterPlugin = (type) => filterPluginTypes.indexOf(type) >= 0; - -export const filterTypeFn = filters => [...filters.filter(f => isAdditionalFilter(f['@type']))]; -export const filterOrderFn = (filters, order) => order.filter(id => filters.hasOwnProperty(id) && isAdditionalFilter(filters[id]['@type'])); -export const pluginOrderFn = (filters, order) => order.filter(id => filters.hasOwnProperty(id) && isFilterPlugin(filters[id]['@type'])); - -export const getFilterList = createSelector(getAllFilters, filterTypeFn); -export const getAdditionalFilterOrder = createSelector(getFilterEntities, getCollectionOrder, filterOrderFn); -export const getAdditionalFilters = createSelector(getFilterList, getAdditionalFilterOrder, utils.mergeOrderFn); -export const getPluginFilterOrder = createSelector(getFilterEntities, getCollectionOrder, pluginOrderFn); - -export const getFilterNames = createSelector(getAllFilters, (filters: MetadataFilter[]) => filters.map(f => f.name).filter(f => !!f)); - -/* -Editor State -*/ - -export const getEditorIsValid = createSelector(getEditorState, fromEditor.isEditorValid); -export const getFormStatus = createSelector(getEditorState, fromEditor.getFormStatus); -export const getInvalidEditorForms = createSelector(getEditorState, fromEditor.getInvalidForms); - - -/* - * Combine pieces of State -*/ - -export const mergeFn = (changes, filter) => ({ ...filter, ...changes }); -export const detectFilterType = (changes) => changes.type ? changes.type : changes.hasOwnProperty('@type') ? changes['@type'] : null; - -export const getFilterWithChanges = createSelector(getFilter, getSelectedFilter, mergeFn); -export const getFilterType = createSelector(getFilter, (changes: MetadataFilter) => changes ? detectFilterType(changes) : null); - -export const getFilterIsValid = createSelector(getEditorIsValid, getFilterType, getFormStatus, (isValid, type, status) => { - return isValid && type !== null && Object.keys(status).length > 0; -}); - -export const cantSaveFilter = createSelector(getCollectionSaving, getFilterIsValid, (isSaving, isValid) => { - return (isSaving || !isValid); -}); \ No newline at end of file diff --git a/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts deleted file mode 100644 index 32af51486..000000000 --- a/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { reducer, initialState as snapshot } from './search.reducer'; -import * as fromFilter from './search.reducer'; -import { - SearchActionTypes, - ViewMoreIds, - CancelViewMore, - QueryEntityIds, - LoadEntityIdsError, - LoadEntityIdsSuccess, - ClearSearch -} from '../action/search.action'; -import { FilterCollectionActionTypes, UpdateFilterSuccess, AddFilterSuccess } from '../action/collection.action'; -import { EntityAttributesFilterEntity } from '../../domain/entity'; - -describe('Filter Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.VIEW_MORE_IDS} action`, () => { - it('should set viewMore property to true', () => { - const result = reducer(snapshot, new ViewMoreIds('foo')); - - expect(result.viewMore).toBe(true); - }); - }); - - describe(`${SearchActionTypes.CANCEL_VIEW_MORE} action`, () => { - it('should set viewMore property to false', () => { - const result = reducer(snapshot, new CancelViewMore()); - - expect(result.viewMore).toBe(false); - }); - }); - - describe(`${SearchActionTypes.QUERY_ENTITY_IDS} action`, () => { - it('should set loading property to true', () => { - const result = reducer(snapshot, new QueryEntityIds({ term: 'foo' })); - - expect(result.loading).toBe(true); - }); - }); - - describe(`${SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS} action`, () => { - it('should set loading property to false and the entityIds property to the provided payload', () => { - const ids = ['foo']; - const result = reducer(snapshot, new LoadEntityIdsSuccess(ids)); - - expect(result.loading).toBe(false); - expect(result.entityIds).toBe(ids); - }); - }); - - describe(`${SearchActionTypes.LOAD_ENTITY_IDS_ERROR} action`, () => { - it('should set loading property to false and the error property to the provided payload', () => { - const err = new Error('Foobar!'); - const result = reducer(snapshot, new LoadEntityIdsError(err)); - - expect(result.loading).toBe(false); - expect(result.error).toBe(err); - }); - }); - - describe(`${FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS} action`, () => { - it('should reset the state', () => { - const update = { - id: 'foo', - changes: new EntityAttributesFilterEntity({ resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }), - }; - const action = new UpdateFilterSuccess({ - update, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${FilterCollectionActionTypes.ADD_FILTER_SUCCESS} action`, () => { - it('should reset the state', () => { - const filter = new EntityAttributesFilterEntity( - { resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() } - ); - const action = new AddFilterSuccess({ - filter, - providerId: 'foo' - }); - const result = reducer(snapshot, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.CLEAR_SEARCH} action`, () => { - it('should set saving to true', () => { - const result = reducer(snapshot, new ClearSearch()); - expect(result).toEqual(fromFilter.initialState); - }); - }); - - describe('selector methods', () => { - describe('getViewMore', () => { - it('should return the state viewMore', () => { - expect(fromFilter.getViewMore(snapshot)).toBe(snapshot.viewMore); - }); - }); - - describe('getEntityIds', () => { - it('should return the state entityIds', () => { - expect(fromFilter.getEntityIds(snapshot)).toBe(snapshot.entityIds); - }); - }); - - describe('getError', () => { - it('should return the state error', () => { - expect(fromFilter.getError(snapshot)).toBe(snapshot.error); - }); - }); - - describe('getLoading', () => { - it('should return the state loading', () => { - expect(fromFilter.getLoading(snapshot)).toBe(snapshot.loading); - }); - }); - - describe('getTerm', () => { - it('should return the state term', () => { - expect(fromFilter.getTerm(snapshot)).toBe(snapshot.term); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/filter/reducer/search.reducer.ts b/ui/src/app/metadata/filter/reducer/search.reducer.ts deleted file mode 100644 index 1d63609e9..000000000 --- a/ui/src/app/metadata/filter/reducer/search.reducer.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { FilterActionsUnion, FilterActionTypes } from '../action/filter.action'; -import { SearchActionsUnion, SearchActionTypes } from '../action/search.action'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; - -export interface SearchState { - entityIds: string[]; - viewMore: boolean; - loading: boolean; - error: Error | null; - term: string; -} - -export const initialState: SearchState = { - entityIds: [], - viewMore: false, - loading: false, - error: null, - term: '', -}; - -export function reducer(state = initialState, action: SearchActionsUnion | FilterActionsUnion | FilterCollectionActionsUnion): SearchState { - switch (action.type) { - case SearchActionTypes.VIEW_MORE_IDS: { - return { - ...state, - viewMore: true - }; - } - case SearchActionTypes.CANCEL_VIEW_MORE: { - return { - ...state, - viewMore: false - }; - } - case SearchActionTypes.QUERY_ENTITY_IDS: { - return { - ...state, - loading: true, - term: action.payload.term - }; - } - case SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS: { - return { - ...state, - loading: false, - error: null, - entityIds: action.payload - }; - } - case SearchActionTypes.LOAD_ENTITY_IDS_ERROR: { - return { - ...state, - loading: false, - error: action.payload - }; - } - case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: - case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: - case SearchActionTypes.CLEAR_SEARCH: - case FilterActionTypes.CANCEL_CREATE_FILTER: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getViewMore = (state: SearchState) => state.viewMore; -export const getEntityIds = (state: SearchState) => state.entityIds; -export const getError = (state: SearchState) => state.error; -export const getLoading = (state: SearchState) => state.loading; -export const getTerm = (state: SearchState) => state.term; diff --git a/ui/src/app/metadata/manager/action/search.action.ts b/ui/src/app/metadata/manager/action/search.action.ts deleted file mode 100644 index c10361a81..000000000 --- a/ui/src/app/metadata/manager/action/search.action.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Action, MemoizedSelector } from '@ngrx/store'; -import { Metadata } from '../../domain/domain.type'; - -export enum DashboardSearchActionTypes { - ENTITY_SEARCH_COMPLETE = '[Metadata Entity Search] Entity Search COMPLETE', - ENTITY_FILTER = '[Metadata Entity Filter] Entity Filter', - ENTITY_SEARCH = '[Metadata Entity Search] Entity Search', -} - -/** - * Add Resolver to Collection Actions - */ -export class SearchAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_SEARCH; - - constructor(public payload: { query: string, selector: MemoizedSelector }) { } -} - -export class FilterAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_FILTER; - - constructor(public payload: string) { } -} - -export class SearchCompleteAction implements Action { - readonly type = DashboardSearchActionTypes.ENTITY_SEARCH_COMPLETE; - - constructor(public payload: Array) { } -} - -export type DashboardSearchActionsUnion = - | SearchAction - | FilterAction - | SearchCompleteAction; diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.html b/ui/src/app/metadata/manager/component/delete-dialog.component.html deleted file mode 100644 index da1c2d8df..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts deleted file mode 100644 index 4829741c6..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteDialogComponent } from './delete-dialog.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteDialogComponent, { static: true }) - public componentUnderTest: DeleteDialogComponent; -} - -describe('Delete Dialog (modal) Component', () => { - - let app: DeleteDialogComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteDialogComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/manager/component/delete-dialog.component.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.ts deleted file mode 100644 index 0918addcd..000000000 --- a/ui/src/app/metadata/manager/component/delete-dialog.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-dialog.component.html' -}) -export class DeleteDialogComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/component/provider-search.component.html b/ui/src/app/metadata/manager/component/provider-search.component.html deleted file mode 100644 index 107d14797..000000000 --- a/ui/src/app/metadata/manager/component/provider-search.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
- - -
- -
-
-
diff --git a/ui/src/app/metadata/manager/component/provider-search.component.ts b/ui/src/app/metadata/manager/component/provider-search.component.ts deleted file mode 100644 index c02932052..000000000 --- a/ui/src/app/metadata/manager/component/provider-search.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Output, Input, EventEmitter, OnChanges } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; - -@Component({ - selector: 'provider-search', - templateUrl: './provider-search.component.html' -}) -export class ProviderSearchComponent implements OnChanges { - @Input() query = ''; - @Input() searching = false; - @Output() search = new EventEmitter(); - - searchForm: FormGroup; - - constructor(private fb: FormBuilder) { - this.searchForm = this.fb.group({ - search: [this.query] - }); - } - - ngOnChanges(): void { - this.searchForm.setValue({ - search: this.query - }); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.html b/ui/src/app/metadata/manager/component/resolvers-list.component.html deleted file mode 100644 index 873ea754a..000000000 --- a/ui/src/app/metadata/manager/component/resolvers-list.component.html +++ /dev/null @@ -1,68 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - -
TitleEntity IDAuthorCreated DateEnabled
- {{ resolver.name }} - - {{ resolver.name }} - {{ resolver.getDisplayId() }}{{ resolver.createdBy ? resolver.createdBy : '—' }} - {{ resolver.getCreationDate() ? (resolver.getCreationDate() | customDate) : '—' }} - - - - - Incomplete Form - - - - - - - - - {{ (resolver.enabled ? 'value.enabled' : 'value.disabled') | translate }} - - - - -
-
\ No newline at end of file diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.spec.ts b/ui/src/app/metadata/manager/component/resolvers-list.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/manager/component/resolvers-list.component.ts b/ui/src/app/metadata/manager/component/resolvers-list.component.ts deleted file mode 100644 index dffee7c93..000000000 --- a/ui/src/app/metadata/manager/component/resolvers-list.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataEntity } from '../../domain/model'; - -@Component({ - selector: 'resolvers-list', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './resolvers-list.component.html', - styleUrls: [] -}) -export class ResolversListComponent { - @Input() entities: MetadataEntity[]; - - @Output() scroll: EventEmitter = new EventEmitter(); - @Output() delete: EventEmitter = new EventEmitter(); - - @Output() toggleEnabled: EventEmitter = new EventEmitter(); -} diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html deleted file mode 100644 index bacdb5f05..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-
-
-
- Current Metadata Providers -
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - -
OrderTitleProvider TypeAuthorCreated DateEnabled
-
-
{{ i + 1 }}
-
-   - - -
-
- {{ provider.name }} - {{ provider['@type'] }}{{ provider.createdBy }}{{ provider.createdDate | customDate }} - - {{ (provider.enabled ? 'value.enabled' : 'value.disabled') | translate }} - -
-
-
-
-
diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss deleted file mode 100644 index 133f4a03c..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -@import '../../../../theme/palette'; -.provider-index { - font-size: 1.8rem; - line-height: 1.8rem; - font-weight: lighter; - font-family: monospace; - width: 45px; -} - -.table-providers { - tr > td { - vertical-align: middle; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts deleted file mode 100644 index 9722eb24f..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Router, RouterModule } from '@angular/router'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbPaginationModule, NgbModal, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; -import * as fromDashboard from '../reducer'; -import { ProviderSearchComponent } from '../component/provider-search.component'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RouterStub } from '../../../../testing/router.stub'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { DashboardProvidersListComponent } from './dashboard-providers-list.component'; -import { MetadataProvider } from '../../domain/model'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { CustomDatePipe } from '../../../shared/pipe/date.pipe'; -import { of } from 'rxjs'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; - - -describe('Dashboard Providers List Page', () => { - let fixture: ComponentFixture; - let store: Store; - let router: Router; - let modal: NgbModal; - let instance: DashboardProvidersListComponent; - - let provider = { - resourceId: 'foo', - name: 'bar' - }; - - let dispatchSpy, selectSpy; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub }, - { provide: NgbModal, useClass: NgbModalStub } - ], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }), - ReactiveFormsModule, - NgbPaginationModule, - NgbModalModule, - MockI18nModule, - InfiniteScrollModule, - RouterModule - ], - declarations: [ - DashboardProvidersListComponent, - ProviderSearchComponent, - DeleteDialogComponent, - CustomDatePipe - ], - }); - - fixture = TestBed.createComponent(DashboardProvidersListComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - - dispatchSpy = spyOn(store, 'dispatch').and.callThrough(); - selectSpy = spyOn(store, 'select').and.returnValues(of([]), of({'foo': true})); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should default to an empty string', () => { - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - const action = dispatchSpy.calls.mostRecent().args[0]; - expect(action.payload.query).toBe(''); - }); - - it('should search with the provided query string', () => { - instance.search('foo'); - expect(store.dispatch).toHaveBeenCalled(); - const action = dispatchSpy.calls.mostRecent().args[0]; - expect(action.payload.query).toBe('foo'); - }); - }); - - describe('edit method', () => { - it('should route to the edit page', () => { - const evt = new Event('a type'); - spyOn(router, 'navigate'); - spyOn(evt, 'preventDefault'); - instance.edit(provider, evt); - expect(evt.preventDefault).toHaveBeenCalled(); - expect(router.navigate).toHaveBeenCalledWith(['metadata', 'provider', provider.resourceId, 'edit']); - }); - }); - - describe('loadMore method', () => { - it('should call the page observable to emit the next value', (done: DoneFn) => { - instance.loadMore(5); - instance.page$.subscribe(val => { - expect(val).toBe(5); - expect(instance.page).toBe(5); - done(); - }); - }); - }); - - describe('onScroll method', () => { - it('should call the loadMore method', () => { - spyOn(instance, 'loadMore'); - instance.onScroll(new Event('scrolled')); - expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); - }); - }); -}); diff --git a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts deleted file mode 100644 index 6a206d9a1..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-providers-list.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ProviderState, getOrderedProvidersInSearch, getOrderedProviders } from '../../provider/reducer'; -import * as fromDashboard from '../reducer'; -import { map, startWith } from 'rxjs/operators'; -import { ChangeProviderOrderUp, ChangeProviderOrderDown } from '../../provider/action/collection.action'; -import { Metadata } from '../../domain/domain.type'; -import { MetadataProvider } from '../../domain/model'; -import { SearchAction } from '../action/search.action'; -import { withLatestFrom } from 'rxjs/operators'; - -@Component({ - selector: 'dashboard-providers-list', - templateUrl: './dashboard-providers-list.component.html', - styleUrls: ['./dashboard-providers-list.component.scss'] -}) - -export class DashboardProvidersListComponent implements OnInit { - - providers$: Observable; - searchQuery$: Observable; - loading$: Observable; - - total$: Observable; - page = 1; - limit = 20; - limited$: Observable; - - isSearching$: Observable; - - private subj: BehaviorSubject = new BehaviorSubject(this.page); - readonly page$: Observable = this.subj.asObservable(); - - constructor( - private store: Store, - private router: Router - ) { - const providers = this.store.select(fromDashboard.getSearchResults) as Observable; - this.providers$ = providers as Observable; - - this.searchQuery$ = store.select(fromDashboard.getSearchQuery); - this.loading$ = store.select(fromDashboard.getSearchLoading); - - this.total$ = this.providers$.pipe(map(list => list.length)); - - this.isSearching$ = this.searchQuery$.pipe(map(q => q.length > 0)); - - this.limited$ = combineLatest( - this.providers$, - this.page$ - ).pipe( - map(([list, page]) => { - let maxIndex = (page * this.limit) - 1, - minIndex = 0; - return list.filter((provider: Metadata, index: number) => (maxIndex >= index && index >= minIndex)); - }) - ); - } - - ngOnInit(): void { - this.search(); - } - - loadMore(index: number): void { - this.subj.next(index); - this.page = index; - } - - search(query: string = ''): void { - this.store.dispatch(new SearchAction({query, selector: getOrderedProviders})); - } - - onScroll(event: Event): void { - this.loadMore(this.page + 1); - } - - view(id: string, page: string): void { - this.router.navigate(['metadata', 'provider', id, page]); - } - - edit(provider: MetadataProvider, event: Event): void { - event.preventDefault(); - this.view(provider.resourceId, 'edit'); - } - - gotoFilters(provider: MetadataProvider): void { - this.view(provider.resourceId, 'filters'); - } - - updateOrderUp(provider: MetadataProvider): void { - this.store.dispatch(new ChangeProviderOrderUp(provider.resourceId)); - } - - updateOrderDown(provider: MetadataProvider): void { - this.store.dispatch(new ChangeProviderOrderDown(provider.resourceId)); - } -} diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html deleted file mode 100644 index b9022c783..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
- Current Metadata Sources -
-
- - - -
-
-
diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts deleted file mode 100644 index 020734d76..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.spec.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Router, RouterModule } from '@angular/router'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; -import { NgbPaginationModule, NgbModal, NgbModalModule, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import * as fromDashboard from '../reducer'; -import { ProviderSearchComponent } from '../component/provider-search.component'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RouterStub } from '../../../../testing/router.stub'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { DashboardResolversListComponent } from './dashboard-resolvers-list.component'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { CustomDatePipe } from '../../../shared/pipe/date.pipe'; -import { MockModule } from '../../../../testing/mock-module.stub'; - - -describe('Dashboard Resolvers List Page', () => { - let fixture: ComponentFixture; - let store: Store; - let router: Router; - let modal: NgbModal; - let instance: DashboardResolversListComponent; - - let draft = new FileBackedHttpMetadataResolver({ - entityId: 'foo', - serviceProviderName: 'bar', - id: '1' - }), - resolver = new FileBackedHttpMetadataResolver({ - entityId: 'foo', - serviceProviderName: 'foo', - id: '1', - createdDate: new Date().toDateString() - }); - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub }, - { provide: NgbModal, useClass: NgbModalStub } - ], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }), - ReactiveFormsModule, - NgbPaginationModule, - NgbModalModule, - MockI18nModule, - InfiniteScrollModule, - RouterModule, - MockModule - ], - declarations: [ - DashboardResolversListComponent, - ProviderSearchComponent, - DeleteDialogComponent, - CustomDatePipe - ], - }); - - fixture = TestBed.createComponent(DashboardResolversListComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); - - describe('search method', () => { - it('should fire a redux action', () => { - instance.search(); - expect(store.dispatch).toHaveBeenCalled(); - }); - it('should reset the page number to 1', () => { - instance.search('foo'); - expect(instance.page).toBe(1); - }); - }); - - describe('edit method', () => { - it('should route to the wizard page', () => { - const evt = new Event('a type'); - spyOn(router, 'navigate'); - spyOn(evt, 'preventDefault'); - instance.edit(evt, draft); - expect(router.navigate).toHaveBeenCalledWith(['metadata', 'resolver', 'new', 'blank', 'common'], { - queryParams: { id: '1' } - }); - expect(evt.preventDefault).toHaveBeenCalled(); - }); - }); - - describe('loadMore method', () => { - it('should call the page observable to emit the next value', (done: DoneFn) => { - instance.loadMore(5); - instance.page$.subscribe(val => { - expect(val).toBe(5); - expect(instance.page).toBe(5); - done(); - }); - }); - }); - - describe('onScroll method', () => { - it('should call the loadMore method', () => { - spyOn(instance, 'loadMore'); - instance.onScroll(); - expect(instance.loadMore).toHaveBeenCalledWith(instance.page + 1); - }); - }); - - describe('deleteResolver method', () => { - it('should call the modal service', () => { - spyOn(modal, 'open').and.callFake(() => { - return { - result: Promise.resolve(true) - } as NgbModalRef; - }); - instance.deleteResolver({ entity: resolver, draft: false }); - expect(modal.open).toHaveBeenCalled(); - }); - it('should log an error to the console on failure', () => { - spyOn(modal, 'open').and.callFake(() => { - return { - result: Promise.reject(false) - } as NgbModalRef; - }); - instance.deleteResolver({ entity: resolver, draft: false }); - expect(modal.open).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts b/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts deleted file mode 100644 index 91923dafc..000000000 --- a/ui/src/app/metadata/manager/container/dashboard-resolvers-list.component.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { MetadataEntity, MetadataResolver } from '../../domain/model'; -import * as searchActions from '../action/search.action'; -import * as fromDashboard from '../reducer'; -import { DeleteDialogComponent } from '../component/delete-dialog.component'; -import { RemoveDraftRequest } from '../../resolver/action/draft.action'; -import { getAllResolvers } from '../../resolver/reducer'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { RemoveResolverRequest } from '../../resolver/action/collection.action'; - -@Component({ - selector: 'dashboard-resolvers-list', - templateUrl: './dashboard-resolvers-list.component.html' -}) - -export class DashboardResolversListComponent implements OnInit { - searchQuery$: Observable; - resolvers$: Observable; - loading$: Observable; - - total$: Observable; - page = 1; - limit = 20; - limited$: Observable; - - private subj: BehaviorSubject = new BehaviorSubject(this.page); - readonly page$: Observable = this.subj.asObservable(); - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal - ) { - const resolvers: unknown = store.select(fromDashboard.getSearchResults); - this.resolvers$ = (resolvers as Observable) - .pipe( - map(list => list.map(resolver => new FileBackedHttpMetadataResolver(resolver as MetadataResolver))) - ); - this.searchQuery$ = store.select(fromDashboard.getSearchQuery); - this.loading$ = store.select(fromDashboard.getSearchLoading); - - this.total$ = this.resolvers$.pipe(map(list => list.length)); - - this.limited$ = combineLatest(this.resolvers$, this.page$).pipe( - map(([providers, page]) => { - let maxIndex = (page * this.limit) - 1, - minIndex = 0; - return providers.filter((resolver: MetadataEntity, index: number) => (maxIndex >= index && index >= minIndex)); - }) - ); - } - - ngOnInit(): void { - this.search(); - } - - loadMore(index: number): void { - this.subj.next(index); - this.page = index; - } - - search(query: string = ''): void { - this.store.dispatch(new searchActions.SearchAction({query, selector: getAllResolvers})); - this.page = 1; - } - - onScroll(): void { - this.loadMore(this.page + 1); - } - - edit(evt: Event, entity: MetadataEntity): void { - evt.preventDefault(); - this.router.navigate(['metadata', 'resolver', 'new', 'blank', 'common'], { - queryParams: { - id: entity.getId() - } - }); - } - - viewMetadataHistory(entity: MetadataEntity): void { - this.router.navigate(['metadata', 'resolver', entity.getId(), 'versions']); - } - - deleteResolver({ entity, draft }: { entity: MetadataResolver, draft: boolean }): void { - this.modalService - .open(DeleteDialogComponent) - .result - .then( - success => { - if (draft) { - this.store.dispatch(new RemoveDraftRequest(entity)); - } else { - this.store.dispatch(new RemoveResolverRequest(entity.id)); - } - }, - err => { - console.log('Cancelled'); - } - ); - } -} diff --git a/ui/src/app/metadata/manager/container/manager.component.html b/ui/src/app/metadata/manager/container/manager.component.html deleted file mode 100644 index 0680b43f9..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ui/src/app/metadata/manager/container/manager.component.scss b/ui/src/app/metadata/manager/container/manager.component.scss deleted file mode 100644 index 4c063a6a6..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../theme/palette'; - -:host { - .lead { - line-height: 36px; - } - - .nav-tabs, .nav-link.active { - border-color: $brand-primary; - } - - .nav-link:hover { - border-bottom-color: $brand-primary; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/manager/container/manager.component.spec.ts b/ui/src/app/metadata/manager/container/manager.component.spec.ts deleted file mode 100644 index d33c28860..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, combineReducers } from '@ngrx/store'; - -import { ManagerComponent } from './manager.component'; -import { Router } from '@angular/router'; -import { RouterStub, RouterLinkStubDirective, RouterOutletStubComponent } from '../../../../testing/router.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import * as fromDashboard from '../reducer'; - -describe('Metadata Manager Parent Page', () => { - let fixture: ComponentFixture; - let instance: ManagerComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Router, useClass: RouterStub } - ], - imports: [ - NoopAnimationsModule, - MockI18nModule, - StoreModule.forRoot({ - manager: combineReducers(fromDashboard.reducers), - }) - ], - declarations: [ - ManagerComponent, - RouterLinkStubDirective, - RouterOutletStubComponent - ], - }); - - fixture = TestBed.createComponent(ManagerComponent); - instance = fixture.componentInstance; - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/manager/container/manager.component.ts b/ui/src/app/metadata/manager/container/manager.component.ts deleted file mode 100644 index e6932a1bd..000000000 --- a/ui/src/app/metadata/manager/container/manager.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { LoadResolverRequest } from '../../resolver/action/collection.action'; -import { LoadDraftRequest } from '../../resolver/action/draft.action'; -import * as fromRoot from '../../../app.reducer'; -import { LoadProviderRequest } from '../../provider/action/collection.action'; - -@Component({ - selector: 'manager-page', - templateUrl: './manager.component.html', - styleUrls: ['./manager.component.scss'] -}) -export class ManagerComponent { - constructor( - private store: Store - ) { - this.store.dispatch(new LoadResolverRequest()); - this.store.dispatch(new LoadDraftRequest()); - this.store.dispatch(new LoadProviderRequest()); - } -} diff --git a/ui/src/app/metadata/manager/effect/search.effects.ts b/ui/src/app/metadata/manager/effect/search.effects.ts deleted file mode 100644 index 81ce788c4..000000000 --- a/ui/src/app/metadata/manager/effect/search.effects.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store, MemoizedSelector } from '@ngrx/store'; -import { Observable, of } from 'rxjs'; -import { switchMap, map, combineLatest } from 'rxjs/operators'; - -import { - DashboardSearchActionTypes, - SearchAction, - DashboardSearchActionsUnion, - SearchCompleteAction -} from '../action/search.action'; -import * as fromManager from '../reducer'; -import { Metadata } from '../../domain/domain.type'; -import { MetadataResolver } from '../../domain/model'; - - -@Injectable() -export class SearchEffects { - @Effect() - searchResolvers$ = this.actions$.pipe( - ofType(DashboardSearchActionTypes.ENTITY_SEARCH), - map(action => action.payload), - switchMap(({ selector }) => this.performSearch(selector)) - ); - - matcher = (value, query) => value ? value.toLocaleLowerCase().match(query.toLocaleLowerCase()) : false; - - constructor( - private actions$: Actions, - private store: Store - ) { } - - private performSearch(selector: MemoizedSelector): Observable { - return of([]).pipe( - combineLatest( - this.store.select(selector), - (o: any[], p: Metadata[]): Array => o.concat(p) - ), - combineLatest( - this.store.select(fromManager.getSearchQuery), - (entities, term) => - entities.filter( - e => this.matcher(e.name, term) ? true : - ('entityId' in e) ? this.matcher((e as MetadataResolver).entityId, term) : this.matcher(e['@type'], term) - ) - ), - map(entities => new SearchCompleteAction(entities)) - ); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/manager/manager.module.ts b/ui/src/app/metadata/manager/manager.module.ts deleted file mode 100644 index ff29ff372..000000000 --- a/ui/src/app/metadata/manager/manager.module.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { HttpClientModule } from '@angular/common/http'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NgbPaginationModule, NgbModalModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { InfiniteScrollModule } from 'ngx-infinite-scroll'; - -import { ManagerComponent } from './container/manager.component'; -import { ProviderSearchComponent } from './component/provider-search.component'; -import { DashboardResolversListComponent } from './container/dashboard-resolvers-list.component'; -import { DashboardProvidersListComponent } from './container/dashboard-providers-list.component'; -import { reducers } from './reducer'; -import { SearchEffects } from './effect/search.effects'; -import { DeleteDialogComponent } from './component/delete-dialog.component'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { SharedModule } from '../../shared/shared.module'; -import { I18nModule } from '../../i18n/i18n.module'; -import { ResolversListComponent } from './component/resolvers-list.component'; - -@NgModule({ - declarations: [ - ManagerComponent, - ProviderSearchComponent, - DeleteDialogComponent, - DashboardResolversListComponent, - DashboardProvidersListComponent, - ResolversListComponent - ], - entryComponents: [ - DeleteDialogComponent - ], - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPaginationModule, - RouterModule, - NgbModalModule, - NgbDropdownModule, - NgbPopoverModule, - HttpClientModule, - SharedModule, - I18nModule, - InfiniteScrollModule - ], - exports: [ - ResolversListComponent - ] -}) -export class ManagerModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootManagerModule, - providers: [] - }; - } -} - -@NgModule({ - imports: [ - ManagerModule, - StoreModule.forFeature('manager', reducers), - EffectsModule.forFeature([SearchEffects]), - ], -}) -export class RootManagerModule { } diff --git a/ui/src/app/metadata/manager/manager.routing.ts b/ui/src/app/metadata/manager/manager.routing.ts deleted file mode 100644 index 67dbf9283..000000000 --- a/ui/src/app/metadata/manager/manager.routing.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Routes } from '@angular/router'; - -export const ManagerRoutes: Routes = []; diff --git a/ui/src/app/metadata/manager/reducer/index.ts b/ui/src/app/metadata/manager/reducer/index.ts deleted file mode 100644 index 7c308183c..000000000 --- a/ui/src/app/metadata/manager/reducer/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../core/reducer'; -import * as fromSearch from './search.reducer'; - -export interface DashboardState { - search: fromSearch.SearchState; -} - -export interface State extends fromRoot.State { - 'manager': DashboardState; -} - -export const reducers = { - search: fromSearch.reducer -}; - -export const getFeatureState = createFeatureSelector('manager'); - -export const getSearchState = createSelector(getFeatureState, - (state: DashboardState) => state.search -); - -export const getSearchResults = createSelector( - getSearchState, - fromSearch.getEntities -); -export const getSearchQuery = createSelector( - getSearchState, - fromSearch.getQuery -); -export const getSearchLoading = createSelector( - getSearchState, - fromSearch.getLoading -); diff --git a/ui/src/app/metadata/manager/reducer/search.reducer.ts b/ui/src/app/metadata/manager/reducer/search.reducer.ts deleted file mode 100644 index 38b6cf327..000000000 --- a/ui/src/app/metadata/manager/reducer/search.reducer.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { DashboardSearchActionTypes, DashboardSearchActionsUnion } from '../action/search.action'; -import { Metadata } from '../../domain/domain.type'; - -export interface SearchState { - entities: Metadata[]; - loading: boolean; - query: string; -} - -const initialState: SearchState = { - entities: [], - loading: false, - query: '' -}; - -export function reducer(state = initialState, action: DashboardSearchActionsUnion): SearchState { - switch (action.type) { - case DashboardSearchActionTypes.ENTITY_SEARCH: { - return { - ...state, - query: action.payload.query, - loading: true, - }; - } - - case DashboardSearchActionTypes.ENTITY_SEARCH_COMPLETE: { - return { - entities: action.payload, - loading: false, - query: state.query - }; - } - - default: { - return state; - } - } -} - -export const getEntities = (state: SearchState) => state.entities; - -export const getQuery = (state: SearchState) => state.query; - -export const getLoading = (state: SearchState) => state.loading; diff --git a/ui/src/app/metadata/metadata.component.html b/ui/src/app/metadata/metadata.component.html deleted file mode 100644 index 90c6b6463..000000000 --- a/ui/src/app/metadata/metadata.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/metadata/metadata.component.spec.ts b/ui/src/app/metadata/metadata.component.spec.ts deleted file mode 100644 index ae37f90f7..000000000 --- a/ui/src/app/metadata/metadata.component.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { MetadataPageComponent } from './metadata.component'; - -import * as fromRoot from '../core/reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(MetadataPageComponent, {static: true}) - public componentUnderTest: MetadataPageComponent; -} - -describe('Metadata Root Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: MetadataPageComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - core: combineReducers(fromRoot.reducers) - }) - ], - declarations: [ - MetadataPageComponent, - TestHostComponent - ], - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should load metadata objects', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/metadata.component.ts b/ui/src/app/metadata/metadata.component.ts deleted file mode 100644 index 70c094645..000000000 --- a/ui/src/app/metadata/metadata.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'metadata-page', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './metadata.component.html', - styleUrls: [] -}) -export class MetadataPageComponent { - constructor() {} -} diff --git a/ui/src/app/metadata/metadata.module.ts b/ui/src/app/metadata/metadata.module.ts deleted file mode 100644 index 3ae18c5bd..000000000 --- a/ui/src/app/metadata/metadata.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { ResolverModule } from './resolver/resolver.module'; -import { FilterModule } from './filter/filter.module'; -import { DomainModule } from './domain/domain.module'; -import { MetadataPageComponent } from './metadata.component'; -import { ManagerModule } from './manager/manager.module'; -import { MetadataRoutingModule } from './metadata.routing'; -import { ProviderModule } from './provider/provider.module'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomWidgetRegistry } from '../schema-form/registry'; -import { WidgetRegistry } from 'ngx-schema-form'; -import { MetadataConfigurationModule } from './configuration/configuration.module'; -import { NavigationService } from '../core/service/navigation.service'; -import { MetadataResolver } from './domain/model'; -import { AddDraftRequest } from './resolver/action/draft.action'; -import * as fromResolver from './resolver/reducer'; -import { Router } from '@angular/router'; - -@NgModule({ - imports: [ - ResolverModule.forRoot(), - FilterModule.forRoot(), - DomainModule.forRoot(), - ManagerModule.forRoot(), - ProviderModule.forRoot(), - MetadataConfigurationModule.forRoot(), - MetadataRoutingModule, - I18nModule - ], - providers: [ - { provide: WidgetRegistry, useClass: CustomWidgetRegistry } - ], - declarations: [ - MetadataPageComponent - ] -}) -export class MetadataModule { - constructor( - private navService: NavigationService, - private store: Store, - private router: Router - ) { - this.navService.addAction('add-md-source', { - content: 'label.metadata-source', - label: 'action.add-new-source', - action: (event) => { - event.preventDefault(); - const resolver = { - id: `r-${Date.now()}` - }; - this.store.dispatch(new AddDraftRequest(resolver)); - this.router.navigate(['/metadata', 'resolver', 'new'], {queryParams: { id: resolver.id}}); - }, - category: 'metadata', - icon: 'fa-cube' - }); - - this.navService.addAction('add-md-provider', { - content: 'label.metadata-provider', - label: 'action.add-new-provider', - action: (event) => { - event.preventDefault(); - this.router.navigate(['/metadata', 'provider', 'wizard']); - }, - category: 'metadata', - icon: 'fa-cubes', - restrict: ['ROLE_ADMIN'] - }); - } -} diff --git a/ui/src/app/metadata/metadata.routing.ts b/ui/src/app/metadata/metadata.routing.ts deleted file mode 100644 index a2ef97557..000000000 --- a/ui/src/app/metadata/metadata.routing.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { MetadataPageComponent } from './metadata.component'; - -import { ResolverRoutes } from './resolver/resolver.routing'; -import { ProviderRoutes } from './provider/provider.routing'; -import { ManagerRoutes } from './manager/manager.routing'; -import { ConfigurationRoutes } from './configuration/configuration.routing'; - -const routes: Routes = [ - { - path: '', - component: MetadataPageComponent, - children: [ - ...ManagerRoutes, - ...ResolverRoutes, - ...ProviderRoutes, - ...ConfigurationRoutes - ], - }, -]; - -@NgModule({ - imports: [ - RouterModule.forChild(routes), - ], - exports: [RouterModule] -}) -export class MetadataRoutingModule { } diff --git a/ui/src/app/metadata/provider/action/collection.action.ts b/ui/src/app/metadata/provider/action/collection.action.ts deleted file mode 100644 index 163a58c98..000000000 --- a/ui/src/app/metadata/provider/action/collection.action.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { Update } from '@ngrx/entity'; - -export enum ProviderCollectionActionTypes { - UPDATE_PROVIDER_REQUEST = '[Metadata Provider] Update Request', - UPDATE_PROVIDER_SUCCESS = '[Metadata Provider] Update Success', - UPDATE_PROVIDER_FAIL = '[Metadata Provider] Update Fail', - UPDATE_PROVIDER_CONFLICT = '[Metadata Provider] Update Conflict', - - LOAD_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider Load REQUEST', - LOAD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider Load SUCCESS', - LOAD_PROVIDER_ERROR = '[Metadata Provider Collection] Provider Load ERROR', - - SELECT_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider SELECT REQUEST', - SELECT_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider SELECT SUCCESS', - SELECT_PROVIDER_ERROR = '[Metadata Provider Collection] Provider SELECT ERROR', - - ADD_PROVIDER_REQUEST = '[Metadata Provider Collection] Add Provider', - ADD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Add Provider Success', - ADD_PROVIDER_FAIL = '[Metadata Provider Collection] Add Provider Fail', - - REMOVE_PROVIDER_REQUEST = '[Metadata Provider Collection] Remove Provider Request', - REMOVE_PROVIDER_SUCCESS = '[Metadata Provider Collection] Remove Provider Success', - REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail', - - SET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Set Order Provider Request', - SET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Set Order Provider Success', - SET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Set Order Provider Fail', - - GET_ORDER_PROVIDER_REQUEST = '[Metadata Provider Collection] Get Order Provider Request', - GET_ORDER_PROVIDER_SUCCESS = '[Metadata Provider Collection] Get Order Provider Success', - GET_ORDER_PROVIDER_FAIL = '[Metadata Provider Collection] Get Order Provider Fail', - - CHANGE_PROVIDER_ORDER_UP = '[Metadata Provider Collection] Change Order Up', - CHANGE_PROVIDER_ORDER_DOWN = '[Metadata Provider Collection] Change Order Down', - - CLEAR_SELECTION = '[Metadata Provider Collection] Clear Provider Selection' -} - -export class LoadProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST; - - constructor() { } -} - -export class LoadProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider[]) { } -} - -export class LoadProviderError implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_ERROR; - - constructor(public payload: any) { } -} - -export class SelectProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class SelectProviderError implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_PROVIDER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class UpdateProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateProviderConflict implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_CONFLICT; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_FAIL; - - constructor(public payload: MetadataProvider) { } -} - -export class SetOrderProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_REQUEST; - - constructor(public payload: string[]) { } -} - -export class SetOrderProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_SUCCESS; - - constructor() { } -} - -export class SetOrderProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.SET_ORDER_PROVIDER_FAIL; - - constructor(public payload: Error) { } -} - -export class GetOrderProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_REQUEST; - - constructor() { } -} - -export class GetOrderProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class GetOrderProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.GET_ORDER_PROVIDER_FAIL; - - constructor(public payload: Error) { } -} - -export class ChangeProviderOrderUp implements Action { - readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_UP; - - constructor(public payload: string) { } -} - -export class ChangeProviderOrderDown implements Action { - readonly type = ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_DOWN; - - constructor(public payload: string) { } -} - -export class ClearProviderSelection implements Action { - readonly type = ProviderCollectionActionTypes.CLEAR_SELECTION; -} - -export type ProviderCollectionActionsUnion = - | LoadProviderRequest - | LoadProviderSuccess - | LoadProviderError - | SelectProviderRequest - | SelectProviderSuccess - | SelectProviderError - | AddProviderRequest - | AddProviderSuccess - | AddProviderFail - | RemoveProviderRequest - | RemoveProviderSuccess - | RemoveProviderFail - | UpdateProviderRequest - | UpdateProviderSuccess - | UpdateProviderFail - | UpdateProviderConflict - | SetOrderProviderRequest - | SetOrderProviderSuccess - | SetOrderProviderFail - | GetOrderProviderRequest - | GetOrderProviderSuccess - | GetOrderProviderFail - | ChangeProviderOrderUp - | ChangeProviderOrderDown - | ClearProviderSelection; diff --git a/ui/src/app/metadata/provider/action/editor.action.ts b/ui/src/app/metadata/provider/action/editor.action.ts deleted file mode 100644 index 37a99c98b..000000000 --- a/ui/src/app/metadata/provider/action/editor.action.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum EditorActionTypes { - UPDATE_STATUS = '[Provider Editor] Update Status', - SELECT_PROVIDER_TYPE = '[Provider Editor] Select Provider Type', - CLEAR = '[Provider Editor] Clear' -} - -export class UpdateStatus implements Action { - readonly type = EditorActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class SelectProviderType implements Action { - readonly type = EditorActionTypes.SELECT_PROVIDER_TYPE; - - constructor(public payload: string) { } -} - -export class ClearEditor implements Action { - readonly type = EditorActionTypes.CLEAR; -} - -export type EditorActionUnion = - | UpdateStatus - | SelectProviderType - | ClearEditor; diff --git a/ui/src/app/metadata/provider/action/entity.action.ts b/ui/src/app/metadata/provider/action/entity.action.ts deleted file mode 100644 index 44c2ca90d..000000000 --- a/ui/src/app/metadata/provider/action/entity.action.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model'; - -export enum EntityActionTypes { - UPDATE_PROVIDER = '[Provider Entity] Update Provider', - CLEAR_PROVIDER = '[Provider Entity] Clear', - RESET_CHANGES = '[Provider Entity] Reset Changes' -} - -export class UpdateProvider implements Action { - readonly type = EntityActionTypes.UPDATE_PROVIDER; - - constructor(public payload: Partial) { } -} - -export class ClearProvider implements Action { - readonly type = EntityActionTypes.CLEAR_PROVIDER; -} - -export class ResetChanges implements Action { - readonly type = EntityActionTypes.RESET_CHANGES; -} - -export type EntityActionUnion = - | UpdateProvider - | ClearProvider - | ResetChanges; diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.html b/ui/src/app/metadata/provider/component/delete-filter.component.html deleted file mode 100644 index 519e0c662..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.html +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts b/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts deleted file mode 100644 index 837ca2047..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { NgbDropdownModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { DeleteFilterComponent } from './delete-filter.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(DeleteFilterComponent, { static: true }) - public componentUnderTest: DeleteFilterComponent; -} - -describe('Delete Filter (modal) Component', () => { - - let app: DeleteFilterComponent; - let fixture: ComponentFixture; - let instance: TestHostComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule - ], - declarations: [ - DeleteFilterComponent, - TestHostComponent - ], - providers: [ - { - provide: NgbActiveModal, - useValue: jasmine.createSpyObj('activeModal', [ - 'close', - 'dismiss' - ]) - } - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.ts b/ui/src/app/metadata/provider/component/delete-filter.component.ts deleted file mode 100644 index b1da35392..000000000 --- a/ui/src/app/metadata/provider/component/delete-filter.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; - -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'delete-filter-dialog', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './delete-filter.component.html' -}) -export class DeleteFilterComponent { - constructor( - public activeModal: NgbActiveModal - ) { } -} diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.html b/ui/src/app/metadata/provider/container/provider-edit-step.component.html deleted file mode 100644 index ad969fd9e..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
- - - {{ lock.value ? 'Locked' : 'Unlocked' }} - - For Advanced Knowledge Only -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts deleted file mode 100644 index 0e6b88854..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, fakeAsync, tick, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderEditStepComponent } from './provider-edit-step.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import { SharedModule } from '../../../shared/shared.module'; -import { FileBackedHttpMetadataProviderEditor } from '../model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderEditStepComponent, {static: true}) - public componentUnderTest: ProviderEditStepComponent; -} - -describe('Provider Edit Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderEditStepComponent; - let store: Store; - let storeSpy: any; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - SharedModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: FileBackedHttpMetadataProviderEditor, - schemaPath: '', - loading: false, - schema: { - type: 'object', - properties: { - foo: { - type: 'string' - } - } - }, - locked: false - } - }) - }) - ], - declarations: [ - ProviderEditStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - storeSpy = spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('updateStatus method', () => { - it('should update the status with provided errors', () => { - storeSpy.calls.reset(); - app.currentPage = 'common'; - app.updateStatus({value: 'common'}); - expect(store.dispatch).toHaveBeenCalledTimes(1); - }); - }); - - describe('valueChangeEmitted$ subject', () => { - it('should update the provider', fakeAsync(() => { - app.valueChangeSubject.next({value: { name: 'foo' } }); - fixture.detectChanges(); - tick(); - fixture.detectChanges(); - expect(store.dispatch).toHaveBeenCalled(); - })); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts deleted file mode 100644 index 79f8d33bc..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; -import { FormControl } from '@angular/forms'; - -import * as fromProvider from '../reducer'; -import { UpdateStatus } from '../action/editor.action'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, distinctUntilChanged, filter } from 'rxjs/operators'; -import { UpdateProvider } from '../action/entity.action'; - -@Component({ - selector: 'provider-edit-step', - templateUrl: './provider-edit-step.component.html', - styleUrls: [] -}) -export class ProviderEditStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - currentPage: string; - - namesList: string[] = []; - - schema$: Observable; - provider$: Observable; - model$: Observable; - definition$: Observable>; - changes$: Observable; - step$: Observable; - bindings$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - lock: FormControl = new FormControl(true); - - constructor( - private store: Store - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - this.provider$ = this.store.select(fromProvider.getSelectedProvider); - this.step$ = this.store.select(fromWizard.getCurrent); - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.lock.valueChanges.subscribe(locked => this.store.dispatch(locked ? new LockEditor() : new UnlockEditor())); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromProvider.getProviderNames), - this.store.select(fromProvider.getProviderXmlIds), - this.provider$ - ), - filter(([def, names, ids, provider]) => !!def), - map(([def, names, ids, provider]) => def.getValidators( - names.filter(n => n !== provider.name), - ids.filter(id => id !== provider.xmlId) - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromProvider.getSelectedProvider), - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, provider, model, changes, definition]) => { - return ({ - model: { - ...model, - ...provider, - ...changes - }, - definition - }); - }), - filter(({ model, definition }) => definition && model), - map(({ model, definition }) => definition ? definition.formatter(model) : {}) - ); - - this.valueChangeEmitted$.pipe( - map(changes => changes.value), - withLatestFrom(this.definition$, this.store.select(fromProvider.getSelectedProvider)), - filter(([ changes, definition, provider ]) => definition && changes && provider), - map(([ changes, definition, provider ]) => { - const appliedFilters = changes && changes.metadataFilters ? { - ...changes, - metadataFilters: Object.keys(changes.metadataFilters).reduce((filters, filterType) => ({ - ...filters, - [filterType]: { - ...provider.metadataFilters.find(f => f['@type'] === filterType) || {}, - ...changes.metadataFilters[filterType] - } - }), {}) - } : changes; - const parsed = definition.parser(appliedFilters); - return parsed; - }) - ) - .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.statusChangeSubject.complete(); - this.ngUnsubscribe.unsubscribe(); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.html b/ui/src/app/metadata/provider/container/provider-edit.component.html deleted file mode 100644 index 514fc1c48..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.html +++ /dev/null @@ -1,74 +0,0 @@ -
-
-
-
- - Edit Metadata Provider - {{ (provider$ | async).name }} -
-
-
-
-
-
- - - - - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - - - - -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts deleted file mode 100644 index 7ae7516e2..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router, ActivatedRouteSnapshot } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; -import { TestBed, ComponentFixture, fakeAsync, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderEditComponent } from './provider-edit.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SharedModule } from '../../../shared/shared.module'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { FileBackedHttpMetadataProviderEditor } from '../model'; -import { EditorNavComponent } from '../../domain/component/editor-nav.component'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MetadataProvider } from '../../domain/model'; -import { of } from 'rxjs'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderEditComponent, {static: true}) - public componentUnderTest: ProviderEditComponent; -} - -describe('Provider Edit Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderEditComponent; - let store: Store; - let router: Router; - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - let child: ActivatedRouteStub = new ActivatedRouteStub(); - let modal: NgbModal; - child.testParamMap = { form: 'common' }; - activatedRoute.firstChild = child; - - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule.withRoutes([ - {path: 'edit', children: []}, - {path: 'foo', children: []}, - {path: '', children: []} - ]), - SharedModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: FileBackedHttpMetadataProviderEditor, - schemaPath: '', - loading: false, - schema: {}, - locked: false - } - }) - }), - MockI18nModule - ], - declarations: [ - ProviderEditComponent, - TestHostComponent, - EditorNavComponent - ], - providers: [ - DifferentialService, - { provide: NgbModal, useClass: NgbModalStub }, - { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: APP_BASE_HREF, useValue: '/' } - ] - }).compileComponents(); - - store = TestBed.get(Store); - router = TestBed.get(Router); - modal = TestBed.get(NgbModal); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('save method', () => { - it('should route to the given child form', () => { - app.save(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('cancel method', () => { - it('should route to the provider', () => { - spyOn(router, 'navigate'); - spyOn(app, 'clear'); - app.cancel('foo'); - expect(router.navigate).toHaveBeenCalled(); - expect(app.clear).toHaveBeenCalled(); - }); - }); - - describe('clear method', () => { - it('should dispatch actions to clear the reducer state', () => { - app.clear(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('canDeactivate method', () => { - it('should check if the current route is another edit page', (done) => { - let route = new ActivatedRouteStub(), - snapshot = route.snapshot; - let result = app.canDeactivate(null, { url: 'edit', root: null }, { url: 'edit', root: null }); - result.subscribe(can => { - expect(can).toBe(true); - done(); - }); - fixture.detectChanges(); - }); - - it('should open a modal', (done) => { - app.latest = { name: 'bar' }; - spyOn(store, 'select').and.returnValue(of(false)); - spyOn(modal, 'open').and.returnValue({ result: Promise.resolve('closed') } as NgbModalRef); - fixture.detectChanges(); - let route = new ActivatedRouteStub(), - snapshot = route.snapshot; - let result = app.canDeactivate(null, { url: 'edit', root: null }, { url: 'foo', root: null }); - result.subscribe(can => { - expect(can).toBe(false); - expect(modal.open).toHaveBeenCalled(); - done(); - }); - fixture.detectChanges(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.ts b/ui/src/app/metadata/provider/container/provider-edit.component.ts deleted file mode 100644 index d577fe3a0..000000000 --- a/ui/src/app/metadata/provider/container/provider-edit.component.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Router, ActivatedRoute, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Observable, of, Subject } from 'rxjs'; -import { map, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import * as fromWizard from '../../../wizard/reducer'; -import * as fromProvider from '../reducer'; -import { SetIndex, LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { ClearEditor } from '../action/editor.action'; -import { MetadataProvider } from '../../domain/model'; -import { ClearProvider } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { UpdateProviderRequest } from '../action/collection.action'; -import { NgbModal } from '../../../../../node_modules/@ng-bootstrap/ng-bootstrap'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { FilterableProviders } from '../model'; - -@Component({ - selector: 'provider-edit', - templateUrl: './provider-edit.component.html', - styleUrls: [] -}) - -export class ProviderEditComponent implements OnDestroy, CanComponentDeactivate { - private ngUnsubscribe: Subject = new Subject(); - - provider$: Observable; - definition$: Observable>; - index$: Observable; - - valid$: Observable; - isInvalid$: Observable; - status$: Observable; - isSaving$: Observable; - canFilter$: Observable; - - latest: MetadataProvider; - provider: MetadataProvider; - - formats = NAV_FORMATS; - - latest$: Observable; - - constructor( - private store: Store, - private router: Router, - private route: ActivatedRoute, - private modalService: NgbModal, - private diffService: DifferentialService - ) { - this.provider$ = this.store.select(fromProvider.getSelectedProvider).pipe(filter(d => !!d)); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(filter(i => !!i)); - this.valid$ = this.store.select(fromProvider.getEditorIsValid); - this.isInvalid$ = this.valid$.pipe(map(v => !v)); - this.status$ = this.store.select(fromProvider.getInvalidEditorForms); - this.isSaving$ = this.store.select(fromProvider.getEntityIsSaving); - - let startIndex$ = this.route.firstChild.params.pipe(map(p => p.form || 'filters')); - startIndex$.subscribe(index => this.store.dispatch(new SetIndex(index))); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - this.provider$.subscribe(p => this.provider = p); - this.latest$ = this.store.select(fromProvider.getEntityChanges); - this.latest$.subscribe(changes => this.latest = changes); - - this.canFilter$ = this.definition$.pipe(map(def => FilterableProviders.indexOf(def.type) > -1)); - } - - ngOnDestroy() { - this.clear(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - clear(): void { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearEditor()); - } - - save(): void { - this.store.dispatch(new UpdateProviderRequest(this.latest)); - } - - cancel(id): void { - this.clear(); - this.router.navigate(['/', 'metadata', 'provider', id, 'configuration', 'options']); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - if (nextState.url.match('edit')) { - return of(true); - } - const diff = this.diffService.updatedDiff(this.provider, this.latest); - if (diff && Object.keys(diff).length > 0) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.result.then( - () => { - this.clear(); - this.router.navigate([nextState.url]); - }, - () => console.warn('denied') - ); - return this.store.select(fromProvider.getEntityIsSaved); - } - return of(true); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.html b/ui/src/app/metadata/provider/container/provider-filter-list.component.html deleted file mode 100644 index f38e66d7b..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
-
- - Edit Metadata Provider - {{ (provider$ | async).name }} - -
-
-
-
- -
-
-
- - - - - -
-
- - -
-
-
-
diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.scss b/ui/src/app/metadata/provider/container/provider-filter-list.component.scss deleted file mode 100644 index e1a2e17b9..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -:host { - .table { - .td-sm { - max-width: 100px; - } - .td-xs { - max-width: 20px; - } - .td-lg { - width: 30%; - } - - td { - vertical-align: middle; - } - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts deleted file mode 100644 index f427ce535..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderFilterListComponent } from './provider-filter-list.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { EditorNavComponent, NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { ValidFormIconComponent } from '../../../shared/component/valid-form-icon.component'; -import { DeleteFilterComponent } from '../component/delete-filter.component'; -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { FilterListComponentStub } from '../../../../testing/filter-list.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderFilterListComponent, {static: true}) - public componentUnderTest: ProviderFilterListComponent; -} - -describe('Provider Filter List Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderFilterListComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - ProviderFilterListComponent, - EditorNavComponent, - ValidFormIconComponent, - DeleteFilterComponent, - TestHostComponent, - FilterListComponentStub - ], - providers: [ - { provide: NgbModal, useClass: NgbModalStub } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('remove method', () => { - it('should dispatch an action to the store', () => { - app.remove('foo'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.ts deleted file mode 100644 index 5b92e0651..000000000 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; -import { skipWhile, takeUntil } from 'rxjs/operators'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromProvider from '../reducer'; -import * as fromFilter from '../../filter/reducer'; -import { MetadataFilter, MetadataProvider } from '../../domain/model'; -import { SetIndex } from '../../../wizard/action/wizard.action'; - -import { - UpdateFilterRequest, - LoadFilterRequest, - ChangeFilterOrderUp, - ChangeFilterOrderDown, - RemoveFilterRequest, - ClearFilters -} from '../../filter/action/collection.action'; -import { DeleteFilterComponent } from '../component/delete-filter.component'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; - -@Component({ - selector: 'provider-filter-list', - templateUrl: './provider-filter-list.component.html', - styleUrls: ['./provider-filter-list.component.scss'] -}) -export class ProviderFilterListComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - filters$: Observable; - provider$: Observable; - isSaving$: Observable; - - provider: MetadataProvider; - - formats = NAV_FORMATS; - - constructor( - private store: Store, - private modalService: NgbModal - ) { - - console.log('filter list') - this.filters$ = this.store.select(fromFilter.getAdditionalFilters) as Observable; - this.provider$ = this.store.select(fromProvider.getSelectedProvider).pipe(skipWhile(p => !p)); - this.provider$ - .pipe( - takeUntil(this.ngUnsubscribe) - ) - .subscribe(p => { - this.store.dispatch(new LoadFilterRequest(p.resourceId)); - this.provider = p; - }); - - this.store.dispatch(new SetIndex('filters')); - - this.isSaving$ = this.store.select(fromFilter.getCollectionSaving); - } - - toggleEnabled(filter: MetadataFilter): void { - this.store.dispatch(new UpdateFilterRequest({ - filter: { ...filter, filterEnabled: !filter.filterEnabled }, - providerId: this.provider.resourceId - })); - } - - updateOrderUp(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderUp({ id: filter.resourceId, providerId: this.provider.resourceId })); - } - - updateOrderDown(filter: MetadataFilter): void { - this.store.dispatch(new ChangeFilterOrderDown({ id: filter.resourceId, providerId: this.provider.resourceId })); - } - - remove(id: string): void { - this.modalService - .open(DeleteFilterComponent) - .result - .then( - success => { - this.store.dispatch(new RemoveFilterRequest(id)); - }, - err => { - console.log('Cancelled'); - } - ); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - - this.store.dispatch(new ClearFilters()); - } -} diff --git a/ui/src/app/metadata/provider/container/provider-select.component.html b/ui/src/app/metadata/provider/container/provider-select.component.html deleted file mode 100644 index 5389bd7e9..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-select.component.spec.ts b/ui/src/app/metadata/provider/container/provider-select.component.spec.ts deleted file mode 100644 index e4b9accc3..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { ProviderSelectComponent } from './provider-select.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MetadataProvider } from '../../domain/model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderSelectComponent, {static: true}) - public componentUnderTest: ProviderSelectComponent; -} - -describe('Provider Select Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderSelectComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }) - ], - declarations: [ - ProviderSelectComponent, - TestHostComponent - ], - providers: [] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('setDefinition method', () => { - it('should not dispatch an action if no provider is defined', () => { - app.setDefinition(null); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - it('should dispatch an action if a provider is defined', () => { - app.setDefinition({} as MetadataProvider); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-select.component.ts b/ui/src/app/metadata/provider/container/provider-select.component.ts deleted file mode 100644 index 6e300d302..000000000 --- a/ui/src/app/metadata/provider/container/provider-select.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Subscription, Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import { map, filter } from 'rxjs/operators'; -import { SelectProviderRequest, ClearProviderSelection } from '../action/collection.action'; -import * as fromProviders from '../reducer'; -import { MetadataProvider } from '../../domain/model'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { MetadataProviderEditorTypes } from '../model'; -import { ClearProvider } from '../action/entity.action'; -import { ClearEditor } from '../action/editor.action'; - -@Component({ - selector: 'provider-select', - templateUrl: './provider-select.component.html', - styleUrls: [] -}) - -export class ProviderSelectComponent implements OnDestroy { - actionsSubscription: Subscription; - providerSubscription: Subscription; - - provider$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute - ) { - this.actionsSubscription = this.route.params.pipe( - map(params => new SelectProviderRequest(params.providerId)) - ).subscribe(store); - - this.provider$ = this.store.select(fromProviders.getSelectedProvider).pipe(filter(p => !!p)); - - this.providerSubscription = this.provider$.subscribe(provider => { - this.setDefinition(provider); - }); - } - - setDefinition(provider: MetadataProvider): void { - if (provider) { - this.store.dispatch(new SetDefinition({ - ...MetadataProviderEditorTypes.find(def => def.type === provider['@type']) - })); - } - } - - ngOnDestroy() { - this.actionsSubscription.unsubscribe(); - this.providerSubscription.unsubscribe(); - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearWizard()); - this.store.dispatch(new ClearEditor()); - this.store.dispatch(new ClearProviderSelection()); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html b/ui/src/app/metadata/provider/container/provider-wizard-step.component.html deleted file mode 100644 index a9a3be2e4..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts b/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts deleted file mode 100644 index 883b9f793..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardStepComponent } from './provider-wizard-step.component'; -import * as fromRoot from '../reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { MetadataProviderWizard } from '../model'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderWizardStepComponent, {static: true}) - public componentUnderTest: ProviderWizardStepComponent; -} - -describe('Provider Wizard Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderWizardStepComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }) - ], - declarations: [ - ProviderWizardStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('resetSelectedType method', () => { - it('should dispatch a SetDefinition action if the type has changed', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'FileBackedHttpMetadataResolver' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'MetadataProvider' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type isn\'t found', () => { - app.resetSelectedType({ value: { name: 'foo', '@type': 'FooProvider' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - - it('should return changes and definition if no type supplied', () => { - app.resetSelectedType({ value: { name: 'foo' } }, SCHEMA, MetadataProviderWizard); - expect(store.dispatch).not.toHaveBeenCalled(); - }); - }); - - describe('updateStatus method', () => { - it('should dispatch an UpdateStatus action', () => { - app.updateStatus({value: { name: 'notfound'} }); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.updateStatus({ value: null }); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts b/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts deleted file mode 100644 index a78f76db0..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { withLatestFrom, map, distinctUntilChanged, skipWhile, filter, takeUntil } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromProvider from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { SetDefinition } from '../../../wizard/action/wizard.action'; -import { UpdateStatus } from '../action/editor.action'; -import { Wizard } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { MetadataProviderWizardTypes, MetadataProviderWizard } from '../model'; -import { UpdateProvider } from '../action/entity.action'; -import { pick } from '../../../shared/util'; - -@Component({ - selector: 'provider-wizard-step', - templateUrl: './provider-wizard-step.component.html', - styleUrls: [] -}) - -export class ProviderWizardStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - schema$: Observable; - bindings$: Observable; - schema: any; - definition$: Observable>; - changes$: Observable; - currentPage: string; - valid$: Observable; - model$: Observable; - - namesList: string[] = []; - - validators$: Observable<{ [key: string]: any }>; - - constructor( - private store: Store, - ) { - this.schema$ = this.store.select(fromWizard.getSchema).pipe( - filter(s => s && Object.keys(s.properties).length > 0) - ); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromProvider.getProviderNames), - this.store.select(fromProvider.getProviderXmlIds), - ), - map(([def, names, ids]) => def.getValidators( - names, - ids - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, model, changes, definition]) => ({ - model: { - ...model, - ...changes - }, - definition - })), - skipWhile(({ model, definition }) => !definition || !model), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.valueChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - withLatestFrom(this.schema$, this.definition$), - map(([changes, schema, definition]) => this.resetSelectedType(changes, schema, definition)), - skipWhile(({ changes, definition }) => !definition || !changes), - map(({ changes, definition }) => definition.parser(changes)) - ) - .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); - - this.statusChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged()) - .subscribe(errors => this.updateStatus(errors)); - - this.store.select(fromWizard.getWizardIndex).pipe(takeUntil(this.ngUnsubscribe)).subscribe(i => this.currentPage = i); - } - - resetSelectedType(changes: any, schema: any, definition: any): { changes: any, definition: any } { - const type = changes.value['@type']; - if (type && type !== definition.type) { - const newDefinition = MetadataProviderWizardTypes.find(def => def.type === type); - if (newDefinition) { - this.store.dispatch(new SetDefinition({ - ...MetadataProviderWizard, - ...newDefinition, - steps: [ - ...MetadataProviderWizard.steps, - ...newDefinition.steps - ] - })); - changes = { value: pick(Object.keys(schema.properties))(changes.value) }; - } - } - return { changes: changes.value, definition }; - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} - diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.html b/ui/src/app/metadata/provider/container/provider-wizard.component.html deleted file mode 100644 index bb0f77f1f..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
-
- Add a new metadata provider -
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
-
- diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts deleted file mode 100644 index 055a97714..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardComponent } from './provider-wizard.component'; -import * as fromRoot from '../reducer'; -import { WizardModule } from '../../../wizard/wizard.module'; -import { SummaryPropertyComponent } from '../../domain/component/summary-property.component'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MetadataConfigurationComponentStub } from '../../../../testing/metadata-configuration.stub'; -import { WizardComponent } from '../../../wizard/component/wizard.component'; -import { EffectsModule } from '@ngrx/effects'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ProviderWizardComponent, {static: true}) - public componentUnderTest: ProviderWizardComponent; -} - -describe('Provider Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ProviderWizardComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - WizardModule.forRoot(), - WizardModule, - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - StoreModule.forRoot({ - provider: combineReducers(fromRoot.reducers), - wizard: combineReducers(fromWizard.reducers) - }), - EffectsModule.forRoot([]), - MockI18nModule - ], - declarations: [ - ProviderWizardComponent, - SummaryPropertyComponent, - MetadataConfigurationComponentStub, - TestHostComponent - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.ts deleted file mode 100644 index c17ae03f2..000000000 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import * as fromProvider from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { SetIndex, SetDisabled, ClearWizard, SetDefinition } from '../../../wizard/action/wizard.action'; -import { ClearEditor } from '../action/editor.action'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { startWith, takeUntil } from 'rxjs/operators'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { ClearProvider } from '../action/entity.action'; -import { AddProviderRequest } from '../action/collection.action'; -import { MetadataProviderWizard } from '../model'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; - -@Component({ - selector: 'provider-wizard', - templateUrl: './provider-wizard.component.html', - styleUrls: [] -}) - -export class ProviderWizardComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - definition$: Observable>; - changes$: Observable; - model$: Observable; - currentPage: string; - valid$: Observable; - - nextStep: WizardStep; - previousStep: WizardStep; - - summary$: Observable = this.store.select(fromProvider.getProviderConfiguration); - - provider: MetadataProvider; - - constructor( - private store: Store - ) { - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - this.valid$ = this.store.select(fromProvider.getEditorIsValid); - this.changes$ = this.store.select(fromProvider.getEntityChanges); - - this.store.select(fromWizard.getNext).subscribe(n => this.nextStep = n); - this.store.select(fromWizard.getPrevious).subscribe(p => this.previousStep = p); - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - - this.valid$ - .pipe(startWith(false), takeUntil(this.ngUnsubscribe)) - .subscribe((valid) => { - this.store.dispatch(new SetDisabled(!valid)); - }); - - this.changes$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(c => this.provider = c); - - this.store.dispatch(new SetDefinition(MetadataProviderWizard)); - this.store.dispatch(new SetIndex(MetadataProviderWizard.steps[0].id)); - } - - ngOnDestroy() { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearWizard()); - this.store.dispatch(new ClearEditor()); - - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - next(): void { - this.store.dispatch(new SetIndex(this.nextStep.id)); - } - - previous(): void { - this.store.dispatch(new SetIndex(this.previousStep.id)); - } - - save(): void { - this.store.dispatch(new SetDisabled(true)); - this.store.dispatch(new AddProviderRequest(this.provider)); - } - - gotoPage(page: string): void { - this.store.dispatch(new SetIndex(page)); - } -} - diff --git a/ui/src/app/metadata/provider/effect/collection.effect.ts b/ui/src/app/metadata/provider/effect/collection.effect.ts deleted file mode 100644 index 04d296c7e..000000000 --- a/ui/src/app/metadata/provider/effect/collection.effect.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom, debounceTime } from 'rxjs/operators'; -import { - ProviderCollectionActionTypes, - AddProviderRequest, - AddProviderSuccess, - AddProviderFail, - LoadProviderRequest, - LoadProviderSuccess, - LoadProviderError, - SelectProviderRequest, - SelectProviderSuccess, - SelectProviderError, - UpdateProviderRequest, - UpdateProviderSuccess, - UpdateProviderFail, - UpdateProviderConflict, - GetOrderProviderRequest, - GetOrderProviderSuccess, - GetOrderProviderFail, - SetOrderProviderRequest, - SetOrderProviderSuccess, - SetOrderProviderFail, - ChangeProviderOrderUp, - ChangeProviderOrderDown -} from '../action/collection.action'; -import { MetadataProviderService } from '../../domain/service/provider.service'; -import * as fromProvider from '../reducer'; -import * as fromRoot from '../../../app.reducer'; -import { array_move } from '../../../shared/util'; -import { ClearProvider } from '../action/entity.action'; -import { ShowContentionAction } from '../../../contention/action/contention.action'; -import { ContentionService } from '../../../contention/service/contention.service'; -import { MetadataProvider } from '../../domain/model'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { SetDisabled } from '../../../wizard/action/wizard.action'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromI18n from '../../../i18n/reducer'; -import { ClearEditor } from '../action/editor.action'; - - -/* istanbul ignore next */ -@Injectable() -export class CollectionEffects { - - @Effect() - openContention$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_CONFLICT), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProvider)), - switchMap(([changes, current]) => - this.providerService.find(current.resourceId).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, changes, data, { - resolve: (obj) => this.store.dispatch(new UpdateProviderRequest({ ...obj })), - reject: (obj) => this.gotoConfiguration(current) - }))) - ) - ) - ); - - - @Effect() - loadProviders$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST), - switchMap(() => - this.providerService - .query() - .pipe( - map(providers => new LoadProviderSuccess(providers)), - catchError(error => of(new LoadProviderError(error))) - ) - ) - ); - - @Effect() - selectProviders$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SELECT_PROVIDER_REQUEST), - map(action => action.payload), - debounceTime(500), - switchMap(id => { - return this.providerService - .find(id) - .pipe( - map(provider => new SelectProviderSuccess(provider)), - catchError(error => of(new SelectProviderError(error))) - ); - }) - ); - - @Effect() - createProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(provider => - this.providerService - .save(provider) - .pipe( - map(p => new AddProviderSuccess(p)), - catchError((e) => { - return of(new AddProviderFail(e.error)); - }) - ) - ) - ); - - @Effect() - createProviderFailDispatchNotification$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => { - let message = `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`; - message = error.cause ? `${message} - ${error.cause}` : message; - return new AddNotification( - new Notification( - NotificationType.Danger, - message, - 8000 - ) - ); - }) - ); - @Effect() - createProviderFailEnableForm$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_FAIL), - map(action => action.payload), - map(error => new SetDisabled(false)) - ); - - @Effect({ dispatch: false }) - createProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.navigateToProvider(provider.resourceId)) - ); - - @Effect() - updateProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getSelectedProvider)), - map(([updates, original]) => ({ ...original, ...updates })), - switchMap(provider => - this.providerService - .update(provider) - .pipe( - map(p => new UpdateProviderSuccess({id: p.resourceId, changes: p})), - catchError((e) => e.status === 409 ? of(new UpdateProviderConflict(provider)) : of(new UpdateProviderFail(e.error))) - ) - ) - ); - - @Effect({ dispatch: false }) - updateProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.store.dispatch(new LoadProviderRequest())) - ); - - @Effect({ dispatch: false }) - updateProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => { - this.store.dispatch(new ClearProvider()); - this.navigateToProvider(provider.id); - }) - ); - - @Effect() - updateProviderFailDispatchNotification$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - addProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - map(provider => new LoadProviderRequest()) - ); - - @Effect() - getOrderWithLoad$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS), - map(() => new GetOrderProviderRequest()) - ); - - @Effect() - getProviderOrder$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.GET_ORDER_PROVIDER_REQUEST), - switchMap(() => - this.providerService.getOrder().pipe( - map(order => new GetOrderProviderSuccess(order)), - catchError(err => of(new GetOrderProviderFail(err))) - ) - ) - ); - - @Effect() - reloadProviderOrderAfterChange$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SET_ORDER_PROVIDER_SUCCESS), - map(() => new GetOrderProviderRequest()) - ); - - @Effect() - setProviderOrder$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SET_ORDER_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(order => - this.providerService.setOrder(order).pipe( - map(() => new SetOrderProviderSuccess()), - catchError(err => of(new SetOrderProviderFail(err))) - ) - ) - ); - - @Effect() - changeOrderUp$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_UP), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getProviderOrder)), - map(([id, order]) => { - const index = order.indexOf(id); - if (index > 0) { - const newOrder = array_move(order, index, index - 1); - return new SetOrderProviderRequest(newOrder); - } else { - return new SetOrderProviderFail(new Error(`could not change order: ${ id }`)); - } - }) - ); - - @Effect() - changeOrderDown$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.CHANGE_PROVIDER_ORDER_DOWN), - map(action => action.payload), - withLatestFrom(this.store.select(fromProvider.getProviderOrder)), - map(([id, order]) => { - const index = order.indexOf(id); - if (index < order.length - 1) { - const newOrder = array_move(order, index, index + 1); - return new SetOrderProviderRequest(newOrder); - } else { - return new SetOrderProviderFail(new Error(`could not change order: ${id}`)); - } - }) - ); - - constructor( - private actions$: Actions, - private router: Router, - private store: Store, - private providerService: MetadataProviderService, - private contentionService: ContentionService, - private i18nService: I18nService - ) { } - - navigateToProvider(id) { - this.router.navigate(['/', 'metadata', 'provider', id, 'configuration', 'options']); - } - - gotoConfiguration(provider) { - this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearEditor()); - this.navigateToProvider(provider.resourceId); - } -} diff --git a/ui/src/app/metadata/provider/effect/editor.effect.ts b/ui/src/app/metadata/provider/effect/editor.effect.ts deleted file mode 100644 index 28a134724..000000000 --- a/ui/src/app/metadata/provider/effect/editor.effect.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { SchemaService } from '../../../schema-form/service/schema.service'; - -import { map, switchMap, catchError, debounceTime } from 'rxjs/operators'; -import { of } from 'rxjs'; -import { - LoadSchemaRequest, - LoadSchemaSuccess, - LoadSchemaFail, - SetDefinition, - WizardActionTypes -} from '../../../wizard/action/wizard.action'; -import { ResetChanges } from '../action/entity.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { Store } from '@ngrx/store'; -import { CancelContentionAction, ContentionActionTypes } from '../../../contention/action/contention.action'; - -@Injectable() -export class EditorEffects { - - @Effect() - $loadSchemaRequest = this.actions$.pipe( - ofType(WizardActionTypes.LOAD_SCHEMA_REQUEST), - map(action => action.payload), - debounceTime(100), - switchMap((schemaPath: string) => - this.schemaService - .get(schemaPath) - .pipe( - map(schema => new LoadSchemaSuccess(schema)), - catchError(error => of(new LoadSchemaFail(error))) - ) - ) - ); - - @Effect() - $resetChanges = this.actions$.pipe( - ofType(WizardActionTypes.SET_DEFINITION), - map(() => new ResetChanges()) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new ResetChanges()) - ); - - constructor( - private schemaService: SchemaService, - private actions$: Actions - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/provider/model/base.provider.form.spec.ts b/ui/src/app/metadata/provider/model/base.provider.form.spec.ts deleted file mode 100644 index 99adaa6fa..000000000 --- a/ui/src/app/metadata/provider/model/base.provider.form.spec.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { BaseMetadataProviderEditor } from './base.provider.form'; - -describe('BaseMetadataProviderForm', () => { - - const parser = BaseMetadataProviderEditor.parser; - const formatter = BaseMetadataProviderEditor.formatter; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators', () => { - it('should return a set of validator functions for the provider type', () => { - const validators = BaseMetadataProviderEditor.getValidators([]); - expect(validators).toBeDefined(); - expect(validators['/']).toBeDefined(); - expect(validators['/name']).toBeDefined(); - }); - - describe('name `/name` validator', () => { - const validators = BaseMetadataProviderEditor.getValidators(['foo', 'bar']); - - it('should return an invalid object when provided values are invalid based on name', () => { - expect(validators['/name']('foo', { path: '/name' })).toBeDefined(); - }); - - it('should return null when provided values are valid based on name', () => { - expect(validators['/name']('baz', { path: '/name' })).toBeNull(); - }); - }); - - describe('parent `/` validator', () => { - const validators = BaseMetadataProviderEditor.getValidators(['foo', 'bar']); - const prop = { path: '/name', properties: { name: { type: 'string' } } }; - - it('should return a list of child errors', () => { - expect(validators['/']({name: 'foo'}, prop, {}).length).toBe(1); - }); - - it('should ignore properties that don\'t exist a list of child errors', () => { - expect(validators['/']({ foo: 'bar' }, prop, {})).toBeUndefined(); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/base.provider.form.ts b/ui/src/app/metadata/provider/model/base.provider.form.ts deleted file mode 100644 index 1fce5263d..000000000 --- a/ui/src/app/metadata/provider/model/base.provider.form.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { BaseMetadataProvider } from '../../domain/model/providers'; -import { getFilteredProviderNames, getFilteredProviderXmlIds } from '../reducer'; - -export const BaseMetadataProviderEditor: Wizard = { - label: 'BaseMetadataProvider', - type: 'BaseMetadataResolver', - schema: '', - validatorParams: [getFilteredProviderNames, getFilteredProviderXmlIds], - getValidators(namesList: string[], xmlIdList: string[]): any { - const validators = { - '/': (value, property, form_current) => { - let errors; - Object.keys(value).forEach((key) => { - const item = value[key]; - const validatorKey = `/${key}`; - const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; - const error = validator ? validator(item, property.properties[key], form_current) : null; - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }, - '/name': (value, property, form) => { - const err = namesList.indexOf(value) > -1 ? { - code: 'INVALID_NAME', - path: `#${property.path}`, - message: 'message.name-must-be-unique', - params: [value] - } : null; - return err; - }, - '/xmlId': (value, property, form) => { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - } - }; - return validators; - }, - parser: (changes: any): BaseMetadataProvider => (changes.metadataFilters ? ({ - ...changes, - metadataFilters: [ - ...Object.keys(changes.metadataFilters).reduce((collection, filterName) => ([ - ...collection, - { - ...changes.metadataFilters[filterName], - '@type': filterName - } - ]), []) - ] - }) : changes), - formatter: (changes: BaseMetadataProvider): any => (changes.metadataFilters ? ({ - ...changes, - metadataFilters: { - ...(changes.metadataFilters || []).reduce((collection, filter) => ({ - ...collection, - [filter['@type']]: filter - }), {}) - } - }) : changes), - steps: [] -}; diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts deleted file mode 100644 index f561b4e99..000000000 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.spec.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { DynamicHttpMetadataProviderWizard } from './dynamic-http.provider.form'; - -const schema = { - 'type': 'object', - 'required': [ - '@type', - 'content' - ], - 'properties': { - '@type': { - 'title': 'label.md-request-type', - 'description': 'tooltip.md-request-type', - 'type': 'string', - 'widget': { - 'id': 'select' - }, - 'oneOf': [ - { - 'enum': [ - 'MetadataQueryProtocol' - ], - 'description': 'value.md-query-protocol' - }, - { - 'enum': [ - 'Regex' - ], - 'description': 'value.regex' - } - ] - }, - 'content': { - 'title': 'label.md-request-value', - 'description': 'tooltip.md-request-value', - 'type': 'string' - }, - 'match': { - 'title': 'label.match', - 'description': 'tooltip.match', - 'type': 'string', - 'visibleIf': { - '@type': [ - 'Regex' - ] - } - } - } -}; - -describe('DynamicHttpMetadataProviderWizard', () => { - - const parser = DynamicHttpMetadataProviderWizard.parser; - const formatter = DynamicHttpMetadataProviderWizard.formatter; - const getValidators = DynamicHttpMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'DynamicHttpMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId', - '/metadataRequestURLConstructionScheme', - '/metadataRequestURLConstructionScheme/content', - '/metadataRequestURLConstructionScheme/@type', - '/metadataRequestURLConstructionScheme/match' - ]); - }); - }); - - describe('validators', () => { - let validators, - metadataRequestURLConstructionScheme, - metadataRequestURLConstructionSchemeContent, - metadataRequestURLConstructionSchemeType, - metadataRequestURLConstructionSchemeMatch; - - beforeEach(() => { - validators = getValidators([], []); - }); - - describe('metadataRequestURLConstructionScheme', () => { - it('should check other validators and propagate those errors up', () => { - const value = { - content: null, - '@type': null, - match: 'foo' - }; - const property = { value, schema, properties: null }; - property.properties = { - content: { - path: 'content', - parent: property - }, - '@type': { - path: '@type', - parent: property - }, - match: { - path: 'match', - parent: property - } - }; - const validator = validators['/metadataRequestURLConstructionScheme']; - expect(validator(value, property, null).length).toBe(2); - }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts deleted file mode 100644 index ac09ed7ac..000000000 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { DynamicHttpMetadataProvider } from '../../domain/model/providers/dynamic-http-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import { metadataFilterProcessor } from './utilities'; -import RegexValidator from '../../../shared/validation/regex.validator'; -import { memoize } from '../../../shared/memo'; -import API_BASE_PATH from '../../../app.constant'; - -const checkRegex = memoize(RegexValidator.isValidRegex); - -export const DynamicHttpMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'DynamicHttpMetadataProvider', - type: 'DynamicHttpMetadataResolver', - schemaPreprocessor: metadataFilterProcessor, - getValidators(namesList: string[] = [], xmlIdList: string[] = []): any { - const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); - - validators['/metadataRequestURLConstructionScheme'] = (value, property, form) => { - let errors; - let keys = Object.keys(property.schema.properties); - - keys.forEach((item) => { - const path = `/metadataRequestURLConstructionScheme/${item}`; - const error = validators[path](value[item], property.properties[item], form); - if (error) { - errors = errors || []; - errors.push(error); - } - }); - return errors; - }; - - validators['/metadataRequestURLConstructionScheme/content'] = (value, property, form) => { - const err = !value ? { - code: 'REQUIRED', - path: `#${property.path}`, - message: 'message.value-required', - params: [value] - } : null; - return err; - }; - - validators['/metadataRequestURLConstructionScheme/@type'] = (value, property, form) => { - const err = !value ? { - code: 'REQUIRED', - path: `#${property.path}`, - message: 'message.type-required', - params: [value] - } : null; - return err; - }; - - validators['/metadataRequestURLConstructionScheme/match'] = (value, property, form) => { - if (!property.parent || !property.parent.value) { - return null; - } - - const error = { - path: `#${property.path}`, - params: [value] - }; - - const isRegex = property.parent.value['@type'] === 'Regex'; - let err = null; - if (isRegex) { - if (!value) { - err = { - ...error, - code: 'REQUIRED', - message: 'message.match-required' - }; - } - if (!checkRegex(value)) { - err = { - ...error, - code: 'INVALID_REGEX', - message: 'message.invalid-regex-pattern' - }; - } - } - return err; - }; - - return validators; - }, - schema: `${API_BASE_PATH}/ui/MetadataResolver/DynamicHttpMetadataResolver`, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'requireValidMetadata', - 'failFastInitialization', - 'metadataRequestURLConstructionScheme' - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 5, - initialValues: [], - fields: [ - 'enabled' - ] - } - ] -}; - - -export const DynamicHttpMetadataProviderEditor: Wizard = { - ...DynamicHttpMetadataProviderWizard, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type', - 'xmlId', - 'metadataRequestURLConstructionScheme', - 'enabled', - 'requireValidMetadata', - 'failFastInitialization' - ], - fieldsets: [ - { - type: 'section', - class: ['mb-3'], - fields: [ - 'name', - '@type' - ] - }, - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'xmlId', - 'metadataRequestURLConstructionScheme', - 'enabled', - 'requireValidMetadata', - 'failFastInitialization' - ] - } - ], - override: { - '@type': { - type: 'string', - readOnly: true, - widget: 'string', - oneOf: [{ enum: ['DynamicHttpMetadataResolver'], description: 'value.dynamic-http-metadata-provider' }] - } - } - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'advanced', - label: 'label.http-settings-advanced', - index: 4, - initialValues: [], - locked: true, - fields: [ - 'httpMetadataResolverAttributes' - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts deleted file mode 100644 index 4176905de..000000000 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.spec.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { FileBackedHttpMetadataProviderWizard } from './file-backed-http.provider.form'; - -describe('FileBackedHttpMetadataProviderWizard', () => { - - const parser = FileBackedHttpMetadataProviderWizard.parser; - const formatter = FileBackedHttpMetadataProviderWizard.formatter; - const getValidators = FileBackedHttpMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileBackedHttpMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId', - '/metadataURL' - ]); - }); - - it('should validate the metadataUrl format', () => { - const validators = getValidators(); - const path = '/metadataURL'; - const validator = validators[path]; - - expect(validator('foo', { path })).toBeDefined(); - expect(validator('http://foo.com', { path })).toBeNull(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts deleted file mode 100644 index 15064bd64..000000000 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { FileBackedHttpMetadataProvider } from '../../domain/model/providers/file-backed-http-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import { UriValidator } from '../../../shared/validation/uri.validator'; - -import { metadataFilterProcessor } from './utilities'; - -export const FileBackedHttpMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'FileBackedHttpMetadataProvider', - type: 'FileBackedHttpMetadataResolver', - schemaPreprocessor: metadataFilterProcessor, - getValidators(namesList: string[] = [], xmlIdList: string[] = []): any { - const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); - validators['/metadataURL'] = (value, property, form) => { - return !UriValidator.isUri(value) ? { - code: 'INVALID_URI', - path: `#${property.path}`, - message: 'message.uri-valid-format', - params: [value] - } : null; - }; - return validators; - }, - schema: 'assets/schema/provider/filebacked-http.schema.json', - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'metadataURL', - 'initializeFromBackupFile', - 'backingFile', - 'backupFileInitNextRefreshDelay', - 'requireValidMetadata', - 'failFastInitialization', - 'useDefaultPredicateRegistry', - 'satisfyAnyPredicates' - ] - }, - { - id: 'reloading', - label: 'label.reloading-attributes', - index: 3, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 4, - initialValues: [ - { key: 'metadataFilters', value: [] } - ], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 5, - initialValues: [], - fields: [ - 'enabled' - ] - } - ] -}; - - -export const FileBackedHttpMetadataProviderEditor: Wizard = { - ...FileBackedHttpMetadataProviderWizard, - schema: 'assets/schema/provider/filebacked-http.schema.json', - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type', - 'enabled', - 'xmlId', - 'metadataURL', - 'initializeFromBackupFile', - 'backingFile', - 'backupFileInitNextRefreshDelay', - 'requireValidMetadata', - 'failFastInitialization', - 'useDefaultPredicateRegistry', - 'satisfyAnyPredicates' - ] - }, - { - id: 'reloading', - label: 'label.reloading-attributes', - index: 2, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - }, - { - id: 'plugins', - label: 'label.metadata-filter-plugins', - index: 3, - initialValues: [ - { key: 'metadataFilters', value: [] } - ], - fields: [ - 'metadataFilters' - ] - }, - { - id: 'advanced', - label: 'label.advanced-settings', - index: 4, - initialValues: [], - locked: true, - fields: [ - 'httpMetadataResolverAttributes' - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts b/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts deleted file mode 100644 index ae8fb4a9a..000000000 --- a/ui/src/app/metadata/provider/model/file-system.provider.form.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { FileSystemMetadataProviderWizard } from './file-system.provider.form'; - -describe('FileSystemMetadataProviderWizard', () => { - - const parser = FileSystemMetadataProviderWizard.parser; - const formatter = FileSystemMetadataProviderWizard.formatter; - const getValidators = FileSystemMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'FileSystemMetadataProvider', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId' - ]); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/file-system.provider.form.ts b/ui/src/app/metadata/provider/model/file-system.provider.form.ts deleted file mode 100644 index acff99069..000000000 --- a/ui/src/app/metadata/provider/model/file-system.provider.form.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { FileSystemMetadataProvider } from '../../domain/model/providers/file-system-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import API_BASE_PATH from '../../../app.constant'; - -export const FileSystemMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'FilesystemMetadataProvider', - type: 'FilesystemMetadataResolver', - schema: `${API_BASE_PATH}/ui/MetadataResolver/FilesystemMetadataResolver`, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'metadataFile', - 'doInitialization' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'xmlId', - 'metadataFile', - 'doInitialization' - ] - } - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - } - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 4, - initialValues: [], - fields: [ - 'enabled' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'enabled' - ] - } - ] - } - ] -}; - - -export const FileSystemMetadataProviderEditor: Wizard = { - ...FileSystemMetadataProviderWizard, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - 'xmlId', - '@type', - 'metadataFile', - 'enabled', - 'doInitialization' - ], - override: { - '@type': { - type: 'string', - readOnly: true, - widget: 'string', - oneOf: [{ enum: ['FilesystemMetadataResolver'], description: 'value.file-system-metadata-provider'}] - } - }, - fieldsets: [ - { - type: 'section', - class: ['mb-3'], - fields: [ - 'name', - '@type' - ] - }, - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'enabled', - 'xmlId', - 'metadataFile', - 'doInitialization' - ] - } - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 2, - initialValues: [], - fields: [ - 'reloadableMetadataResolverAttributes' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'reloadableMetadataResolverAttributes' - ] - } - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/index.ts b/ui/src/app/metadata/provider/model/index.ts deleted file mode 100644 index 123f99812..000000000 --- a/ui/src/app/metadata/provider/model/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { FileBackedHttpMetadataProviderWizard } from './file-backed-http.provider.form'; -import { FileBackedHttpMetadataProviderEditor } from './file-backed-http.provider.form'; -import { DynamicHttpMetadataProviderWizard, DynamicHttpMetadataProviderEditor } from './dynamic-http.provider.form'; -import { LocalDynamicMetadataProviderWizard, LocalDynamicMetadataProviderEditor } from './local-dynamic.provider.form'; -import { FileSystemMetadataProviderWizard, FileSystemMetadataProviderEditor } from './file-system.provider.form'; - -export const MetadataProviderWizardTypes = [ - FileBackedHttpMetadataProviderWizard, - DynamicHttpMetadataProviderWizard, - FileSystemMetadataProviderWizard, - LocalDynamicMetadataProviderWizard -]; - -export const MetadataProviderEditorTypes = [ - FileBackedHttpMetadataProviderEditor, - DynamicHttpMetadataProviderEditor, - LocalDynamicMetadataProviderEditor, - FileSystemMetadataProviderEditor -]; - -export const FilterableProviders = [ - FileBackedHttpMetadataProviderEditor.type, - DynamicHttpMetadataProviderEditor.type, - LocalDynamicMetadataProviderEditor.type -]; - -export * from './file-backed-http.provider.form'; -export * from './provider.form'; diff --git a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts b/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts deleted file mode 100644 index 3275f2f31..000000000 --- a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { LocalDynamicMetadataProviderWizard } from './local-dynamic.provider.form'; - -describe('LocalDynamicMetadataProviderWizard', () => { - - const parser = LocalDynamicMetadataProviderWizard.parser; - const formatter = LocalDynamicMetadataProviderWizard.formatter; - const getValidators = LocalDynamicMetadataProviderWizard.getValidators; - - const requiredValidUntilFilter = { - maxValidityInterval: 1, - '@type': 'RequiredValidUntil' - }; - - const signatureValidationFilter = { - requireSignedRoot: true, - certificateFile: 'foo', - '@type': 'SignatureValidation' - }; - - const entityRoleWhiteListFilter = { - retainedRoles: ['foo', 'bar'], - removeRolelessEntityDescriptors: true, - removeEmptyEntitiesDescriptors: true, - '@type': 'EntityRoleWhiteList' - }; - - describe('parser', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - }; - expect( - parser(model) - ).toEqual( - { - ...model, - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - parser(model) - ).toEqual( - model - ); - }); - }); - - describe('formatter', () => { - it('should transform the filters object to an array', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo', - metadataFilters: [ - requiredValidUntilFilter, - signatureValidationFilter, - entityRoleWhiteListFilter - ] - }; - expect( - formatter(model) - ).toEqual( - { - ...model, - metadataFilters: { - RequiredValidUntil: requiredValidUntilFilter, - SignatureValidation: signatureValidationFilter, - EntityRoleWhiteList: entityRoleWhiteListFilter - } - } - ); - }); - - it('should return the object if metadataFilters is not provided', () => { - let model = { - name: 'foo', - '@type': 'LocalDynamicMetadataResolver', - enabled: true, - resourceId: 'foo' - }; - expect( - formatter(model) - ).toEqual( - model - ); - }); - }); - - describe('getValidators method', () => { - it('should return a list of validators for the ngx-schema-form', () => { - expect(Object.keys(getValidators([]))).toEqual([ - '/', - '/name', - '/xmlId' - ]); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts b/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts deleted file mode 100644 index 6fdba5270..000000000 --- a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Wizard } from '../../../wizard/model'; -import { LocalDynamicMetadataProvider } from '../../domain/model/providers/local-dynamic-metadata-provider'; -import { BaseMetadataProviderEditor } from './base.provider.form'; -import API_BASE_PATH from '../../../app.constant'; - -export const LocalDynamicMetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'LocalDynamicMetadataProvider', - type: 'LocalDynamicMetadataResolver', - schema: `${API_BASE_PATH}/ui/MetadataResolver/LocalDynamicMetadataResolver`, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 2, - initialValues: [], - fields: [ - 'xmlId', - 'sourceDirectory' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'xmlId', - 'sourceDirectory' - ] - } - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 3, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - } - ] - }, - { - id: 'summary', - label: 'label.finished', - index: 4, - initialValues: [], - fields: [ - 'enabled' - ], - fieldsets: [ - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'enabled' - ] - } - ] - } - ] -}; - - -export const LocalDynamicMetadataProviderEditor: Wizard = { - ...LocalDynamicMetadataProviderWizard, - steps: [ - { - id: 'common', - label: 'label.common-attributes', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type', - 'enabled', - 'xmlId', - 'sourceDirectory', - ], - override: { - '@type': { - type: 'string', - readOnly: true, - widget: 'string', - oneOf: [{ enum: ['LocalDynamicMetadataResolver'], description: 'value.local-dynamic-metadata-provider' }] - } - }, - fieldsets: [ - { - type: 'section', - class: ['mb-3'], - fields: [ - 'name', - '@type' - ] - }, - { - type: 'group-lg', - class: ['col-12'], - fields: [ - 'enabled', - 'xmlId', - 'sourceDirectory', - ] - } - ] - }, - { - id: 'dynamic', - label: 'label.dynamic-attributes', - index: 2, - initialValues: [], - fields: [ - 'dynamicMetadataResolverAttributes' - ] - } - ] -}; diff --git a/ui/src/app/metadata/provider/model/provider.form.ts b/ui/src/app/metadata/provider/model/provider.form.ts deleted file mode 100644 index 4377d1083..000000000 --- a/ui/src/app/metadata/provider/model/provider.form.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; -import { BaseMetadataProviderEditor } from './base.provider.form'; - -export const MetadataProviderWizard: Wizard = { - ...BaseMetadataProviderEditor, - label: 'MetadataProvider', - type: 'MetadataProvider', - schema: 'assets/schema/provider/metadata-provider.schema.json', - steps: [ - { - id: 'new', - label: 'label.select-metadata-provider-type', - index: 1, - initialValues: [], - fields: [ - 'name', - '@type' - ], - fieldsets: [ - { - type: 'section', - class: ['col-12'], - fields: [ - 'name', - '@type' - ] - } - ] - } - ] as WizardStep[], -}; diff --git a/ui/src/app/metadata/provider/model/utilities.spec.ts b/ui/src/app/metadata/provider/model/utilities.spec.ts deleted file mode 100644 index 5affea1ae..000000000 --- a/ui/src/app/metadata/provider/model/utilities.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { metadataFilterProcessor } from './utilities'; - -describe('provider model utilities', () => { - describe('metadata filter processor function', () => { - it('should return null if no schema provided', () => { - expect(metadataFilterProcessor(null)).toBe(null); - }); - - it('should return the schema if no properties are detected', () => { - const schema = {}; - expect(metadataFilterProcessor(schema)).toBe(schema); - }); - - it('should return the schema if no metadataFilters property exists in the schema', () => { - const schema = { properties: { foo: 'bar' } }; - expect(metadataFilterProcessor(schema)).toBe(schema); - }); - - it('should turn the filters into an object if provided ', () => { - const schema = { properties: { metadataFilters: { - type: 'array', - items: [ - { - $id: 'foo', - type: 'string' - } - ] - } } }; - const processed = metadataFilterProcessor(schema); - expect(processed.properties.metadataFilters.properties.foo.type).toBe('string'); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/model/utilities.ts b/ui/src/app/metadata/provider/model/utilities.ts deleted file mode 100644 index dc415bae1..000000000 --- a/ui/src/app/metadata/provider/model/utilities.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const metadataFilterProcessor = (schema) => { - if (!schema) { - return null; - } - if (!schema.properties || !schema.properties.metadataFilters) { - return schema; - } - const filters = schema.properties.metadataFilters; - const processed = ({ - ...schema, - properties: { - ...schema.properties, - metadataFilters: { - type: 'object', - properties: filters.items.reduce((collection, filterType) => ({ - ...collection, - [filterType.$id]: filterType - }), {}) - } - } - }); - return processed; -}; diff --git a/ui/src/app/metadata/provider/provider.component.ts b/ui/src/app/metadata/provider/provider.component.ts deleted file mode 100644 index 3572b8642..000000000 --- a/ui/src/app/metadata/provider/provider.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { LoadProviderRequest } from './action/collection.action'; -import * as fromRoot from '../../app.reducer'; - -@Component({ - selector: 'metadata-provider-page', - changeDetection: ChangeDetectionStrategy.OnPush, - template: '
', - styleUrls: [] -}) -export class MetadataProviderPageComponent { - - constructor( - private store: Store - ) { - // this.store.dispatch(new LoadProviderRequest()); - } -} diff --git a/ui/src/app/metadata/provider/provider.module.ts b/ui/src/app/metadata/provider/provider.module.ts deleted file mode 100644 index 25f4a13d2..000000000 --- a/ui/src/app/metadata/provider/provider.module.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { StoreModule } from '@ngrx/store'; - -import { EffectsModule } from '@ngrx/effects'; -import { NgbDropdownModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderWizardComponent } from './container/provider-wizard.component'; -import { ProviderWizardStepComponent } from './container/provider-wizard-step.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import * as fromProvider from './reducer'; -import { EditorEffects } from './effect/editor.effect'; - -import { FormModule } from '../../schema-form/schema-form.module'; -import { CollectionEffects } from './effect/collection.effect'; -import { SharedModule } from '../../shared/shared.module'; -import { ProviderEditComponent } from './container/provider-edit.component'; -import { ProviderSelectComponent } from './container/provider-select.component'; -import { ProviderEditStepComponent } from './container/provider-edit-step.component'; -import { ProviderFilterListComponent } from './container/provider-filter-list.component'; - -import { ContentionModule } from '../../contention/contention.module'; -import { DeleteFilterComponent } from './component/delete-filter.component'; -import { I18nModule } from '../../i18n/i18n.module'; -import { DomainModule } from '../domain/domain.module'; -import { MetadataProviderPageComponent } from './provider.component'; -import { FilterModule } from '../filter/filter.module'; -import { MetadataConfigurationModule } from '../configuration/configuration.module'; - -@NgModule({ - declarations: [ - ProviderWizardComponent, - ProviderWizardStepComponent, - ProviderEditComponent, - ProviderEditStepComponent, - ProviderSelectComponent, - ProviderFilterListComponent, - DeleteFilterComponent, - MetadataProviderPageComponent - ], - entryComponents: [ - DeleteFilterComponent - ], - imports: [ - ReactiveFormsModule, - CommonModule, - WizardModule, - RouterModule, - SharedModule, - FormModule, - RouterModule, - ContentionModule, - NgbDropdownModule, - NgbModalModule, - I18nModule, - DomainModule, - FilterModule, - MetadataConfigurationModule - ], - exports: [] -}) -export class ProviderModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootProviderModule - }; - } -} - -@NgModule({ - imports: [ - ProviderModule, - StoreModule.forFeature('provider', fromProvider.reducers), - EffectsModule.forFeature([EditorEffects, CollectionEffects]) - ] -}) -export class RootProviderModule { } diff --git a/ui/src/app/metadata/provider/provider.routing.ts b/ui/src/app/metadata/provider/provider.routing.ts deleted file mode 100644 index 635edc45f..000000000 --- a/ui/src/app/metadata/provider/provider.routing.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Routes } from '@angular/router'; - -import { ProviderWizardComponent } from './container/provider-wizard.component'; -import { ProviderWizardStepComponent } from './container/provider-wizard-step.component'; -import { ProviderEditComponent } from './container/provider-edit.component'; -import { ProviderEditStepComponent } from './container/provider-edit-step.component'; -import { ProviderSelectComponent } from './container/provider-select.component'; -import { ProviderFilterListComponent } from './container/provider-filter-list.component'; -import { NewFilterComponent } from '../filter/container/new-filter.component'; -import { SelectFilterComponent } from '../filter/container/select-filter.component'; -import { EditFilterComponent } from '../filter/container/edit-filter.component'; -import { EditFilterStepComponent } from '../filter/container/edit-filter-step.component'; -import { CanDeactivateGuard } from '../../core/service/can-deactivate.guard'; -import { FilterComponent } from '../filter/container/filter.component'; -import { AdminGuard } from '../../core/service/admin.guard'; -import { MetadataProviderPageComponent } from './provider.component'; -import { NewFilterStepComponent } from '../filter/container/new-filter-step.component'; - -export const ProviderRoutes: Routes = [ - { - path: 'provider', - component: MetadataProviderPageComponent, - canActivate: [AdminGuard], - children: [ - { - path: 'wizard', - redirectTo: `wizard/new` - }, - { - path: 'wizard', - component: ProviderWizardComponent, - canActivate: [], - children: [ - { - path: 'new', - component: ProviderWizardStepComponent, - data: { title: `Create Provider`, subtitle: true }, - } - ] - }, - { - path: ':providerId', - component: ProviderSelectComponent, - children: [ - { - path: 'edit', - component: ProviderEditComponent, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: ProviderEditStepComponent, - data: { title: `Edit Metadata Provider`, subtitle: true } - } - ], - canDeactivate: [ - CanDeactivateGuard - ] - }, - { - path: 'filters', - component: ProviderFilterListComponent, - data: { title: `Metadata Filter List` } - } - ] - }, - { - path: ':providerId/filter', - component: FilterComponent, - children: [ - { - path: 'new', - component: NewFilterComponent, - data: { title: `Create New Filter` }, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: NewFilterStepComponent, - data: { title: `Create Filter`, subtitle: true } - } - ] - }, - { - path: ':filterId', - component: SelectFilterComponent, - canActivate: [], - children: [ - { - path: 'edit', - component: EditFilterComponent, - data: { title: `Edit Metadata Filter` }, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':form', - component: EditFilterStepComponent, - data: { title: `Edit Metadata Filter`, subtitle: true } - } - ] - } - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts deleted file mode 100644 index 75dbac2c2..000000000 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { reducer, initialState as snapshot } from './collection.reducer'; -import * as fromProvider from './collection.reducer'; -import { - ProviderCollectionActionTypes, - LoadProviderSuccess, - UpdateProviderSuccess -} from '../action/collection.action'; - -describe('Provider Collection Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS}`, () => { - it('should add the loaded providers to the collection', () => { - spyOn(fromProvider.adapter, 'addAll').and.callThrough(); - const providers = [ - { - resourceId: 'foo', - name: 'name', - '@type': 'foo', - enabled: true, - createdBy: 'admin', - createdDate: new Date().toLocaleDateString(), - sortKey: 1, - xmlId: 'foo', - metadataFilters: [] - }, - { - resourceId: 'bar', - name: 'bar', - '@type': 'bar', - enabled: false, - createdBy: 'admin', - createdDate: new Date().toLocaleDateString(), - sortKey: 2, - xmlId: 'bar', - metadataFilters: [] - } - ]; - const action = new LoadProviderSuccess(providers); - const result = reducer(snapshot, action); - expect(fromProvider.adapter.addAll).toHaveBeenCalled(); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS}`, () => { - it('should add the loaded providers to the collection', () => { - spyOn(fromProvider.adapter, 'updateOne').and.callThrough(); - const update = { - id: 'foo', - changes: { resourceId: 'foo', name: 'bar', createdDate: new Date().toLocaleDateString() }, - }; - const action = new UpdateProviderSuccess(update); - const result = reducer(snapshot, action); - expect(fromProvider.adapter.updateOne).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.ts deleted file mode 100644 index cecd944b0..000000000 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { ProviderCollectionActionTypes, ProviderCollectionActionsUnion } from '../action/collection.action'; -import { MetadataProvider } from '../../domain/model'; - -export interface CollectionState extends EntityState { - selectedProviderId: string | null; - loaded: boolean; - order: string[]; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: MetadataProvider) => model.resourceId -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedProviderId: null, - loaded: false, - order: [] -}); - -export function reducer(state = initialState, action: ProviderCollectionActionsUnion): CollectionState { - switch (action.type) { - case ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS: { - return adapter.upsertOne(action.payload, { - ...state, - selectedProviderId: action.payload.resourceId - }); - } - case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - selectedProviderId: state.selectedProviderId, - loaded: true - }); - } - - case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case ProviderCollectionActionTypes.GET_ORDER_PROVIDER_SUCCESS: { - return { - ...state, - order: action.payload - }; - } - - case ProviderCollectionActionTypes.CLEAR_SELECTION: { - return { - ...state, - selectedProviderId: null - }; - } - - default: { - return state; - } - } -} - -export const getSelectedProviderId = (state: CollectionState) => state.selectedProviderId; -export const getIsLoaded = (state: CollectionState) => state.loaded; -export const { - selectIds: selectProviderIds, - selectEntities: selectProviderEntities, - selectAll: selectAllProviders, - selectTotal: selectProviderTotal -} = adapter.getSelectors(); - -export const getProviderOrder = (state: CollectionState) => state.order; diff --git a/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts deleted file mode 100644 index 37c32302a..000000000 --- a/ui/src/app/metadata/provider/reducer/editor.reducer.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { reducer, initialState as snapshot } from './editor.reducer'; -import { - EditorActionTypes, - ClearEditor, - SelectProviderType -} from '../action/editor.action'; - -describe('Provider Editor Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${EditorActionTypes.CLEAR}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearEditor())).toEqual(snapshot); - }); - }); - - describe(`${EditorActionTypes.SELECT_PROVIDER_TYPE}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new SelectProviderType('foo'))).toEqual({ ...snapshot, type: 'foo' }); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/editor.reducer.ts b/ui/src/app/metadata/provider/reducer/editor.reducer.ts deleted file mode 100644 index 0d56550b7..000000000 --- a/ui/src/app/metadata/provider/reducer/editor.reducer.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { EditorActionTypes, EditorActionUnion } from '../action/editor.action'; - -export interface EditorState { - status: { [key: string]: string }; - type: string; -} - -export const initialState: EditorState = { - status: {}, - type: null -}; - -export function reducer(state = initialState, action: EditorActionUnion): EditorState { - switch (action.type) { - case EditorActionTypes.SELECT_PROVIDER_TYPE: { - return { - ...state, - type: action.payload - }; - } - case EditorActionTypes.CLEAR: { - return { - ...initialState - }; - } - case EditorActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { - ...state.status, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - - - -export const isEditorValid = (state: EditorState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getFormStatus = (state: EditorState) => state.status; -export const getInvalidForms = (state: EditorState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts deleted file mode 100644 index 2f1bcff62..000000000 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { reducer, initialState as snapshot, isEntitySaved } from './entity.reducer'; -import { EntityActionTypes, ClearProvider } from '../action/entity.action'; -import { MetadataProvider } from '../../domain/model'; -import { - ProviderCollectionActionTypes, - UpdateProviderRequest, - AddProviderRequest, - UpdateProviderSuccess, - UpdateProviderFail, - AddProviderFail, - AddProviderSuccess -} from '../action/collection.action'; - -describe('Provider Editor Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${EntityActionTypes.CLEAR_PROVIDER}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearProvider())).toEqual(snapshot); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST}`, () => { - it('should set to `saving`', () => { - expect(reducer(snapshot, new UpdateProviderRequest({})).saving).toBe(true); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST}`, () => { - it('should set to `saving`', () => { - expect(reducer(snapshot, new AddProviderRequest({})).saving).toBe(true); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new UpdateProviderSuccess({id: 'foo', changes: {} })).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_FAIL}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new AddProviderFail({})).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new AddProviderSuccess({})).saving).toBe(false); - }); - }); - - describe(`${ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL}`, () => { - it('should set to not `saving`', () => { - expect(reducer(snapshot, new UpdateProviderFail({})).saving).toBe(false); - }); - }); - - describe(`isEntitySaved method`, () => { - it('should return false if there are changes', () => { - expect(isEntitySaved({ - ...snapshot, - changes: { - name: 'bar' - } - })).toBe(false); - }); - - it('should return true if there are no changes', () => { - expect(isEntitySaved({ - ...snapshot, - changes: {} - })).toBe(true); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.ts deleted file mode 100644 index b47600d94..000000000 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { MetadataProvider } from '../../domain/model'; -import { EntityActionTypes, EntityActionUnion } from '../action/entity.action'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/collection.action'; - -export interface EntityState { - saving: boolean; - changes: MetadataProvider; -} - -export const initialState: EntityState = { - saving: false, - changes: null -}; - -export function reducer(state = initialState, action: EntityActionUnion | ProviderCollectionActionsUnion): EntityState { - switch (action.type) { - case ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST: - case ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST: { - return { - ...state, - saving: true - }; - } - - case ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL: - case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: - case ProviderCollectionActionTypes.ADD_PROVIDER_FAIL: - case ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS: { - return { - ...state, - saving: false - }; - } - case EntityActionTypes.CLEAR_PROVIDER: { - return { - ...initialState - }; - } - case EntityActionTypes.RESET_CHANGES: { - return { - ...state, - changes: { - ...initialState.changes - }, - saving: false - }; - } - case EntityActionTypes.UPDATE_PROVIDER: { - return { - ...state, - changes: { - ...state.changes, - ...action.payload - } - }; - } - default: { - return state; - } - } -} - -export const isEntitySaved = (state: EntityState) => state.changes ? !Object.keys(state.changes).length && !state.saving : true; -export const getEntityChanges = (state: EntityState) => state.changes; -export const isEditorSaving = (state: EntityState) => state.saving; -export const getUpdatedEntity = (state: EntityState) => state.changes; diff --git a/ui/src/app/metadata/provider/reducer/index.spec.ts b/ui/src/app/metadata/provider/reducer/index.spec.ts deleted file mode 100644 index 7ffb3e9db..000000000 --- a/ui/src/app/metadata/provider/reducer/index.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { getFilteredListFn } from './'; - -describe('Provider Reducer selectors', () => { - describe(`getFilteredListFn method`, () => { - it('should return a list without the provider`s property', () => { - - const fn = getFilteredListFn('name'); - const name = 'foo'; - const collection = ['foo', 'bar', 'baz']; - const provider = { name }; - - expect(fn(collection, provider)).toEqual(['bar', 'baz']); - }); - - it('should return the list if the provider passed is null', () => { - - const fn = getFilteredListFn('name'); - const name = 'foo'; - const collection = ['foo', 'bar', 'baz']; - - expect(fn(collection, null)).toEqual(['foo', 'bar', 'baz']); - }); - }); -}); diff --git a/ui/src/app/metadata/provider/reducer/index.ts b/ui/src/app/metadata/provider/reducer/index.ts deleted file mode 100644 index ce8a2813e..000000000 --- a/ui/src/app/metadata/provider/reducer/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../app.reducer'; -import * as fromEditor from './editor.reducer'; -import * as fromEntity from './entity.reducer'; -import * as fromCollection from './collection.reducer'; -import * as utils from '../../domain/domain.util'; - -import * as fromWizard from '../../../wizard/reducer'; - -import { MetadataProvider } from '../../domain/model'; -import { getConfigurationSectionsFn } from '../../configuration/reducer/utilities'; - -export interface ProviderState { - editor: fromEditor.EditorState; - entity: fromEntity.EntityState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - editor: fromEditor.reducer, - entity: fromEntity.reducer, - collection: fromCollection.reducer -}; - -export interface State extends fromRoot.State { - provider: ProviderState; -} - -export const getProviderState = createFeatureSelector('provider'); - -export const getEditorStateFn = (state: ProviderState) => state.editor; -export const getEntityStateFn = (state: ProviderState) => state.entity; -export const getCollectionStateFn = (state: ProviderState) => state.collection; - -export const getEditorState = createSelector(getProviderState, getEditorStateFn); -export const getEntityState = createSelector(getProviderState, getEntityStateFn); -export const getCollectionState = createSelector(getProviderState, getCollectionStateFn); - -/* -Editor State -*/ - -export const getEditorIsValid = createSelector(getEditorState, fromEditor.isEditorValid); - -export const getFormStatus = createSelector(getEditorState, fromEditor.getFormStatus); -export const getInvalidEditorForms = createSelector(getEditorState, fromEditor.getInvalidForms); - - -/* -Entity State -*/ - -export const getEntityIsSaved = createSelector(getEntityState, fromEntity.isEntitySaved); -export const getEntityChanges = createSelector(getEntityState, fromEntity.getEntityChanges); -export const getEntityIsSaving = createSelector(getEntityState, fromEntity.isEditorSaving); -export const getUpdatedEntity = createSelector(getEntityState, fromEntity.getUpdatedEntity); - -/* - * Select pieces of Provider Collection -*/ -export const getProviderOrder = createSelector(getCollectionState, fromCollection.getProviderOrder); -export const getAllProviders = createSelector(getCollectionState, fromCollection.selectAllProviders); -export const getProviderEntities = createSelector(getCollectionState, fromCollection.selectProviderEntities); -export const getSelectedProviderId = createSelector(getCollectionState, fromCollection.getSelectedProviderId); -export const getSelectedProvider = createSelector(getProviderEntities, getSelectedProviderId, utils.getInCollectionFn); -export const getProviderIds = createSelector(getCollectionState, fromCollection.selectProviderIds); -export const getProviderCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); - -export const getProviderNames = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.name)); - -export const getFilteredListFn = (property: string) => - (collection, provider) => !provider ? collection : collection.filter(val => val !== provider[property]); - -export const getFilteredProviderNames = createSelector(getProviderNames, getSelectedProvider, getFilteredListFn('name')); - -export const getProviderFilters = createSelector(getSelectedProvider, provider => provider.metadataFilters); - -export const getProviderXmlIds = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.xmlId)); -export const getOrderedProviders = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); -export const getOrderedProvidersInSearch = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn); - -export const getFilteredProviderXmlIds = createSelector(getProviderXmlIds, getSelectedProvider, getFilteredListFn('xmlId')); - -export const getProviderModelList = createSelector(getEntityChanges, (model) => [model]); - -export const getProviderConfiguration = createSelector( - getProviderModelList, - fromWizard.getWizardDefinition, - fromWizard.getProcessedSchema, - getConfigurationSectionsFn -); diff --git a/ui/src/app/metadata/resolver/action/collection.action.ts b/ui/src/app/metadata/resolver/action/collection.action.ts deleted file mode 100644 index 5ad95b7cd..000000000 --- a/ui/src/app/metadata/resolver/action/collection.action.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; -import { Update } from '@ngrx/entity'; - -export enum ResolverCollectionActionTypes { - FIND = '[Metadata Resolver] Find', - SELECT = '[Metadata Resolver] Select', - SELECT_SUCCESS = '[Metadata Resolver] Select Success', - - CLEAR_SELECTION = '[Metadata Resolver] Selection Clear', - - UPDATE_RESOLVER_REQUEST = '[Metadata Resolver] Update Request', - UPDATE_RESOLVER_SUCCESS = '[Metadata Resolver] Update Success', - UPDATE_RESOLVER_FAIL = '[Metadata Resolver] Update Fail', - UPDATE_RESOLVER_CONFLICT = '[Metadata Resolver] Update Conflict', - - LOAD_RESOLVER_REQUEST = '[Metadata Resolver Collection] Load Resolver REQUEST', - LOAD_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Load Resolver SUCCESS', - LOAD_RESOLVER_ERROR = '[Metadata Resolver Collection] Load Resolver ERROR', - LOAD_ADMIN_RESOLVERS_REQUEST = '[Metadata Resolver Collection] Load Admin Resolver REQUEST', - - ADD_RESOLVER = '[Metadata Resolver Collection] Add Resolver', - ADD_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Add Resolver Success', - ADD_RESOLVER_FAIL = '[Metadata Resolver Collection] Add Resolver Fail', - - REMOVE_RESOLVER = '[Metadata Resolver Collection] Remove Resolver', - REMOVE_RESOLVER_SUCCESS = '[Metadata Resolver Collection] Remove Resolver Success', - REMOVE_RESOLVER_FAIL = '[Metadata Resolver Collection] Remove Resolver Fail', - - UPLOAD_RESOLVER_REQUEST = '[Metadata Resolver Collection] Upload Resolver Request', - CREATE_RESOLVER_FROM_URL_REQUEST = '[Metadata Resolver Collection] Create Resolver From URL Request', -} - -export class FindResolver implements Action { - readonly type = ResolverCollectionActionTypes.FIND; - - constructor(public payload: string) { } -} - -export class SelectResolver implements Action { - readonly type = ResolverCollectionActionTypes.SELECT; - - constructor(public payload: string) { } -} - -export class SelectResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.SELECT_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class LoadResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST; - - constructor() { } -} - -export class LoadAdminResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_ADMIN_RESOLVERS_REQUEST; - - constructor() { } -} - -export class LoadResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadResolverError implements Action { - readonly type = ResolverCollectionActionTypes.LOAD_RESOLVER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL; - - constructor(public payload: any) { } -} - -export class UpdateResolverConflict implements Action { - readonly type = ResolverCollectionActionTypes.UPDATE_RESOLVER_CONFLICT; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class AddResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.ADD_RESOLVER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER; - - constructor(public payload: string) { } -} - -export class RemoveResolverSuccess implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveResolverFail implements Action { - readonly type = ResolverCollectionActionTypes.REMOVE_RESOLVER_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class UploadResolverRequest implements Action { - readonly type = ResolverCollectionActionTypes.UPLOAD_RESOLVER_REQUEST; - - constructor(public payload: { name: string, body: string }) { } -} - -export class CreateResolverFromUrlRequest implements Action { - readonly type = ResolverCollectionActionTypes.CREATE_RESOLVER_FROM_URL_REQUEST; - - constructor(public payload: { name: string, url: string }) { } -} - -export class ClearResolverSelection implements Action { - readonly type = ResolverCollectionActionTypes.CLEAR_SELECTION; -} - -export type ResolverCollectionActionsUnion = - | LoadResolverRequest - | LoadResolverSuccess - | LoadResolverError - | LoadAdminResolverRequest - | AddResolverRequest - | AddResolverSuccess - | AddResolverFail - | RemoveResolverRequest - | RemoveResolverSuccess - | RemoveResolverFail - | FindResolver - | SelectResolver - | SelectResolverSuccess - | UpdateResolverRequest - | UpdateResolverSuccess - | UpdateResolverFail - | UpdateResolverConflict - | UploadResolverRequest - | CreateResolverFromUrlRequest - | ClearResolverSelection; diff --git a/ui/src/app/metadata/resolver/action/copy.action.ts b/ui/src/app/metadata/resolver/action/copy.action.ts deleted file mode 100644 index 8d70af76c..000000000 --- a/ui/src/app/metadata/resolver/action/copy.action.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export enum CopySourceActionTypes { - CREATE_RESOLVER_COPY_REQUEST = '[Copy Resolver] Create Resolver Copy Request', - CREATE_RESOLVER_COPY_SUCCESS = '[Copy Resolver] Create Resolver Copy Success', - CREATE_RESOLVER_COPY_ERROR = '[Copy Resolver] Create Resolver Copy Error', - - UPDATE_RESOLVER_COPY = '[Copy Resolver] Update Resolver Copy Request', - - UPDATE_RESOLVER_COPY_SECTIONS = '[Copy Resolver] Update Resolver Sections', - - SAVE_RESOLVER_COPY_REQUEST = '[Copy Resolver] Save Resolver Copy Request', - SAVE_RESOLVER_COPY_SUCCESS = '[Copy Resolver] Save Resolver Copy Request', - SAVE_RESOLVER_COPY_ERROR = '[Copy Resolver] Save Resolver Copy Request', -} - -export class CreateResolverCopyRequest implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST; - - constructor(public payload: { entityId: string, serviceProviderName: string, target: string }) { } -} - -export class CreateResolverCopySuccess implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class CreateResolverCopyError implements Action { - readonly type = CopySourceActionTypes.CREATE_RESOLVER_COPY_ERROR; - - constructor(public payload: Error) { } -} - -export class UpdateResolverCopy implements Action { - readonly type = CopySourceActionTypes.UPDATE_RESOLVER_COPY; - - constructor(public payload: Partial) { } -} - -export class UpdateResolverCopySections implements Action { - readonly type = CopySourceActionTypes.UPDATE_RESOLVER_COPY_SECTIONS; - - constructor(public payload: string[]) { } -} - -export type CopySourceActionUnion = - | CreateResolverCopyRequest - | CreateResolverCopySuccess - | CreateResolverCopyError - | UpdateResolverCopy - | UpdateResolverCopySections; diff --git a/ui/src/app/metadata/resolver/action/draft.action.ts b/ui/src/app/metadata/resolver/action/draft.action.ts deleted file mode 100644 index c64c370df..000000000 --- a/ui/src/app/metadata/resolver/action/draft.action.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Update } from '@ngrx/entity'; -import { MetadataResolver } from '../../domain/model'; - -export enum DraftActionTypes { - FIND = '[Metadata Draft] Find', - SELECT_REQUEST = '[Metadata Draft] Select Request', - SELECT_SUCCESS = '[Metadata Draft] Select Success', - SELECT_ERROR = '[Metadata Draft] Select Error', - UPDATE_DRAFT_REQUEST = '[Metadata Draft] Update Request', - UPDATE_DRAFT_SUCCESS = '[Metadata Draft] Update Success', - UPDATE_DRAFT_FAIL = '[Metadata Draft] Update Fail', - LOAD_DRAFT_REQUEST = '[Metadata Draft Collection] Draft REQUEST', - LOAD_DRAFT_SUCCESS = '[Metadata Draft Collection] Draft SUCCESS', - LOAD_DRAFT_ERROR = '[Metadata Draft Collection] Draft ERROR', - ADD_DRAFT = '[Metadata Draft Collection] Add Draft', - ADD_DRAFT_SUCCESS = '[Metadata Draft Collection] Add Draft Success', - ADD_DRAFT_FAIL = '[Metadata Draft Collection] Add Draft Fail', - REMOVE_DRAFT = '[Metadata Draft Collection] Remove Draft', - REMOVE_DRAFT_SUCCESS = '[Metadata Draft Collection] Remove Draft Success', - REMOVE_DRAFT_FAIL = '[Metadata Draft Collection] Remove Draft Fail' -} - -export class SelectDraftRequest implements Action { - readonly type = DraftActionTypes.SELECT_REQUEST; - - constructor(public payload: string) { } -} - -export class SelectDraftSuccess implements Action { - readonly type = DraftActionTypes.SELECT_SUCCESS; - - constructor(public payload: string) { } -} - -export class SelectDraftError implements Action { - readonly type = DraftActionTypes.SELECT_ERROR; - - constructor() { } -} - -export class UpdateDraftRequest implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateDraftSuccess implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateDraftFail implements Action { - readonly type = DraftActionTypes.UPDATE_DRAFT_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftRequest implements Action { - readonly type = DraftActionTypes.ADD_DRAFT; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftSuccess implements Action { - readonly type = DraftActionTypes.ADD_DRAFT_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class AddDraftFail implements Action { - readonly type = DraftActionTypes.ADD_DRAFT_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveDraftRequest implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT; - - constructor(public payload: MetadataResolver) { } -} - -export class RemoveDraftSuccess implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT_SUCCESS; - - constructor(public payload: string) { } -} - -export class RemoveDraftFail implements Action { - readonly type = DraftActionTypes.REMOVE_DRAFT_FAIL; - - constructor(public payload: MetadataResolver) { } -} - -export class LoadDraftRequest implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_REQUEST; - - constructor() { } -} - -export class LoadDraftSuccess implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_SUCCESS; - - constructor(public payload: MetadataResolver[]) { } -} - -export class LoadDraftError implements Action { - readonly type = DraftActionTypes.LOAD_DRAFT_ERROR; - - constructor(public payload: any) { } -} - -export type DraftActionsUnion = - | LoadDraftRequest - | LoadDraftSuccess - | LoadDraftError - | AddDraftRequest - | AddDraftSuccess - | AddDraftFail - | RemoveDraftRequest - | RemoveDraftSuccess - | RemoveDraftFail - | SelectDraftRequest - | SelectDraftSuccess - | SelectDraftError - | UpdateDraftRequest - | UpdateDraftSuccess - | UpdateDraftFail; diff --git a/ui/src/app/metadata/resolver/action/entity.action.ts b/ui/src/app/metadata/resolver/action/entity.action.ts deleted file mode 100644 index b489ee831..000000000 --- a/ui/src/app/metadata/resolver/action/entity.action.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export enum ResolverEntityActionTypes { - UPDATE_STATUS = '[Resolver Entity] Update Status', - UPDATE_SAVING = '[Resolver Entity] Update Saving', - UPDATE_CHANGES_REQUEST = '[Resolver Entity] Update Changes Request', - UPDATE_CHANGES_SUCCESS = '[Resolver Entity] Update Changes Success', - CLEAR = '[Resolver Entity] Clear', - CANCEL = '[Resolver Entity] Cancel' -} - -export class UpdateStatus implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_STATUS; - - constructor(public payload: { [key: string]: string }) { } -} - -export class UpdateChangesRequest implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_CHANGES_REQUEST; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateChangesSuccess implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS; - - constructor(public payload: MetadataResolver) { } -} - -export class UpdateSaving implements Action { - readonly type = ResolverEntityActionTypes.UPDATE_SAVING; - - constructor(public payload: boolean) { } -} - -export class Clear implements Action { - readonly type = ResolverEntityActionTypes.CLEAR; - - constructor() { } -} - -export class Cancel implements Action { - readonly type = ResolverEntityActionTypes.CANCEL; - - constructor() { } -} - -export type ResolverEntityActionUnion = - | UpdateStatus - | UpdateChangesRequest - | UpdateChangesSuccess - | UpdateSaving - | Clear; diff --git a/ui/src/app/metadata/resolver/action/search.action.ts b/ui/src/app/metadata/resolver/action/search.action.ts deleted file mode 100644 index 7bfdd7d5b..000000000 --- a/ui/src/app/metadata/resolver/action/search.action.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Action } from '@ngrx/store'; - -export enum SearchActionTypes { - SEARCH_IDS = '[Search Resolver Ids] Request', - SEARCH_IDS_SUCCESS = '[Search Resolver Ids] Success', - SEARCH_IDS_ERROR = '[Search Resolver Ids] Error' -} - -export class SearchIds implements Action { - readonly type = SearchActionTypes.SEARCH_IDS; - - constructor(public payload: string) { } -} -export class SearchIdsSuccess implements Action { - readonly type = SearchActionTypes.SEARCH_IDS_SUCCESS; - - constructor(public payload: string[]) { } -} -export class SearchIdsError implements Action { - readonly type = SearchActionTypes.SEARCH_IDS_ERROR; - - constructor(public payload: any) { } -} - -export type SearchActionUnion = - | SearchIds - | SearchIdsSuccess - | SearchIdsError; diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.html b/ui/src/app/metadata/resolver/component/finish-form.component.html deleted file mode 100644 index 9ad91bab5..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
-
-
-
-
- - -
- -
-
-
-
-
diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.scss b/ui/src/app/metadata/resolver/component/finish-form.component.scss deleted file mode 100644 index 0f9488141..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../../../theme/_palette'; - -.value:empty { - &::after { - content: "\2014"; - color: #868e96; - text-align: center; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts b/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts deleted file mode 100644 index 0fefc8788..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ActivatedRoute, Router } from '@angular/router'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { ProviderValueEmitter, ProviderStatusEmitter } from '../../domain/service/provider-change-emitter.service'; -import { ListValuesService } from '../../domain/service/list-values.service'; -import { FinishFormComponent } from './finish-form.component'; -import { RouterStub, RouterLinkStubDirective } from '../../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import * as stubs from '../../../../testing/resolver.stub'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { MockListValueService } from '../../../../testing/list-values.stub'; -import { MockSharedModule } from '../../../../testing/shared.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - resolver = new FileBackedHttpMetadataResolver({ - ...stubs.resolver - }); - - @ViewChild(FinishFormComponent, {static: true}) - public formUnderTest: FinishFormComponent; - - changeProvider(opts: any): void { - this.resolver = Object.assign({}, this.resolver, opts); - } -} - -describe('Finished Form Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let form: FinishFormComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderValueEmitter, - ProviderStatusEmitter, - NgbPopoverConfig, - { provide: ListValuesService, useClass: MockListValueService }, - { provide: Router, useClass: RouterStub }, - { provide: ActivatedRoute, useClass: ActivatedRouteStub } - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - MockSharedModule, - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - FinishFormComponent, - RouterLinkStubDirective, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - form = instance.formUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('ngOnChanges lifecycle event', () => { - it('should reset the form', () => { - spyOn(form.form, 'reset').and.callThrough(); - instance.changeProvider({ - serviceEnabled: true - }); - fixture.detectChanges(); - expect(form.form.reset).toHaveBeenCalled(); - }); - - it('should reset the form with serviceEnabled = false if no resolver', () => { - spyOn(form.form, 'reset').and.callThrough(); - delete instance.resolver; - fixture.detectChanges(); - expect(form.form.reset).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/component/finish-form.component.ts b/ui/src/app/metadata/resolver/component/finish-form.component.ts deleted file mode 100644 index e7e84641a..000000000 --- a/ui/src/app/metadata/resolver/component/finish-form.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Observable } from 'rxjs'; -import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { MetadataResolver } from '../../domain/model'; -import { ListValuesService } from '../../domain/service/list-values.service'; - -@Component({ - selector: 'finish-form', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './finish-form.component.html', - styleUrls: ['./finish-form.component.scss'] -}) -export class FinishFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() resolver: MetadataResolver; - - form: FormGroup; - attributesToRelease$: Observable; - - constructor( - protected fb: FormBuilder, - protected statusEmitter: ProviderStatusEmitter, - protected valueEmitter: ProviderValueEmitter, - private listValues: ListValuesService - ) { - super(fb, statusEmitter, valueEmitter); - this.attributesToRelease$ = this.listValues.attributesToRelease; - } - - createForm(): void { - this.form = this.fb.group({ - serviceEnabled: [true] - }); - } - - ngOnChanges(): void { - this.form.reset({ - serviceEnabled: !this.resolver ? false : this.resolver.serviceEnabled !== false ? true : false - }); - } -} diff --git a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts b/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts deleted file mode 100644 index bf81f8c8a..000000000 --- a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; -import { ProviderValueEmitter, ProviderStatusEmitter } from '../../domain/service/provider-change-emitter.service'; - - -describe('Resolver Form Fragment Component', () => { - let fixture: ComponentFixture; - let instance: ProviderFormFragmentComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderValueEmitter, - ProviderStatusEmitter - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule - ], - declarations: [ - ProviderFormFragmentComponent - ], - }); - - fixture = TestBed.createComponent(ProviderFormFragmentComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts b/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts deleted file mode 100644 index c376a7043..000000000 --- a/ui/src/app/metadata/resolver/component/provider-form-fragment.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, Input, OnInit, OnDestroy, ChangeDetectionStrategy, ElementRef, ViewChildren } from '@angular/core'; -import { FormBuilder, FormGroup, FormControlName } from '@angular/forms'; - -import { Observable, Subject, Subscription } from 'rxjs'; -import { takeUntil, startWith } from 'rxjs/operators'; - -import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { MetadataResolver } from '../../domain/model'; - -import * as constants from '../../../shared/constant'; -import { removeNulls } from '../../../shared/util'; - -@Component({ - selector: 'provider-form-fragment', - changeDetection: ChangeDetectionStrategy.OnPush, - template: `Foo` -}) -export class ProviderFormFragmentComponent implements OnInit, OnDestroy { - @Input() resolver: MetadataResolver; - @ViewChildren(FormControlName, { read: ElementRef }) formInputElements: ElementRef[]; - - protected ngUnsubscribe: Subject = new Subject(); - protected valueEmitSubscription: Subscription; - protected statusEmitSubscription: Subscription; - - form: FormGroup; - provider$: Observable; - - defaultMaxLength = constants.DEFAULT_FIELD_MAX_LENGTH; - - constructor( - protected fb: FormBuilder, - protected statusEmitter: ProviderStatusEmitter, - protected valueEmitter: ProviderValueEmitter - ) { - this.createForm(); - } - - createForm(): void { - this.form = this.fb.group({}); - } - - ngOnInit(): void { - this.valueEmitSubscription = this.form.valueChanges.pipe( - takeUntil(this.ngUnsubscribe), - startWith(this.form.value) - ).subscribe(changes => this.valueEmitter.emit(removeNulls(changes, true))); - - this.statusEmitSubscription = this.form.statusChanges.pipe( - takeUntil(this.ngUnsubscribe), - startWith(this.form.status) - ).subscribe(status => this.statusEmitter.emit(status)); - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.html b/ui/src/app/metadata/resolver/container/confirm-copy.component.html deleted file mode 100644 index 1e2096661..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.html +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
-
-
- Add a new metadata source - Finish Summary -
-
-
-
- - - - -
-
-
diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.scss b/ui/src/app/metadata/resolver/container/confirm-copy.component.scss deleted file mode 100644 index 9b93e80de..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - .nav.nav-wizard .nav-item .nav-link.btn.save { - min-width: 180px; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/resolver/container/confirm-copy.component.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.ts deleted file mode 100644 index b4c0bef20..000000000 --- a/ui/src/app/metadata/resolver/container/confirm-copy.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Component, Inject, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { Observable } from 'rxjs'; - -import { - State, - getResolverConfiguration, - getCopy, - getSaving -} from '../reducer'; -import { MetadataResolver } from '../../domain/model'; -import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { UpdateResolverCopy } from '../action/copy.action'; -import { take, skipWhile } from 'rxjs/operators'; -import { AddResolverRequest } from '../action/collection.action'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { Wizard } from '../../../wizard/model'; -import { LoadSchemaRequest } from '../../configuration/action/configuration.action'; -import { getCurrentWizardSchema } from '../../../wizard/reducer'; - -@Component({ - selector: 'confirm-copy-page', - templateUrl: './confirm-copy.component.html', - styleUrls: ['./confirm-copy.component.scss'] -}) -export class ConfirmCopyComponent implements OnDestroy { - - copy$: Observable; - values$: Observable; - saving$: Observable; - summary$: Observable = this.store.select(getResolverConfiguration); - - resolver: MetadataResolver; - - constructor( - private store: Store, - private valueEmitter: ProviderValueEmitter, - @Inject(METADATA_SOURCE_WIZARD) private sourceWizard: Wizard - ) { - this.copy$ = this.store.select(getCopy); - this.saving$ = this.store.select(getSaving); - - this.values$ = this.copy$.pipe(take(1)); - this.valueEmitter.changeEmitted$.subscribe(changes => this.store.dispatch(new UpdateResolverCopy(changes))); - - this.copy$.subscribe(p => this.resolver = p); - - this.store - .select(getCurrentWizardSchema) - .pipe( - skipWhile(s => !s) - ) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - - this.store.dispatch(new SetDefinition(this.sourceWizard)); - } - - onSave(resolver: MetadataResolver): void { - this.store.dispatch(new AddResolverRequest(resolver)); - } - - ngOnDestroy(): void { - this.store.dispatch(new ClearWizard()); - } -} diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.html b/ui/src/app/metadata/resolver/container/copy-resolver.component.html deleted file mode 100644 index 1f3bbe317..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.html +++ /dev/null @@ -1,146 +0,0 @@ -
-
-
- -
-
- - - - - Entity ID to copy is Required - -
-
- - - - Service Resolver Name is required - -
-
- - - - - Entity ID is required - - - Entity ID must be unique - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - -
Sections to Copy?Yes
-
-
- - -
-
-
Check All Attributes - -
Clear All Attributes - -
-
-
diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts deleted file mode 100644 index ea6053cce..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { ViewChild, Component } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromResolver from '../reducer'; -import { CopyResolverComponent } from './copy-resolver.component'; -import { SharedModule } from '../../../shared/shared.module'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(CopyResolverComponent, {static: true}) - public formUnderTest: CopyResolverComponent; - - onSave(event: any): void {} -} - -describe('Copy Resolver Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: CopyResolverComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - resolver: combineReducers(fromResolver.reducers) - }), - ReactiveFormsModule, - SharedModule, - MockI18nModule - ], - declarations: [ - CopyResolverComponent, - TestHostComponent - ], - providers: [ - NavigatorService - ] - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance.formUnderTest; - store = TestBed.get(Store); - fixture.detectChanges(); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('next method', () => { - it('should dispatch an action to create a copy', () => { - instance.next(); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('onChange method', () => { - it('should dispatch an action to update the selected sections to copy', () => { - instance.onChange('relyingPartyOverrides'); - expect(store.dispatch).toHaveBeenCalled(); - instance.onChange('relyingPartyOverrides'); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/copy-resolver.component.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.ts deleted file mode 100644 index c07f88c35..000000000 --- a/ui/src/app/metadata/resolver/container/copy-resolver.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - Component, - OnInit, - Output, - EventEmitter -} from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormControlName, Validators, AbstractControl } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { take } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; -import { EntityValidators } from '../../domain/service/entity-validators.service'; -import { SearchIds } from '../action/search.action'; -import * as fromProvider from '../reducer'; -import { CreateResolverCopyRequest, UpdateResolverCopySections } from '../action/copy.action'; - -@Component({ - selector: 'copy-resolver-form', - templateUrl: './copy-resolver.component.html' -}) -export class CopyResolverComponent implements OnInit { - @Output() save: EventEmitter = new EventEmitter(); - - providerForm: FormGroup; - ids$: Observable; - searchResults$: Observable; - selected$: Observable; - selected: string[]; - - sections = [ - { i18nKey: 'organizationInfo', property: 'organization' }, - { i18nKey: 'contacts', property: 'contacts' }, - { i18nKey: 'uiMduiInfo', property: 'mdui' }, - { i18nKey: 'spSsoDescriptorInfo', property: 'serviceProviderSsoDescriptor' }, - { i18nKey: 'logoutEndpoints', property: 'logoutEndpoints' }, - { i18nKey: 'securityDescriptorInfo', property: 'securityInfo' }, - { i18nKey: 'assertionConsumerServices', property: 'assertionConsumerServices' }, - { i18nKey: 'relyingPartyOverrides', property: 'relyingPartyOverrides' }, - { i18nKey: 'attributeRelease', property: 'attributeRelease' } - ]; - - sections$ = of(this.sections); - - constructor( - private store: Store, - private fb: FormBuilder - ) { - this.ids$ = this.store.select(fromResolver.getAllEntityIds); - this.searchResults$ = this.store.select(fromProvider.getSearchResults); - this.selected$ = this.store.select(fromProvider.getSectionsToCopy); - - this.selected$.subscribe(selected => this.selected = selected); - } - - ngOnInit(): void { - this.providerForm = this.fb.group({ - serviceProviderName: ['', [Validators.required]], - entityId: ['', Validators.required, EntityValidators.createUniqueIdValidator(this.ids$)], - target: ['', [Validators.required], [EntityValidators.existsInCollection(this.ids$)]], - }); - - this.store.select(fromProvider.getAttributes) - .pipe(take(1)) - .subscribe(attrs => this.providerForm.setValue({ ...attrs })); - - this.providerForm - .get('target') - .valueChanges - .subscribe(val => { - this.store.dispatch(new SearchIds(val)); - }); - } - - next(): void { - this.store.dispatch(new CreateResolverCopyRequest({ - ...this.providerForm.value - })); - } - - onChange(attr: string): void { - this.store.dispatch( - new UpdateResolverCopySections( - this.selected.indexOf(attr) > -1 ? this.selected.filter(a => a !== attr) : [...this.selected, attr] - ) - ); - } - - onCheckAll(): void { - this.store.dispatch(new UpdateResolverCopySections(this.sections.map(section => section.property))); - } - onCheckNone(event: Event | null = null): void { - this.store.dispatch(new UpdateResolverCopySections([])); - } -} diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.html b/ui/src/app/metadata/resolver/container/new-resolver.component.html deleted file mode 100644 index 86452a4e4..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
-
-
- Add a new metadata source -
-
-
-
- -

How are you adding the metadata information?

-
-
-
-
-
- -
-
-  or  -
-
- -
-
-  or  -
-
- -
-
-
-
-
-
- -
-
-
diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.scss b/ui/src/app/metadata/resolver/container/new-resolver.component.scss deleted file mode 100644 index df34e5c36..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .resolver-nav-option { - min-width: 160px; - height: 100%; - } -} \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts deleted file mode 100644 index 9ebe511e1..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterModule, ActivatedRoute } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; - -import { StoreModule, Store } from '@ngrx/store'; -import { NewResolverComponent } from './new-resolver.component'; - -import { UploadResolverComponent } from './upload-resolver.component'; -import { CopyResolverComponent } from './copy-resolver.component'; -import { SharedModule } from '../../../shared/shared.module'; -import { NavigatorService } from '../../../core/service/navigator.service'; -import * as fromResolver from '../reducer'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { of } from 'rxjs'; - -describe('New Resolver Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: NewResolverComponent; - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { id: 'foo', events: of({}) }; - activatedRoute.data = of('foo'); - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - StoreModule.forRoot(fromResolver.reducers), - ReactiveFormsModule, - SharedModule, - RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), - MockI18nModule - ], - declarations: [ - NewResolverComponent, - UploadResolverComponent, - CopyResolverComponent - ], - providers: [ - NavigatorService, - { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: APP_BASE_HREF, useValue: '/' } - ] - }); - - fixture = TestBed.createComponent(NewResolverComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/new-resolver.component.ts b/ui/src/app/metadata/resolver/container/new-resolver.component.ts deleted file mode 100644 index f58392e21..000000000 --- a/ui/src/app/metadata/resolver/container/new-resolver.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Observable, Subscription, Subject } from 'rxjs'; -import { map, startWith, distinctUntilChanged, debounceTime, withLatestFrom, takeUntil } from 'rxjs/operators'; -import { SelectDraftRequest } from '../action/draft.action'; -import { Store } from '@ngrx/store'; -import * as fromCollection from '../reducer'; - -@Component({ - selector: 'new-resolver-page', - templateUrl: './new-resolver.component.html', - styleUrls: ['./new-resolver.component.scss'] -}) -export class NewResolverComponent implements OnDestroy { - - private ngUnsubscribe: Subject = new Subject(); - - actionsSubscription: Subscription; - - canSetNewType$: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private store: Store - ) { - this.canSetNewType$ = this.router.events.pipe( - startWith(this.route), - debounceTime(10), - map(url => { - let child = this.route.snapshot.firstChild; - return !child.routeConfig.path.match('blank') || child.params.index === 'common'; - }) - ); - - this.actionsSubscription = this.route.queryParams.pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - map(data => new SelectDraftRequest(data.id)) - ).subscribe(this.store); - } - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html deleted file mode 100644 index a9a3be2e4..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts deleted file mode 100644 index b00263ea8..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import * as fromResolver from '../reducer'; -import { UpdateStatus } from '../action/entity.action'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { MetadataResolver } from '../../domain/model'; -import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators'; -import { UpdateChangesRequest } from '../action/entity.action'; -import { FormControl } from '@angular/forms'; - -@Component({ - selector: 'resolver-edit-step', - templateUrl: './resolver-edit-step.component.html', - styleUrls: [] -}) -export class ResolverEditStepComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - currentPage: string; - - namesList: string[] = []; - - schema$: Observable; - resolver$: Observable; - model$: Observable; - definition$: Observable>; - changes$: Observable; - step$: Observable; - bindings$: Observable; - - validators$: Observable<{ [key: string]: any }>; - - lock: FormControl = new FormControl(true); - - constructor( - private store: Store - ) { - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.resolver$ = this.store.select(fromResolver.getSelectedResolver); - this.step$ = this.store.select(fromWizard.getCurrent); - this.schema$ = this.store.select(fromWizard.getSchema); - this.bindings$ = this.definition$.pipe(filter(d => !!d), map(d => d.bindings)); - - this.step$.subscribe(s => { - if (s && s.locked) { - this.store.dispatch(new LockEditor()); - } else { - this.store.dispatch(new UnlockEditor()); - } - }); - - this.lock.valueChanges.subscribe(locked => this.store.dispatch(locked ? new LockEditor() : new UnlockEditor())); - - this.validators$ = this.definition$.pipe( - withLatestFrom( - this.store.select(fromResolver.getAllEntityIds), - this.resolver$ - ), - filter(([def, ids, resolver]) => !!def), - map(([def, ids, resolver]) => def.getValidators( - ids.filter(id => id !== resolver.entityId) - )) - ); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromResolver.getSelectedResolver), - this.store.select(fromWizard.getModel), - this.changes$, - this.definition$ - ), - map(([schema, resolver, model, changes, definition]) => { - return ({ - model: { - ...model, - ...resolver, - ...changes - }, - definition - }); - }), - filter(({ model, definition }) => definition && model), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.valueChangeEmitted$.pipe( - takeUntil(this.ngUnsubscribe), - map(changes => changes.value), - withLatestFrom( - this.definition$, - this.store.select(fromResolver.getSelectedResolver), - this.changes$, - this.schema$ - ), - filter(([valueChange, definition, resolver]) => definition && resolver), - map(([ - valueChange, - definition, - resolver, - changes, - schema - ]) => { - const parsed = definition.parser({ ...valueChange }, schema); - return { ...resolver, ...changes, ...parsed }; - }) - ) - .subscribe(changes => { - this.store.dispatch(new UpdateChangesRequest(changes)); - }); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - this.statusChangeSubject.complete(); - this.ngUnsubscribe.unsubscribe(); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-edit.component.html b/ui/src/app/metadata/resolver/container/resolver-edit.component.html deleted file mode 100644 index 85084e0f8..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-
- - - Edit Metadata Source - {{ (resolver$ | async).serviceProviderName }} - -
-
-
-
-
-
- - -
-
- -   - -
-
-
- - All forms must be valid before changes can be saved! -
-
-
-
-
-
- - -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit.component.ts deleted file mode 100644 index c5cc6b324..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Observable, of, Subject } from 'rxjs'; -import { map, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import * as fromWizard from '../../../wizard/reducer'; -import * as fromResolver from '../reducer'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { MetadataResolver } from '../../domain/model'; -import { Clear } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { UpdateResolverRequest } from '../action/collection.action'; -import { NgbModal } from '../../../../../node_modules/@ng-bootstrap/ng-bootstrap'; -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; - -@Component({ - selector: 'resolver-edit', - templateUrl: './resolver-edit.component.html', - styleUrls: [] -}) - -export class ResolverEditComponent implements OnDestroy, CanComponentDeactivate { - private ngUnsubscribe: Subject = new Subject(); - resolver$: Observable; - definition$: Observable>; - index$: Observable; - - valid$: Observable; - isInvalid$: Observable; - status$: Observable; - isSaving$: Observable; - - latest: MetadataResolver; - resolver: MetadataResolver; - - formats = NAV_FORMATS; - - constructor( - private store: Store, - private router: Router, - private modalService: NgbModal, - private diffService: DifferentialService - ) { - this.resolver$ = this.store.select(fromResolver.getSelectedResolver).pipe(filter(d => !!d)); - this.definition$ = this.store.select(fromWizard.getWizardDefinition).pipe(filter(d => !!d)); - this.index$ = this.store.select(fromWizard.getWizardIndex).pipe(filter(i => !!i)); - this.valid$ = this.store.select(fromResolver.getEntityIsValid); - this.isInvalid$ = this.valid$.pipe(map(v => !v)); - this.status$ = this.store.select(fromResolver.getInvalidEntityForms); - this.isSaving$ = this.store.select(fromResolver.getEntityIsSaving); - - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe(filter(s => !!s)) - .subscribe(s => this.store.dispatch(new LoadSchemaRequest(s))); - - this.resolver$.subscribe(p => this.resolver = p); - this.store.select(fromResolver.getEntityChanges).subscribe(changes => this.latest = changes); - } - - ngOnDestroy() { - this.clear(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - clear(): void { - this.store.dispatch(new Clear()); - } - - save(): void { - this.store.dispatch(new UpdateResolverRequest(this.latest)); - } - - cancel(): void { - this.clear(); - this.router.navigate(['metadata', 'resolver', this.resolver.id, 'configuration']); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - if (nextState.url.match('edit')) { - return of(true); - } - const diff = this.diffService.updatedDiff(this.resolver, this.latest); - if (diff && Object.keys(diff).length > 0) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.result.then( - () => { - this.clear(); - this.router.navigate([nextState.url]); - }, - () => console.warn('denied') - ); - return this.store.select(fromResolver.getEntityIsSaved); - } - return of(true); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-select.component.html b/ui/src/app/metadata/resolver/container/resolver-select.component.html deleted file mode 100644 index 7ae9706dc..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-select.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-select.component.ts b/ui/src/app/metadata/resolver/container/resolver-select.component.ts deleted file mode 100644 index 041e0e8d2..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-select.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, OnDestroy, Inject } from '@angular/core'; -import { Subscription, Observable, Subject } from 'rxjs'; -import { Store } from '@ngrx/store'; - -import { ActivatedRoute } from '@angular/router'; -import { map, distinctUntilChanged, skipWhile, takeUntil } from 'rxjs/operators'; -import { SelectResolver } from '../action/collection.action'; -import * as fromResolvers from '../reducer'; -import { MetadataResolver } from '../../domain/model'; -import { SetDefinition, ClearWizard } from '../../../wizard/action/wizard.action'; -import { Clear } from '../action/entity.action'; -import { METADATA_SOURCE_EDITOR } from '../wizard-definition'; -import { Wizard } from '../../../wizard/model'; - -@Component({ - selector: 'resolver-select', - templateUrl: './resolver-select.component.html', - styleUrls: [] -}) - -export class ResolverSelectComponent implements OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - actionsSubscription: Subscription; - - resolver$: Observable; - - constructor( - private store: Store, - private route: ActivatedRoute, - @Inject(METADATA_SOURCE_EDITOR) private sourceWizard: Wizard - ) { - this.route.params.pipe( - takeUntil(this.ngUnsubscribe), - map(params => new SelectResolver(params.id)) - ).subscribe(store); - - this.resolver$ = this.store.select(fromResolvers.getSelectedResolver).pipe(skipWhile(p => !p)); - - this.resolver$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(resolver => this.setDefinition(resolver)); - } - - setDefinition(resolver: MetadataResolver): void { - if (resolver) { - this.store.dispatch(new SetDefinition(this.sourceWizard)); - } - } - - ngOnDestroy() { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new Clear()); - this.store.dispatch(new ClearWizard()); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html deleted file mode 100644 index 926f3024c..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts deleted file mode 100644 index dc481b30d..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { ResolverWizardStepComponent } from './resolver-wizard-step.component'; -import * as fromRoot from '../reducer'; -import { SchemaFormModule, WidgetRegistry, DefaultWidgetRegistry } from 'ngx-schema-form'; -import * as fromWizard from '../../../wizard/reducer'; -import { initialState } from '../reducer/entity.reducer'; -import { MetadataSourceWizard } from '../../domain/model/wizards/metadata-source-wizard'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ResolverWizardStepComponent, {static: true}) - public componentUnderTest: ResolverWizardStepComponent; -} - -describe('Resolver Wizard Step Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ResolverWizardStepComponent; - let store: Store; - - let schema = { - type: 'object', - properties: { - id: { - type: 'string' - }, - serviceProviderName: { - type: 'string' - }, - entityId: { - type: 'string' - } - } - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - SchemaFormModule.forRoot(), - StoreModule.forRoot({ - resolver: combineReducers(fromRoot.reducers, { - entity: { - ...initialState, - changes: { - id: 'foo', - serviceProviderName: 'bar', - createdBy: 'admin' - } - } - }), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'common', - disabled: false, - definition: new MetadataSourceWizard(), - schemaPath: '/foo/bar', - loading: false, - schema: { - ...schema - }, - locked: false - } - }) - }) - ], - declarations: [ - ResolverWizardStepComponent, - TestHostComponent - ], - providers: [ - { provide: WidgetRegistry, useClass: DefaultWidgetRegistry } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('updateStatus method', () => { - it('should dispatch an UpdateStatus action', () => { - app.updateStatus({ value: { name: 'notfound' } }); - expect(store.dispatch).toHaveBeenCalled(); - }); - - it('should NOT dispatch a SetDefinition action if the type hasn\'t changed', () => { - app.updateStatus({ value: null }); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts deleted file mode 100644 index f33f0f958..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Observable, Subject, combineLatest } from 'rxjs'; -import { withLatestFrom, map, distinctUntilChanged, skipWhile, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromResolver from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { UpdateStatus, UpdateChangesRequest } from '../action/entity.action'; -import { Wizard } from '../../../wizard/model'; -import { MetadataResolver } from '../../domain/model'; - -@Component({ - selector: 'resolver-wizard-step', - templateUrl: './resolver-wizard-step.component.html', - styleUrls: [] -}) - -export class ResolverWizardStepComponent implements OnDestroy { - valueChangeSubject = new Subject>(); - private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); - - statusChangeSubject = new Subject>(); - private statusChangeEmitted$ = this.statusChangeSubject.asObservable(); - - schema$: Observable; - schema: any; - definition$: Observable>; - changes$: Observable; - currentPage: string; - valid$: Observable; - model$: Observable; - - namesList: string[] = []; - - validators$: Observable<{ [key: string]: any }>; - - bindings$: Observable; - - constructor( - private store: Store, - ) { - this.schema$ = this.store.select(fromWizard.getSchema); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.bindings$ = this.definition$.pipe(map(d => d.bindings)); - - this.model$ = this.schema$.pipe( - withLatestFrom( - this.store.select(fromWizard.getModel), - this.store.select(fromResolver.getSelectedDraft), - this.changes$, - this.definition$ - ), - map(([schema, model, selected, changes, definition]) => ({ - model: { - ...model, - ...selected, - ...changes - }, - definition - })), - filter(({ model, definition }) => (definition && model)), - map(({ model, definition }) => definition.formatter(model)) - ); - - this.validators$ = combineLatest( - this.definition$, - this.store.select(fromResolver.getValidEntityIds), - this.model$ - ).pipe( - map(([def, ids, resolver]) => { - return def.getValidators( - ids - ); - }) - ); - - this.valueChangeEmitted$.pipe( - withLatestFrom( - this.definition$, - this.schema$, - this.store.select(fromResolver.getSelectedDraft) - ), - filter(([ changes, definition ]) => (!!definition && !!changes)), - map(([ changes, definition, schema, original ]) => { - const parsed = definition.parser(changes.value, schema); - return { ...original, ...parsed }; - }) - ) - .subscribe(changes => { - this.store.dispatch(new UpdateChangesRequest(changes)); - }); - - this.statusChangeEmitted$ - .pipe(distinctUntilChanged()) - .subscribe(errors => { - this.updateStatus(errors); - }); - - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - } - - updateStatus(errors: any): void { - const status = { [this.currentPage]: !(errors.value) ? 'VALID' : 'INVALID' }; - this.store.dispatch(new UpdateStatus(status)); - } - - ngOnDestroy() { - this.valueChangeSubject.complete(); - } -} - diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.html b/ui/src/app/metadata/resolver/container/resolver-wizard.component.html deleted file mode 100644 index 425a84920..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.html +++ /dev/null @@ -1,13 +0,0 @@ - -
-
-
- -
-
-
- -
diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.scss b/ui/src/app/metadata/resolver/container/resolver-wizard.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts deleted file mode 100644 index b762c0f29..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { RouterStateSnapshot } from '@angular/router'; -import { NgbDropdownModule, NgbPopoverModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { of } from 'rxjs'; - -import { ResolverWizardComponent } from './resolver-wizard.component'; -import * as fromRoot from '../reducer'; -import * as fromWizard from '../../../wizard/reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { MetadataSourceWizard } from '../../domain/model/wizards/metadata-source-wizard'; -import { initialState } from '../reducer/entity.reducer'; -import { MockWizardModule } from '../../../../testing/wizard.stub'; - -import { NgbModalStub } from '../../../../testing/modal.stub'; -import { MetadataResolver } from '../../domain/model'; -import { DifferentialService } from '../../../core/service/differential.service'; -import { MetadataConfigurationComponentStub } from '../../../../testing/metadata-configuration.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ResolverWizardComponent, {static: true}) - public componentUnderTest: ResolverWizardComponent; -} - -describe('Resolver Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ResolverWizardComponent; - let store: Store; - let modal: NgbModal; - - let schema = { - type: 'object', - properties: { - id: { - type: 'string' - }, - serviceProviderName: { - type: 'string' - } - } - }; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MockWizardModule, - NgbDropdownModule, - NgbPopoverModule, - RouterTestingModule, - StoreModule.forRoot({ - resolver: combineReducers(fromRoot.reducers, { - entity: { - ...initialState, - changes: { - id: 'foo', - serviceProviderName: 'bar', - createdBy: 'admin' - } - } - }), - wizard: combineReducers(fromWizard.reducers, { - wizard: { - index: 'page', - disabled: false, - definition: new MetadataSourceWizard(), - schemaPath: '/foo/bar', - loading: false, - schema: { - ...schema - }, - locked: false - } - }) - }), - MockI18nModule - ], - declarations: [ - ResolverWizardComponent, - TestHostComponent, - MetadataConfigurationComponentStub - ], - providers: [ - DifferentialService, - { provide: NgbModal, useClass: NgbModalStub }, - { provide: METADATA_SOURCE_WIZARD, useValue: MetadataSourceWizard } - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - - modal = TestBed.get(NgbModal); - })); - - it('should instantiate the component', waitForAsync(() => { - expect(app).toBeTruthy(); - })); - - describe('canDeactivate method', () => { - it('should return true if moving to another page', waitForAsync(() => { - app.canDeactivate( - null, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, - { - url: 'blank', - root: { - queryParams: { id: 'foo' } - } - } as RouterStateSnapshot - ).subscribe((can) => { - expect(can).toBe(true); - }); - })); - - /*it('should open a modal', () => { - app.changes = {id: 'bar', serviceProviderName: 'foo', createdBy: 'admin'}; - spyOn(modal, 'open').and.callThrough(); - app.canDeactivate(null, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, - { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot); - expect(modal.open).toHaveBeenCalled(); - });*/ - - it('should check if the entity is saved', waitForAsync(() => { - app.changes = {} as MetadataResolver; - spyOn(store, 'select').and.returnValue(of(true)); - spyOn(modal, 'open').and.callThrough(); - app.canDeactivate(null, { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot, { - url: 'foo', - root: { - queryParams: { - id: 'foo' - } - } - } as RouterStateSnapshot).subscribe((can) => { - expect(can).toBe(true); - expect(modal.open).not.toHaveBeenCalled(); - }); - })); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts deleted file mode 100644 index b56391b27..000000000 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - Component, - OnDestroy, - Inject -} from '@angular/core'; -import { - ActivatedRoute, - Router, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Observable, Subject, of } from 'rxjs'; -import { skipWhile, startWith, distinctUntilChanged, map, takeUntil, combineLatest, withLatestFrom } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataResolver } from '../../domain/model/metadata-resolver'; -import * as fromCollections from '../reducer'; -import { AddResolverRequest } from '../action/collection.action'; -import * as fromResolver from '../reducer'; - -import { CanComponentDeactivate } from '../../../core/service/can-deactivate.guard'; -import { METADATA_SOURCE_WIZARD } from '../wizard-definition'; -import { Wizard, WizardStep } from '../../../wizard/model'; -import { SetDefinition, SetIndex, SetDisabled, ClearWizard } from '../../../wizard/action/wizard.action'; - -import * as fromWizard from '../../../wizard/reducer'; -import { LoadSchemaRequest } from '../../../wizard/action/wizard.action'; -import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog'; -import { Clear } from '../action/entity.action'; -import { MetadataConfiguration } from '../../configuration/model/metadata-configuration'; - -@Component({ - selector: 'resolver-wizard-page', - templateUrl: './resolver-wizard.component.html', - styleUrls: ['./resolver-wizard.component.scss'] -}) -export class ResolverWizardComponent implements OnDestroy, CanComponentDeactivate { - - private ngUnsubscribe: Subject = new Subject(); - - nextStep: WizardStep; - previousStep: WizardStep; - currentPage: string; - - resolver$: Observable; - resolver: MetadataResolver; - providerName$: Observable; - changes$: Observable; - changes: MetadataResolver; - latest: MetadataResolver; - - wizardIndex$: Observable; - wizardIndex: number; - currentPage$: Observable; - wizard$: Observable; - saved$: Observable; - saving: boolean; - - valid$: Observable; - schema$: Observable; - - summary$: Observable = this.store.select(fromCollections.getResolverConfiguration); - - constructor( - private store: Store, - private route: ActivatedRoute, - private router: Router, - private modalService: NgbModal, - @Inject(METADATA_SOURCE_WIZARD) private sourceWizard: Wizard - ) { - this.store - .select(fromWizard.getCurrentWizardSchema) - .pipe( - skipWhile(s => !s) - ) - .subscribe(s => { - if (s) { - this.store.dispatch(new LoadSchemaRequest(s)); - } - }); - this.valid$ = this.store.select(fromResolver.getEntityIsValid); - - this.valid$ - .pipe(startWith(false)) - .subscribe((valid) => { - this.store.dispatch(new SetDisabled(!valid)); - }); - - this.store.dispatch(new SetDefinition(this.sourceWizard)); - - this.store.select(fromWizard.getNext).subscribe(n => this.nextStep = n); - this.store.select(fromWizard.getPrevious).subscribe(p => this.previousStep = p); - this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - - this.changes$ = this.store.select(fromResolver.getEntityChanges); - this.schema$ = this.store.select(fromWizard.getSchema); - - this.resolver$ = this.store.select(fromCollections.getSelectedDraft); - - this.changes$.pipe( - takeUntil(this.ngUnsubscribe), - skipWhile(() => this.saving), - combineLatest(this.resolver$, (changes, base) => ({ ...base, ...changes })) - ).subscribe(latest => this.latest = latest); - - this.changes$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(c => this.changes = c); - this.resolver$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(r => this.resolver = r); - } - - next(): void { - this.go(this.nextStep.id); - } - - previous(): void { - this.go(this.previousStep.id); - } - - save(): void { - this.store.dispatch(new SetDisabled(true)); - this.store.dispatch(new AddResolverRequest(this.latest)); - } - - go(index: string): void { - this.router.navigate( - [ - '../', - index - ], - { - relativeTo: this.route, - queryParamsHandling: 'preserve' - } - ); - } - - gotoPage(page: string): void { - this.store.dispatch(new SetIndex(page)); - } - - get blacklist(): string[] { - return ['id', 'resourceId', 'entityId', 'serviceProviderName']; - } - - hasChanges(changes: MetadataResolver): boolean { - return Object.keys(changes).filter(key => !(this.blacklist.indexOf(key) > -1)).length > 0; - } - - isNew(changes: MetadataResolver): boolean { - return Object.keys(changes).filter(key => !(this.blacklist.indexOf(key) > -1)).length === 0; - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - this.store.dispatch(new ClearWizard()); - } - - canDeactivate( - currentRoute: ActivatedRouteSnapshot, - currentState: RouterStateSnapshot, - nextState: RouterStateSnapshot - ): Observable { - const changingIds = currentState.root.queryParams.id !== nextState.root.queryParams.id; - if (nextState.url.match('blank') && !!nextState.root.queryParams.id && !changingIds) { - return of(true); - } - if (this.hasChanges(this.changes)) { - let modal = this.modalService.open(UnsavedEntityComponent); - modal.componentInstance.message = 'resolver'; - modal.result.then( - () => { - this.store.dispatch(new Clear()); - this.router.navigateByUrl(nextState.url); - }, - () => console.warn('denied') - ); - } - if (this.isNew(this.latest)) { - return of(true); - } - return this.store.select(fromResolver.getEntityIsSaved); - } -} diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.html b/ui/src/app/metadata/resolver/container/upload-resolver.component.html deleted file mode 100644 index 376bcd0f6..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.html +++ /dev/null @@ -1,67 +0,0 @@ -
-
-
- -
-
- - - - - - Service Resolver Name is required - - - -
-
- -
- - -
-
-
- — - OR - — -
-
- - -
- -
-
-
-
diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts b/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts deleted file mode 100644 index 9b7659870..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import { UploadResolverComponent } from './upload-resolver.component'; -import { FileService } from '../../../core/service/file.service'; -import { FileServiceStub } from '../../../../testing/file.service.stub'; -import * as fromResolver from '../reducer'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; - -@Component({ - template: `` -}) -class TestHostComponent { - @ViewChild(UploadResolverComponent, {static: true}) - public formUnderTest: UploadResolverComponent; - - upload(event: Event): void {} - createFromUrl(event: Event): void {} -} - -const getFakeFile = (str: string) => { - let blob = new Blob([str], { type: 'text/html' }); - blob['lastModifiedDate'] = ''; - blob['name'] = str; - return blob; -}; - -describe('Upload Resolver Page', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let form: UploadResolverComponent; - let fileService: FileServiceStub; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: FileService, useClass: FileServiceStub } - ], - imports: [ - ReactiveFormsModule, - StoreModule.forRoot(fromResolver.reducers), - MockI18nModule - ], - declarations: [ - UploadResolverComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - form = instance.formUnderTest; - fileService = TestBed.get(FileService); - fixture.detectChanges(); - }); - - it('should compile', () => { - fixture.detectChanges(); - expect(form).toBeDefined(); - }); - - describe('save method', () => { - it('should call the upload method with the selected file when one is defined', () => { - fixture.detectChanges(); - form.file = getFakeFile('foo'); - spyOn(form, 'saveFromFile'); - form.save(); - expect(form.saveFromFile).toHaveBeenCalled(); - }); - it('should call the fromUrl method when there is no file selected', () => { - fixture.detectChanges(); - spyOn(form, 'saveFromFile'); - spyOn(form, 'saveFromUrl'); - form.save(); - expect(form.saveFromUrl).toHaveBeenCalled(); - expect(form.saveFromFile).not.toHaveBeenCalled(); - }); - }); - - describe('saveFromFile method', () => { - it('should retrieve the file text from a service and call the provided upload emitter', waitForAsync((done) => { - fixture.detectChanges(); - spyOn(fileService, 'readAsText').and.callFake(() => of('foo')); - form.providerForm.setValue({ serviceProviderName: 'foo', file: '', url: '' }); - form.saveFromFile(getFakeFile('foo'), 'foo'); - form.upload.subscribe(v => { - expect(v).toEqual({ - name: 'foo', - body: 'foo' - }); - done(); - }); - })); - }); - - describe('saveFromUrl method', () => { - it('should retrieve the file text from a service and call the provided upload emitter', waitForAsync((done) => { - fixture.detectChanges(); - form.saveFromUrl({ serviceProviderName: 'foo', url: 'foo.bar' }); - form.fromUrl.subscribe(v => { - expect(v).toEqual({ - name: 'foo', - url: 'foo.bar' - }); - done(); - }); - })); - }); - - describe('fileChange method', () => { - it('should set the reactive form value based on the provided event', waitForAsync((done) => { - let evt = { - target: { - files: [{name: 'foo'}] - } - }; - form.fileChange(evt); - fixture.detectChanges(); - expect(form.file).toBeDefined(); - expect(form.providerForm.get('file').value).toBe('foo'); - })); - - it('should do nothing if no file is selected', waitForAsync((done) => { - let evt = { - target: { - files: [] - } - }; - form.fileChange(evt); - fixture.detectChanges(); - expect(form.file).not.toBeDefined(); - expect(form.providerForm.get('file').value).toBe(''); - })); - }); -}); diff --git a/ui/src/app/metadata/resolver/container/upload-resolver.component.ts b/ui/src/app/metadata/resolver/container/upload-resolver.component.ts deleted file mode 100644 index 4bebb200f..000000000 --- a/ui/src/app/metadata/resolver/container/upload-resolver.component.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Subject } from 'rxjs'; -import { takeUntil, debounceTime } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; -import { FileService } from '../../../core/service/file.service'; -import * as fromResolver from '../reducer'; -import { UploadResolverRequest, CreateResolverFromUrlRequest } from '../action/collection.action'; - -@Component({ - selector: 'upload-resolver-form', - templateUrl: './upload-resolver.component.html' -}) -export class UploadResolverComponent implements OnInit, OnDestroy { - private ngUnsubscribe: Subject = new Subject(); - - @Output() upload: EventEmitter = new EventEmitter(); - @Output() fromUrl: EventEmitter = new EventEmitter(); - - providerForm: FormGroup; - formValue: any; - - file: File; - - constructor( - private fb: FormBuilder, - private fileService: FileService, - private store: Store - ) {} - - ngOnInit(): void { - this.providerForm = this.fb.group({ - serviceProviderName: ['', Validators.required], - file: [''], - url: [''] - }); - - this.providerForm.valueChanges.subscribe(changes => { - this.formValue = changes; - }); - - this.providerForm.get('file').valueChanges.pipe( - takeUntil(this.ngUnsubscribe), - debounceTime(100) - ).subscribe(changes => { - let url = this.providerForm.get('url'); - url[changes ? 'disable' : 'enable'](); - if (!!url.value) { - url.setValue(null); - } - }); - } - - save(): void { - let file = this.file; - if (file) { - this.saveFromFile(file, this.providerForm.get('serviceProviderName').value); - } else { - this.saveFromUrl(this.providerForm.value); - } - } - - saveFromFile(file: File, name: string): void { - this.fileService.readAsText(file).subscribe(txt => { - this.store.dispatch(new UploadResolverRequest({ - name: name, - body: txt as string - })); - }); - } - - saveFromUrl(values: {serviceProviderName: string, url: string}): void { - this.store.dispatch(new CreateResolverFromUrlRequest({ - name: values.serviceProviderName, - url: values.url - })); - } - - fileChange($event): void { - let fileList = $event.target.files, - file = fileList[0]; - this.file = file; - if (file) { - this.providerForm.get('file').setValue(file.name); - this.providerForm.updateValueAndValidity(); - } - } - - ngOnDestroy(): void { - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts deleted file mode 100644 index a04482061..000000000 --- a/ui/src/app/metadata/resolver/effect/collection.effect.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { Router } from '@angular/router'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionEffects } from './collection.effects'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { RouterStub } from '../../../../testing/router.stub'; - -describe('Resolver Collection Effects', () => { - let effects: ResolverCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ResolverCollectionEffects, - { - provide: ResolverService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (e: MetadataResolver) => { }, - update: (e: MetadataResolver) => { }, - remove: (e: MetadataResolver) => { }, - preview: (e: MetadataResolver) => { }, - upload: (name: string, xml: string) => { }, - createFromUrl: (name: string, url: string) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(ResolverCollectionEffects); - draftService = TestBed.get(ResolverService); - actions$ = TestBed.get(Actions); - }); -}); diff --git a/ui/src/app/metadata/resolver/effect/collection.effects.ts b/ui/src/app/metadata/resolver/effect/collection.effects.ts deleted file mode 100644 index b4550d358..000000000 --- a/ui/src/app/metadata/resolver/effect/collection.effects.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, catchError, switchMap, tap, withLatestFrom } from 'rxjs/operators'; - -import { - ResolverCollectionActionTypes, - LoadResolverRequest, - LoadResolverSuccess, - LoadResolverError, - AddResolverRequest, - AddResolverSuccess, - AddResolverFail, - RemoveResolverRequest, - RemoveResolverSuccess, - RemoveResolverFail, - SelectResolver, - SelectResolverSuccess, - UpdateResolverRequest, - UpdateResolverSuccess, - UpdateResolverFail, - UpdateResolverConflict, - UploadResolverRequest, - CreateResolverFromUrlRequest -} from '../action/collection.action'; -import * as draftActions from '../action/draft.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { removeNulls } from '../../../shared/util'; -import { AddNotification } from '../../../notification/action/notification.action'; -import { Notification, NotificationType } from '../../../notification/model/notification'; -import { I18nService } from '../../../i18n/service/i18n.service'; -import * as fromRoot from '../../../app.reducer'; -import * as fromI18n from '../../../i18n/reducer'; -import { UpdateSaving } from '../action/entity.action'; - - -/* istanbul ignore next */ -@Injectable() -export class ResolverCollectionEffects { - - @Effect() - loadResolvers$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST), - switchMap(() => - this.descriptorService - .query() - .pipe( - map(descriptors => new LoadResolverSuccess(descriptors)), - catchError(error => of(new LoadResolverError(error))) - ) - ) - ); - - @Effect() - updateResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST), - map(action => action.payload), - switchMap(provider => { - return this.descriptorService - .update(removeNulls(provider)) - .pipe( - map(p => new UpdateResolverSuccess({ - id: p.id, - changes: p - })), - catchError(err => { - if (err.status === 409) { - return of(new UpdateResolverConflict(provider)); - } - return of(new UpdateResolverFail({ - errorCode: err.status, - errorMessage: `${err.statusText} - ${err.message}` - })); - }) - ); - }) - ); - - @Effect() - updateResolverSavingOnRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST), - map(action => new UpdateSaving(true)), - ); - - @Effect() - updateResolverSavingOnResult$ = this.actions$.pipe( - ofType( - ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS, - ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL - ), - map(action => new UpdateSaving(false)), - ); - - @Effect({ dispatch: false }) - updateResolverSuccessRedirect$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['metadata', 'resolver', provider.id, 'configuration'])) - ); - - @Effect() - updateResolverFailNotification$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - selectResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.SELECT), - map(action => action.payload), - switchMap(id => - this.descriptorService - .find(id) - .pipe( - map(p => new SelectResolverSuccess(p)) - ) - ) - ); - - @Effect() - addResolverRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER), - map(action => action.payload), - map(provider => { - return ({ - ...provider, - relyingPartyOverrides: removeNulls(provider.relyingPartyOverrides) - }); - }), - switchMap(provider => - this.descriptorService - .save(provider) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError(() => of(new AddResolverFail(provider))) - ) - ) - ); - - @Effect({ dispatch: false }) - addResolverSuccessRedirect$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['dashboard'])) - ); - - @Effect() - addResolverSuccessRemoveDraft$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - map(provider => { - return new draftActions.RemoveDraftRequest(provider); - }) - ); - - @Effect() - addResolverFailNotification$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromI18n.getMessages)), - map(([error, messages]) => new AddNotification( - new Notification( - NotificationType.Danger, - `${error.errorCode}: ${this.i18nService.translate(error.errorMessage, null, messages)}`, - 8000 - ) - )) - ); - - @Effect() - uploadResolverRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPLOAD_RESOLVER_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .upload(file.name, file.body) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError((error) => of(new AddResolverFail(error))) - ) - ) - ); - - @Effect() - createResolverFromUrlRequest$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.CREATE_RESOLVER_FROM_URL_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .createFromUrl(file.name, file.url) - .pipe( - map(p => new AddResolverSuccess(p)), - catchError((error) => of(new AddResolverFail(error))) - ) - ) - ); - - @Effect() - removeResolver$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.REMOVE_RESOLVER), - map(action => action.payload), - switchMap(entity => - this.descriptorService - .remove(entity) - .pipe( - map(p => new RemoveResolverSuccess(entity)), - catchError(err => of(new RemoveResolverFail(err))) - ) - ) - ); - - constructor( - private descriptorService: ResolverService, - private actions$: Actions, - private router: Router, - private store: Store, - private i18nService: I18nService - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/copy.effect.ts b/ui/src/app/metadata/resolver/effect/copy.effect.ts deleted file mode 100644 index d7b9bf385..000000000 --- a/ui/src/app/metadata/resolver/effect/copy.effect.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { switchMap, map, withLatestFrom } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; - -import { - CopySourceActionUnion, - CopySourceActionTypes, - CreateResolverCopyRequest, - CreateResolverCopySuccess, - CreateResolverCopyError -} from '../action/copy.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import { removeNulls } from '../../../shared/util'; -import { UpdateChangesRequest } from '../action/entity.action'; - - -@Injectable() -export class CopyResolverEffects { - - @Effect() - copyRequest$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromResolver.getAllResolvers), - this.store.select(fromResolver.getSectionsToCopy) - ), - switchMap(([attrs, providers, sections]) => { - const { serviceProviderName, entityId } = attrs; - const provider = providers.find(p => p.entityId === attrs.target); - const copied = removeNulls(sections.reduce((c, section) => ({ ...c, ...{[section]: provider[section] } }), {})); - const action = provider ? - new CreateResolverCopySuccess(new FileBackedHttpMetadataResolver({ - serviceProviderName, - entityId, - ...copied - })) : - new CreateResolverCopyError(new Error('Not found')); - return of(action); - })); - - @Effect() - changesOnCreation$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS), - map(action => action.payload), - map(entity => new UpdateChangesRequest(entity)) - ); - - @Effect({ dispatch: false }) - copyOnCreation$ = this.actions$.pipe( - ofType(CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS), - switchMap(() => this.router.navigate(['metadata', 'resolver', 'new', 'copy', 'confirm'])) - ); - - constructor( - private actions$: Actions, - private store: Store, - private router: Router - ) { } -} diff --git a/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts deleted file mode 100644 index 19760a1b4..000000000 --- a/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { StoreModule } from '@ngrx/store'; -import { Router } from '@angular/router'; - -import { TestActions, getActions } from '../../../../testing/effect.util'; -import { DraftCollectionEffects, getPayload } from './draft-collection.effects'; -import { EntityDraftService } from '../../domain/service/draft.service'; -import { MetadataResolver } from '../../domain/model'; -import { RouterStub } from '../../../../testing/router.stub'; -import { AddDraftRequest } from '../action/draft.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity'; -import * as fromRoot from '../../../app.reducer'; - - -describe('Draft Collection Effects', () => { - let effects: DraftCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - DraftCollectionEffects, - { - provide: EntityDraftService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (provider: MetadataResolver) => { }, - remove: (provider: MetadataResolver) => { }, - update: (provider: MetadataResolver) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - imports: [ - StoreModule.forRoot(fromRoot.reducers) - ] - }); - - effects = TestBed.get(DraftCollectionEffects); - draftService = TestBed.get(EntityDraftService); - actions$ = TestBed.get(Actions); - }); - - describe('getPayload', () => { - it('should return the action payload', () => { - const payload = new FileBackedHttpMetadataResolver({ id: 'foo' }); - const action = new AddDraftRequest(payload); - expect(getPayload(action)).toEqual(payload); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts deleted file mode 100644 index 707573dd5..000000000 --- a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Router } from '@angular/router'; - -import { of } from 'rxjs'; -import { switchMap, map, catchError, tap } from 'rxjs/operators'; - -import { - DraftActionTypes, - SelectDraftRequest, - SelectDraftError, - SelectDraftSuccess -} from '../action/draft.action'; -import * as actions from '../action/draft.action'; -import { EntityDraftService } from '../../domain/service/draft.service'; -import * as fromResolver from '../reducer'; -import { Store } from '@ngrx/store'; -import { MetadataResolver } from '../../domain/model'; - -export const getPayload = (action: any) => action.payload; - -/* istanbul ignore next */ -@Injectable() -export class DraftCollectionEffects { - - @Effect() - loadDrafts$ = this.actions$.pipe( - ofType(DraftActionTypes.LOAD_DRAFT_REQUEST), - switchMap(() => - this.draftService - .query() - .pipe( - map(descriptors => new actions.LoadDraftSuccess(descriptors)), - catchError(error => of(new actions.LoadDraftError(error))) - ) - ) - ); - - @Effect() - addDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.ADD_DRAFT), - map(getPayload), - switchMap(provider => - this.draftService - .save(provider) - .pipe( - map(p => new actions.AddDraftSuccess(provider)) - ) - ) - ); - - @Effect() - addDraftSuccessReload$ = this.actions$.pipe( - ofType(DraftActionTypes.ADD_DRAFT_SUCCESS), - map(getPayload), - switchMap(provider => - this.draftService - .find(provider.entityId) - .pipe( - map(p => new actions.LoadDraftRequest()) - ) - ) - ); - - @Effect() - updateDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.UPDATE_DRAFT_REQUEST), - map(getPayload), - switchMap(provider => { - return this.draftService - .update(provider) - .pipe( - map(p => new actions.UpdateDraftSuccess({ - id: p.id, - changes: p - })) - ); - }) - ); - - @Effect() - selectDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.SELECT_REQUEST), - map(getPayload), - switchMap(id => - this.draftService - .find(id) - .pipe( - map(p => new SelectDraftSuccess(p.id)), - catchError(e => of(new SelectDraftError())) - ) - ) - ); - - @Effect() - selectDraftReload$ = this.actions$.pipe( - ofType(DraftActionTypes.SELECT_REQUEST), - map(getPayload), - map(id => new actions.LoadDraftRequest()) - ); - - @Effect() - removeDraft$ = this.actions$.pipe( - ofType(DraftActionTypes.REMOVE_DRAFT), - map(getPayload), - switchMap(provider => { - let hasEntityId = !!provider.entityId; - let prop = hasEntityId ? 'entityId' : 'id'; - let val = hasEntityId ? provider.entityId : provider.id; - return this.draftService.find(val, prop).pipe( - switchMap(selected => this.draftService.remove(selected)), - map(p => new actions.RemoveDraftSuccess(val)) - ); - }) - ); - @Effect() - removeDraftSuccessReload$ = this.actions$.pipe( - ofType(DraftActionTypes.REMOVE_DRAFT_SUCCESS), - map(action => new actions.LoadDraftRequest()) - ); - - constructor( - private draftService: EntityDraftService, - private actions$: Actions, - private router: Router, - private store: Store - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/resolver/effect/entity.effect.ts b/ui/src/app/metadata/resolver/effect/entity.effect.ts deleted file mode 100644 index f869a55dc..000000000 --- a/ui/src/app/metadata/resolver/effect/entity.effect.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { switchMap, map, withLatestFrom, tap } from 'rxjs/operators'; - -import * as fromResolver from '../reducer'; -import * as fromRoot from '../../../app.reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { - ResolverEntityActionTypes, - Clear, - Cancel, - UpdateChangesRequest, - UpdateChangesSuccess, - UpdateSaving -} from '../action/entity.action'; -import * as provider from '../action/collection.action'; - -import { CancelContentionAction, ContentionActionTypes, ShowContentionAction } from '../../../contention/action/contention.action'; - -import { ResolverCollectionActionTypes } from '../action/collection.action'; -import { ResolverService } from '../../domain/service/resolver.service'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { ContentionService } from '../../../contention/service/contention.service'; - -@Injectable() -export class EntityEffects { - - @Effect() - updateChanges$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.UPDATE_CHANGES_REQUEST), - map(action => action.payload), - withLatestFrom( - this.store.select(fromResolver.getEntityChanges) - ), - map(([changes, storedChanges]) => { - const update = { ...storedChanges, ...changes }; - return new UpdateChangesSuccess(update); - }) - ); - - @Effect({dispatch: false}) - cancelChanges$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.CANCEL), - map(() => new Clear()), - tap(() => this.router.navigate(['dashboard'])) - ); - - @Effect() - updateResolverSuccessClear$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS), - map(action => action.payload), - map(p => new Clear()) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.UPDATE_RESOLVER_CONFLICT), - map(action => action.payload), - withLatestFrom(this.store.select(fromResolver.getSelectedResolver)), - switchMap(([resolver, current]) => { - return this.service.find(resolver.id).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, resolver, data, { - resolve: (obj) => this.store.dispatch(new provider.UpdateResolverRequest(obj)), - reject: (obj) => this.gotoConfiguration(resolver.id) - }))) - ); - }) - ); - - @Effect() - $resetChangesOnContentionFail = this.actions$.pipe( - ofType(ContentionActionTypes.CANCEL_CONTENTION), - map(() => new UpdateSaving(false)) - ); - - constructor( - private store: Store, - private service: ResolverService, - private actions$: Actions, - private router: Router, - private contentionService: ContentionService - ) { } - - gotoConfiguration(id) { - this.store.dispatch(new Clear()); - this.router.navigate(['metadata', 'resolver', id, 'configuration']) - } -} diff --git a/ui/src/app/metadata/resolver/effect/search.effect.ts b/ui/src/app/metadata/resolver/effect/search.effect.ts deleted file mode 100644 index 734e143b9..000000000 --- a/ui/src/app/metadata/resolver/effect/search.effect.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, switchMap, withLatestFrom } from 'rxjs/operators'; - -import { SearchActionTypes, SearchActionUnion, SearchIdsSuccess } from '../action/search.action'; -import * as fromResolver from '../reducer'; - -@Injectable() -export class SearchIdEffects { - - private dbounce = 500; - - @Effect() - searchEntityIds$ = this.actions$.pipe( - ofType(SearchActionTypes.SEARCH_IDS), - map(action => action.payload), - withLatestFrom(this.store.select(fromResolver.getAllEntityIds)), - map(([ query, ids ]) => { - if (!query) { return []; } - return ids.filter(e => this.matcher(e, query)); - }), - switchMap(entities => of(new SearchIdsSuccess(entities))) - ); - - matcher = (value, query) => value ? value.toLocaleLowerCase().match(query.toLocaleLowerCase()) : false; - - constructor( - private actions$: Actions, - private store: Store - ) { } -} diff --git a/ui/src/app/metadata/resolver/effect/wizard.effect.ts b/ui/src/app/metadata/resolver/effect/wizard.effect.ts deleted file mode 100644 index a8523d2c2..000000000 --- a/ui/src/app/metadata/resolver/effect/wizard.effect.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { map, filter, withLatestFrom } from 'rxjs/operators'; - -import { - Clear, - ResolverEntityActionTypes, - UpdateChangesSuccess -} from '../action/entity.action'; -import { - ResolverCollectionActionTypes, - AddResolverSuccess -} from '../action/collection.action'; -import { UpdateDraftRequest } from '../action/draft.action'; -import * as fromRoot from '../../../app.reducer'; -import { Store } from '@ngrx/store'; -import { getSelectedDraftId } from '../reducer'; - -@Injectable() -export class WizardEffects { - - @Effect() - updateResolver$ = this.actions$.pipe( - ofType(ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS), - map(action => action.payload), - filter(provider => !provider.createdDate), - withLatestFrom(this.store.select(getSelectedDraftId)), - map(([provider, id]) => { - return new UpdateDraftRequest({ id, ...provider }); - }) - ); - - @Effect() - addResolverSuccessDiscard$ = this.actions$.pipe( - ofType(ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS), - map(action => action.payload), - map(provider => new Clear()) - ); - - constructor( - private store: Store, - private actions$: Actions - ) { } -} diff --git a/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts b/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts deleted file mode 100644 index 88834e272..000000000 --- a/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { - CanActivate, - Router, - ActivatedRouteSnapshot, - RouterStateSnapshot -} from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; - -import * as fromProvider from '../reducer'; - -@Injectable() -export class CopyIsSetGuard implements CanActivate { - constructor( - private store: Store, - private router: Router - ) { } - - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.store.select(fromProvider.getCopy).pipe( - map(copy => !!copy), - tap(isDefined => !isDefined ? this.router.navigate(['/new/copy']) : isDefined) - ); - } -} diff --git a/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts deleted file mode 100644 index 98aafb702..000000000 --- a/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { reducer } from './collection.reducer'; -import * as fromCollection from './collection.reducer'; -import * as resolverActions from '../action/collection.action'; -import { MetadataResolver } from '../../domain/model'; - -let resolvers: MetadataResolver[] = [ - { id: '1', entityId: 'foo', serviceProviderName: 'bar', createdDate: 'Tue Apr 17 2018 13:33:54 GMT-0700 (MST)' } as MetadataResolver, - { id: '2', entityId: 'baz', serviceProviderName: 'fin', createdDate: 'Tue Apr 17 2018 13:34:07 GMT-0700 (MST)' } as MetadataResolver -], -snapshot: fromCollection.CollectionState = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: resolvers[1] - }, - selectedResolverId: null, - loading: false -}; - -describe('Resolver Reducer', () => { - const initialState: fromCollection.CollectionState = { - ids: [], - entities: {}, - selectedResolverId: null, - loading: false - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Providers: Success', () => { - it('should add the loaded resolvers to the collection', () => { - const action = new resolverActions.LoadResolverSuccess(resolvers); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Providers: Success', () => { - it('should update the draft of the specified id', () => { - let changes = { ...resolvers[1], serviceEnabled: true }, - expected = { - ids: [resolvers[0].id, resolvers[1].id], - entities: { - [resolvers[0].id]: resolvers[0], - [resolvers[1].id]: changes - }, - selectedResolverId: null - }; - const action = new resolverActions.UpdateResolverSuccess({id: changes.id, changes}); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - Object.assign({}, initialState, expected) - ); - }); - }); - - describe('Select Resolver', () => { - it('should update the selected draft id', () => { - let id = 'foo', - createdDate = new Date().toDateString(), - expected = { ...snapshot, selectedResolverId: id }; - const action = new resolverActions.SelectResolverSuccess({ id, createdDate } as MetadataResolver); - const result = reducer({ ...snapshot }, action); - - expect(result.selectedResolverId).toEqual(id); - expect(result.ids.length).toBe(3); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts deleted file mode 100644 index 635142468..000000000 --- a/ui/src/app/metadata/resolver/reducer/collection.reducer.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionActionsUnion, ResolverCollectionActionTypes } from '../action/collection.action'; - -export interface CollectionState extends EntityState { - selectedResolverId: string | null; - loading: boolean; -} - -export function sortByDate(a: MetadataResolver, b: MetadataResolver): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: CollectionState = adapter.getInitialState({ - selectedResolverId: null, - loading: false -}); - -export function reducer(state = initialState, action: ResolverCollectionActionsUnion): CollectionState { - switch (action.type) { - case ResolverCollectionActionTypes.LOAD_RESOLVER_REQUEST: { - return { - ...state, - loading: true - }; - } - case ResolverCollectionActionTypes.LOAD_RESOLVER_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - loading: false, - selectedResolverId: state.selectedResolverId - }); - } - - case ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS: { - const removed = adapter.removeOne(action.payload.id as string, state); - const addBack = adapter.upsertOne(action.payload.changes as MetadataResolver, removed); - return addBack; - } - - case ResolverCollectionActionTypes.SELECT_SUCCESS: { - return adapter.upsertOne(action.payload, { - ...state, - selectedResolverId: action.payload.id, - }); - } - - case ResolverCollectionActionTypes.LOAD_RESOLVER_ERROR: { - return adapter.removeAll({ - ...state, - loading: false - }); - } - - case ResolverCollectionActionTypes.REMOVE_RESOLVER_SUCCESS: { - return adapter.removeOne(action.payload, { - ...state - }); - } - - case ResolverCollectionActionTypes.CLEAR_SELECTION: { - return { - ...state, - selectedResolverId: null - }; - } - - default: { - return state; - } - } -} - -export const getSelectedResolverId = (state: CollectionState) => state.selectedResolverId; -export const { - selectIds: selectResolverIds, - selectEntities: selectResolverEntities, - selectAll: selectAllResolvers, - selectTotal: selectResolverTotal -} = adapter.getSelectors(); - -export const getResolversLoading = (state: CollectionState) => state.loading; diff --git a/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts deleted file mode 100644 index 304c1762c..000000000 --- a/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { reducer } from './copy.reducer'; -import * as fromResolverCopy from './copy.reducer'; -import * as actions from '../action/copy.action'; -import * as fromCollection from '../action/collection.action'; -import { CopySourceActionTypes, CreateResolverCopyRequest } from '../action/copy.action'; -import { FileBackedHttpMetadataResolver } from '../../domain/entity/resolver/file-backed-http-metadata-resolver'; - -const snapshot: fromResolverCopy.CopyState = { ...fromResolverCopy.initialState }; - -describe('Resolver -> Copy Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - expect(result).toEqual(snapshot); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST} action`, () => { - it('should set properties on the state', () => { - const obj = { ...snapshot }; - const result = reducer(snapshot, new CreateResolverCopyRequest(obj)); - - expect(result).toEqual(obj); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot }; - const result = reducer(snapshot, new actions.CreateResolverCopySuccess(p)); - - expect(result.provider).toBe(p); - }); - }); - - describe(`${CopySourceActionTypes.CREATE_RESOLVER_COPY_ERROR} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot }; - const result = reducer(snapshot, new actions.CreateResolverCopyError(new Error())); - - expect(result.provider).toBeNull(); - }); - }); - - describe(`${CopySourceActionTypes.UPDATE_RESOLVER_COPY} action`, () => { - it('should set properties on the state', () => { - const obj = { ...snapshot, provider: new FileBackedHttpMetadataResolver({}) }; - const result = reducer(snapshot, new actions.UpdateResolverCopy({id: 'foo'})); - - expect(result.provider.id).toBe('foo'); - }); - }); - - describe(`${ fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER } action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverRequest(p)); - - expect(result.saving).toBe(true); - }); - }); - - describe(`${fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverSuccess(p)); - - expect(result.saving).toBe(false); - }); - }); - - describe(`${fromCollection.ResolverCollectionActionTypes.ADD_RESOLVER_FAIL} action`, () => { - it('should set properties on the state', () => { - const p = new FileBackedHttpMetadataResolver({}); - const obj = { ...snapshot, provider: p }; - const result = reducer(snapshot, new fromCollection.AddResolverFail(p)); - - expect(result.saving).toBe(false); - }); - }); - - describe(`getCopy selector function`, () => { - it('should return the entire copy object', () => { - expect(fromResolverCopy.getCopy(snapshot)).toBe(snapshot.provider); - }); - }); - describe(`getEntityId selector function`, () => { - it('should return the entityId property', () => { - expect(fromResolverCopy.getEntityId(snapshot)).toBe(snapshot.entityId); - }); - }); - describe(`getName selector function`, () => { - it('should return the serviceProviderName property', () => { - expect(fromResolverCopy.getName(snapshot)).toBe(snapshot.serviceProviderName); - }); - }); - describe(`getTarget selector function`, () => { - it('should return the target property', () => { - expect(fromResolverCopy.getTarget(snapshot)).toBe(snapshot.target); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/copy.reducer.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.ts deleted file mode 100644 index 5b67f2e97..000000000 --- a/ui/src/app/metadata/resolver/reducer/copy.reducer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { CopySourceActionTypes, CopySourceActionUnion } from '../action/copy.action'; -import { MetadataResolver } from '../../domain/model'; -import { ResolverCollectionActionsUnion, ResolverCollectionActionTypes } from '../action/collection.action'; - -export interface CopyState { - target: string; - serviceProviderName: string; - entityId: string; - provider: MetadataResolver; - saving: boolean; - sections: string[]; -} - -export const initialState: CopyState = { - target: null, - serviceProviderName: null, - entityId: null, - provider: null, - saving: false, - sections: [] -}; - -export function reducer(state = initialState, action: CopySourceActionUnion | ResolverCollectionActionsUnion): CopyState { - switch (action.type) { - case CopySourceActionTypes.UPDATE_RESOLVER_COPY_SECTIONS: { - return { - ...state, - sections: [ - ...action.payload - ] - }; - } - case CopySourceActionTypes.CREATE_RESOLVER_COPY_REQUEST: { - return { - ...state, - ...action.payload - }; - } - case CopySourceActionTypes.CREATE_RESOLVER_COPY_SUCCESS: { - return { - ...state, - provider: action.payload - }; - } - case CopySourceActionTypes.UPDATE_RESOLVER_COPY: { - return { - ...state, - provider: { - ...state.provider, - ...action.payload - } - }; - } - case ResolverCollectionActionTypes.ADD_RESOLVER: { - return { - ...state, - saving: true - }; - } - case ResolverCollectionActionTypes.ADD_RESOLVER_FAIL: - case ResolverCollectionActionTypes.ADD_RESOLVER_SUCCESS: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getTarget = (state: CopyState) => state.target; -export const getName = (state: CopyState) => state.serviceProviderName; -export const getEntityId = (state: CopyState) => state.entityId; -export const getCopy = (state: CopyState) => state.provider; -export const getCopyAttributes = (state: CopyState) => ({ - entityId: state.entityId, - serviceProviderName: state.serviceProviderName, - target: state.target -}); -export const getCopySections = (state: CopyState) => state.sections; -export const getSaving = (state: CopyState) => state.saving; diff --git a/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts deleted file mode 100644 index 880c70c6a..000000000 --- a/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { reducer, adapter } from './draft.reducer'; -import * as fromDrafts from './draft.reducer'; -import * as draftActions from '../action/draft.action'; -import { MetadataResolver } from '../../domain/model'; - -let drafts: MetadataResolver[] = [ - { id: 'foo', serviceProviderName: 'bar' } as MetadataResolver, - { id: 'baz', serviceProviderName: 'fin' } as MetadataResolver - ], - snapshot: fromDrafts.DraftState = { - ids: [drafts[0].id, drafts[1].id], - entities: { - [drafts[0].id]: drafts[0], - [drafts[1].id]: drafts[1] - }, - selectedDraftId: null - }; - -describe('Draft Reducer', () => { - const initialState: fromDrafts.DraftState = { - ids: [], - entities: {}, - selectedDraftId: null - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('Load Drafts: Success', () => { - it('should add the loaded drafts to the collection', () => { - const action = new draftActions.LoadDraftSuccess(drafts); - const result = reducer(initialState, action); - - expect(result).toEqual( - Object.assign({}, initialState, snapshot) - ); - }); - }); - - describe('Update Drafts: Success', () => { - it('should update the draft of the specified entityId', () => { - let changes = { ...drafts[1], serviceProviderName: 'foo' }, - expected = { - ids: [drafts[0].id, drafts[1].entityId], - entities: { - [drafts[0].id]: drafts[0], - [drafts[1].id]: changes - }, - selectedDraftId: null - }; - spyOn(adapter, 'updateOne'); - const action = new draftActions.UpdateDraftSuccess({id: changes.id, changes }); - const result = reducer({ ...snapshot }, action); - - expect(adapter.updateOne).toHaveBeenCalled(); - }); - - it('should return state if the entityId is not found', () => { - let changes = { ...drafts[1], serviceEnabled: true, id: 'bar' }; - const action = new draftActions.UpdateDraftSuccess({id: changes.id, changes}); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual(snapshot); - }); - }); - - describe('Select Draft', () => { - it('should update the selected draft id', () => { - let id = 'foo', - expected = { ...snapshot, selectedDraftId: id }; - const action = new draftActions.SelectDraftSuccess(id); - const result = reducer({ ...snapshot }, action); - - expect(result).toEqual( - { ...initialState, ...expected } - ); - }); - }); - describe('Selectors', () => { - it('getEntities should return all drafts', () => { - expect(fromDrafts.selectDraftEntities({ - ids: [], - entities: {}, - })).toEqual({}); - expect(fromDrafts.selectDraftEntities(snapshot)).toEqual(snapshot.entities); - }); - - it('getIds should return all Ids', () => { - expect(fromDrafts.selectDraftIds({ - ids: [], - entities: {} - })).toEqual([]); - expect(fromDrafts.selectDraftIds(snapshot)).toEqual(snapshot.ids); - }); - - it('getSelectedDraftId should return the selected entityId', () => { - expect(fromDrafts.getSelectedDraftId({ - ids: [], - entities: {}, - selectedDraftId: null, - })).toBeNull(); - expect(fromDrafts.getSelectedDraftId(Object.assign({}, snapshot, { selectedDraftId: 'foo' }))).toEqual('foo'); - }); - - it('getAll return all entities as an array', () => { - expect(fromDrafts.selectAllDrafts(snapshot)).toEqual(drafts); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/draft.reducer.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.ts deleted file mode 100644 index 0cf30d153..000000000 --- a/ui/src/app/metadata/resolver/reducer/draft.reducer.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; - -import { MetadataResolver } from '../../domain/model'; -import { DraftActionsUnion, DraftActionTypes } from '../action/draft.action'; - -export interface DraftState extends EntityState { - selectedDraftId: string | null; -} - -export const adapter: EntityAdapter = createEntityAdapter({ - selectId: (model: MetadataResolver) => model.id -}); - -export const initialState: DraftState = adapter.getInitialState({ - selectedDraftId: null, -}); - -export function reducer(state = initialState, action: DraftActionsUnion): DraftState { - switch (action.type) { - - case DraftActionTypes.LOAD_DRAFT_SUCCESS: { - return adapter.setAll(action.payload, { - ...state, - selectedDraftId: state.selectedDraftId, - }); - } - - case DraftActionTypes.UPDATE_DRAFT_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case DraftActionTypes.REMOVE_DRAFT_SUCCESS: { - return adapter.removeOne(action.payload, state); - } - - case DraftActionTypes.SELECT_SUCCESS: { - return { - ...state, - selectedDraftId: action.payload, - }; - } - - default: { - return state; - } - } -} - -export const getSelectedDraftId = (state: DraftState) => state.selectedDraftId; -export const { - selectIds: selectDraftIds, - selectEntities: selectDraftEntities, - selectAll: selectAllDrafts, - selectTotal: selectDraftTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts deleted file mode 100644 index acde92bc1..000000000 --- a/ui/src/app/metadata/resolver/reducer/entity.reducer.spec.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { reducer } from './entity.reducer'; -import * as fromEntity from './entity.reducer'; -import { - UpdateStatus, - Clear, - UpdateChangesSuccess -} from '../action/entity.action'; -import { MetadataResolver } from '../../domain/model'; - -describe('Entity Reducer', () => { - const initialState: fromEntity.EntityState = { - saving: false, - status: {}, - changes: {} as MetadataResolver - }; - - const changes = { - id: 'foo', - serviceProviderName: 'bar' - } as MetadataResolver; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - expect(result).toEqual(initialState); - }); - }); - - describe('Entity Update Status', () => { - it('should update the status of the provided form', () => { - const status = { organization: 'VALID' }; - const action = new UpdateStatus(status); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - ...{ status } - } - ); - }); - }); - - describe('Entity Update Changes', () => { - it('should add changes of the provided form', () => { - const action = new UpdateChangesSuccess(changes); - const result = reducer(initialState, action); - expect(result).toEqual( - { - ...initialState, - ...{ changes } - } - ); - }); - }); - - describe('Entity Clear', () => { - it('should remove changes', () => { - const action = new Clear(); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { - changes: initialState.changes - }) - ); - }); - }); - - describe('Selectors', () => { - it('should aggregate the status', () => { - expect(fromEntity.isEntitySaving({ - saving: false, - changes: {} as MetadataResolver, - status: { - organization: 'INVALID', - foo: 'VALID' - } - })).toBe(false); - }); - - it('should calculate a saved status based on changes', () => { - expect(fromEntity.isEntitySaved({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toBe(true); - - expect(fromEntity.isEntitySaved({ - saving: false, - changes: {organization: {}, id: 'bar'} as MetadataResolver, - status: {} - })).toBe(false); - }); - - it('should return current changes', () => { - expect(fromEntity.getChanges({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toEqual({} as MetadataResolver); - }); - - it('should return `saving` status', () => { - expect(fromEntity.isEntitySaving({ - saving: false, - changes: {} as MetadataResolver, - status: {} - })).toBe(false); - - expect(fromEntity.isEntitySaving({ - saving: true, - changes: {} as MetadataResolver, - status: {} - })).toBe(true); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/entity.reducer.ts b/ui/src/app/metadata/resolver/reducer/entity.reducer.ts deleted file mode 100644 index 158ed193c..000000000 --- a/ui/src/app/metadata/resolver/reducer/entity.reducer.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { MetadataResolver } from '../../domain/model'; -import * as entity from '../action/entity.action'; -import { ResolverEntityActionTypes, ResolverEntityActionUnion } from '../action/entity.action'; - -export interface EntityState { - saving: boolean; - status: { [key: string]: string }; - changes: MetadataResolver; -} - -export const initialState: EntityState = { - saving: false, - status: {}, - changes: {} as MetadataResolver -}; - -export function reducer(state = initialState, action: ResolverEntityActionUnion): EntityState { - switch (action.type) { - case ResolverEntityActionTypes.UPDATE_CHANGES_SUCCESS: { - return { - ...state, - changes: { ...action.payload } - }; - } - case ResolverEntityActionTypes.UPDATE_STATUS: { - return { - ...state, - status: { ...state.status, ...action.payload } - }; - } - case ResolverEntityActionTypes.UPDATE_SAVING: { - return { - ...state, - saving: action.payload - }; - } - case ResolverEntityActionTypes.CLEAR: - return { - ...state, - changes: { ...initialState.changes } - }; - default: { - return state; - } - } -} - -export const isEntitySaved = (state: EntityState) => !Object.keys(state.changes).length; -export const getChanges = (state: EntityState) => state.changes; -export const isEntitySaving = (state: EntityState) => state.saving; -export const getFormStatus = (state: EntityState) => state.status; - -export const isEntityValid = (state: EntityState) => - !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); -export const getInvalidForms = (state: EntityState) => - Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/resolver/reducer/index.spec.ts b/ui/src/app/metadata/resolver/reducer/index.spec.ts deleted file mode 100644 index 5a7cc66ee..000000000 --- a/ui/src/app/metadata/resolver/reducer/index.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - getResolverEntityIdCollectionFn, - getAllOtherIdsFn, - getResolverUniqueValidEntityIdsFn -} from './index'; - -describe('Resolver Reducer selectors', () => { - describe(`getResolverEntityIdCollectionFn function`, () => { - it('should return a list of entity ids', () => { - - const resolvers = [ - { - entityId: 'foo' - }, - { - entityId: 'bar' - }, - { - entityId: 'baz' - } - ]; - - expect(getResolverEntityIdCollectionFn(resolvers)).toEqual(['foo', 'bar', 'baz']); - }); - }); - - describe('getResolverUniqueValidEntityIdsFn function', () => { - it('should return a unique and valid list of ids from the provided list', () => { - const ids = ['foo', undefined, undefined, 'foo', 'bar']; - expect(getResolverUniqueValidEntityIdsFn(ids)).toEqual(['foo', 'bar']); - }); - }); - - describe('getAllOtherIdsFn function', () => { - it('should return a list of ids without the selected', () => { - const ids = ['foo', 'bar', 'baz']; - expect(getAllOtherIdsFn(ids, 'foo')).toEqual(['bar', 'baz']); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/index.ts b/ui/src/app/metadata/resolver/reducer/index.ts deleted file mode 100644 index d7ae921b2..000000000 --- a/ui/src/app/metadata/resolver/reducer/index.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../../app.reducer'; -import * as fromEntity from './entity.reducer'; -import * as fromSearch from './search.reducer'; -import * as fromCopy from './copy.reducer'; -import * as fromDraft from './draft.reducer'; -import * as fromCollection from './collection.reducer'; -import * as fromWizard from '../../../wizard/reducer'; - -import { combineAllFn, getEntityIdsFn, getInCollectionFn, doesExistFn } from '../../domain/domain.util'; -import { getConfigurationSectionsFn } from '../../configuration/reducer/utilities'; - -export interface ResolverState { - entity: fromEntity.EntityState; - copy: fromCopy.CopyState; - search: fromSearch.SearchState; - draft: fromDraft.DraftState; - collection: fromCollection.CollectionState; -} - -export const reducers = { - copy: fromCopy.reducer, - entity: fromEntity.reducer, - collection: fromCollection.reducer, - draft: fromDraft.reducer, - search: fromSearch.reducer -}; - -export interface State extends fromRoot.State { - 'resolver': ResolverState; -} - -export const getResolverState = createFeatureSelector('resolver'); - -export const getCollectionStateFn = (state: ResolverState) => state.collection; -export const getDraftStateFn = (state: ResolverState) => state.draft; -export const getEntityStateFn = (state: ResolverState) => state.entity; -export const getCopyStateFn = (state: ResolverState) => state.copy; -export const getSearchStateFn = (state: ResolverState) => state.search; - -export const getCollectionState = createSelector(getResolverState, getCollectionStateFn); -export const getDraftState = createSelector(getResolverState, getDraftStateFn); -export const getEntityState = createSelector(getResolverState, getEntityStateFn); -export const getCopyState = createSelector(getResolverState, getCopyStateFn); -export const getSearchState = createSelector(getResolverState, getSearchStateFn); - -/* -Entity State -*/ - -export const getEntityIsValid = createSelector(getEntityState, fromEntity.isEntityValid); -export const getEntityIsSaved = createSelector(getEntityState, fromEntity.isEntitySaved); -export const getEntityChanges = createSelector(getEntityState, fromEntity.getChanges); -export const getEntityIsSaving = createSelector(getEntityState, fromEntity.isEntitySaving); -export const getFormStatus = createSelector(getEntityState, fromEntity.getFormStatus); -export const getInvalidEntityForms = createSelector(getEntityState, fromEntity.getInvalidForms); - -/* -Copy State -*/ - -export const getCopy = createSelector(getCopyState, fromCopy.getCopy); -export const getSaving = createSelector(getCopyState, fromCopy.getSaving); -export const getAttributes = createSelector(getCopyState, fromCopy.getCopyAttributes); -export const getSectionsToCopy = createSelector(getCopyState, fromCopy.getCopySections); - -/* -Search State -*/ - -export const getSearchResults = createSelector(getSearchState, fromSearch.getMatches); -export const getSearchQuery = createSelector(getSearchState, fromSearch.getQuery); -export const getSearchLoading = createSelector(getSearchState, fromSearch.getSearching); - -/* -Collection State -*/ - -export const getResolverEntities = createSelector(getCollectionState, fromCollection.selectResolverEntities); -export const getSelectedResolverId = createSelector(getCollectionState, fromCollection.getSelectedResolverId); -export const getResolverIds = createSelector(getCollectionState, fromCollection.selectResolverIds); - -export const getResolverCollection = createSelector(getCollectionState, getResolverIds, fromCollection.selectAllResolvers); -export const getResolverEntityIdCollectionFn = (resolvers) => resolvers.map(r => r.entityId); -export const getResolverEntityIdCollection = createSelector(getResolverCollection, getResolverEntityIdCollectionFn); -export const getSelectedResolver = createSelector(getResolverEntities, getSelectedResolverId, getInCollectionFn); -export const getResolversLoading = createSelector(getCollectionState, fromCollection.getResolversLoading); - - -/* -Draft State -*/ - -export const getDraftEntities = createSelector(getDraftState, fromDraft.selectDraftEntities); -export const getDraftIds = createSelector(getDraftState, fromDraft.selectDraftIds); -export const getDraftCollection = createSelector(getDraftState, getDraftIds, fromDraft.selectAllDrafts); -export const getSelectedDraftId = createSelector(getDraftState, fromDraft.getSelectedDraftId); - -export const getSelectedDraft = createSelector(getDraftEntities, getSelectedDraftId, getInCollectionFn); -export const isSelectedResolverInCollection = createSelector(getResolverIds, getSelectedResolverId, doesExistFn); -export const isSelectedDraftInCollection = createSelector(getDraftIds, getSelectedDraftId, doesExistFn); - -/* -Combine Drafts and Resolvers -*/ - -export const getAllResolvers = createSelector(getDraftCollection, getResolverCollection, combineAllFn); -export const getAllResolverIds = createSelector(getDraftIds, getResolverIds, combineAllFn); - -export const getAllEntityIds = createSelector(getAllResolvers, getEntityIdsFn); -export const getResolverUniqueValidEntityIdsFn = (ids) => [...new Set(ids.filter(id => !!id))]; -export const getValidEntityIds = createSelector(getResolverEntityIdCollection, getResolverUniqueValidEntityIdsFn); - -export const getAllOtherIdsFn = (ids, selected) => ids.filter(id => id !== selected); - -export const getAllOtherIds = createSelector( - getAllResolvers, - getSelectedResolverId, - getAllOtherIdsFn -); - -export const getDraftModelWithChanges = createSelector( - fromWizard.getSchema, - fromWizard.getModel, - getSelectedDraft, - getEntityChanges, - fromWizard.getWizardDefinition, - (schema, wizardModel, selectedDraft, changes, definition) => definition.formatter({ - ...wizardModel, - ...selectedDraft, - ...changes - }) -); - -export const getDraftModelList = createSelector(getDraftModelWithChanges, (model) => [model]); - -export const getResolverConfiguration = createSelector( - getDraftModelList, - fromWizard.getWizardDefinition, - fromWizard.getProcessedSchema, - getConfigurationSectionsFn -); diff --git a/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts deleted file mode 100644 index eefce726d..000000000 --- a/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { reducer } from './search.reducer'; -import * as fromProviderSearch from './search.reducer'; -import { SearchActionTypes, SearchIds, SearchIdsSuccess, SearchIdsError } from '../action/search.action'; - -const snapshot: fromProviderSearch.SearchState = { - matches: [], - query: '', - searching: false -}; - -describe('Resolver -> Search Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - expect(result).toEqual(snapshot); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS} action`, () => { - it('should set properties on the state', () => { - const query = 'foo'; - const result = reducer(snapshot, new SearchIds(query)); - - expect(result).toEqual({ - ...snapshot, - query, - searching: true - }); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS_SUCCESS} action`, () => { - it('should set properties on the state', () => { - const matches = ['foo', 'bar', 'baz']; - const result = reducer(snapshot, new SearchIdsSuccess(matches)); - - expect(result).toEqual({ - ...snapshot, - matches, - searching: false - }); - }); - }); - - describe(`${SearchActionTypes.SEARCH_IDS_ERROR} action`, () => { - it('should set properties on the state', () => { - const result = reducer(snapshot, new SearchIdsError(new Error())); - - expect(result).toEqual({ - ...snapshot, - matches: [], - searching: false - }); - }); - }); - - describe(`getQuery selector function`, () => { - it('should return the query property', () => { - expect(fromProviderSearch.getQuery(snapshot)).toBe(snapshot.query); - }); - }); - describe(`getMatches selector function`, () => { - it('should return the matches property', () => { - expect(fromProviderSearch.getMatches(snapshot)).toBe(snapshot.matches); - }); - }); - describe(`getSearching selector function`, () => { - it('should return the searching property', () => { - expect(fromProviderSearch.getSearching(snapshot)).toBe(snapshot.searching); - }); - }); -}); diff --git a/ui/src/app/metadata/resolver/reducer/search.reducer.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.ts deleted file mode 100644 index e047ea99b..000000000 --- a/ui/src/app/metadata/resolver/reducer/search.reducer.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { SearchActionTypes, SearchActionUnion } from '../action/search.action'; - -export interface SearchState { - query: string; - matches: string[]; - searching: boolean; -} - -export const initialState: SearchState = { - query: '', - matches: [], - searching: false -}; - -export function reducer(state = initialState, action: SearchActionUnion): SearchState { - switch (action.type) { - case SearchActionTypes.SEARCH_IDS: { - return { - ...state, - query: action.payload, - searching: true - }; - } - case SearchActionTypes.SEARCH_IDS_SUCCESS: { - return { - ...state, - searching: false, - matches: action.payload - }; - } - case SearchActionTypes.SEARCH_IDS_ERROR: { - return { - ...state, - searching: false, - matches: [] - }; - } - default: { - return state; - } - } -} - -export const getQuery = (state: SearchState) => state.query; -export const getMatches = (state: SearchState) => state.matches; -export const getSearching = (state: SearchState) => state.searching; diff --git a/ui/src/app/metadata/resolver/resolver.component.ts b/ui/src/app/metadata/resolver/resolver.component.ts deleted file mode 100644 index dee3e3f75..000000000 --- a/ui/src/app/metadata/resolver/resolver.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { LoadResolverRequest } from './action/collection.action'; -import * as fromRoot from '../../app.reducer'; -import * as fromResolver from './reducer'; - -@Component({ - selector: 'metadata-resolver-page', - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` - - `, - styleUrls: [] -}) -export class MetadataResolverPageComponent { - - loading$: Observable = this.store.select(fromResolver.getResolversLoading); - - constructor( - private store: Store - ) { - this.store.dispatch(new LoadResolverRequest()); - } -} diff --git a/ui/src/app/metadata/resolver/resolver.module.ts b/ui/src/app/metadata/resolver/resolver.module.ts deleted file mode 100644 index 362d67485..000000000 --- a/ui/src/app/metadata/resolver/resolver.module.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { NgbDropdownModule, NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; - -import { NewResolverComponent } from './container/new-resolver.component'; -import { UploadResolverComponent } from './container/upload-resolver.component'; -import { CopyResolverComponent } from './container/copy-resolver.component'; -import { SharedModule } from '../../shared/shared.module'; -import { SearchIdEffects } from './effect/search.effect'; -import * as fromResolver from './reducer'; -import { ConfirmCopyComponent } from './container/confirm-copy.component'; -import { CopyIsSetGuard } from './guard/copy-isset.guard'; -import { CopyResolverEffects } from './effect/copy.effect'; -import { DomainModule } from '../domain/domain.module'; -import { ResolverWizardComponent } from './container/resolver-wizard.component'; -import { ResolverCollectionEffects } from './effect/collection.effects'; -import { DraftCollectionEffects } from './effect/draft-collection.effects'; -import { WizardEffects } from './effect/wizard.effect'; -import { I18nModule } from '../../i18n/i18n.module'; -import { MetadataSourceWizard } from '../domain/model/wizards/metadata-source-wizard'; -import { METADATA_SOURCE_WIZARD, METADATA_SOURCE_EDITOR } from './wizard-definition'; -import { EntityEffects } from './effect/entity.effect'; -import { ResolverWizardStepComponent } from './container/resolver-wizard-step.component'; -import { WizardModule } from '../../wizard/wizard.module'; -import { FormModule } from '../../schema-form/schema-form.module'; -import { ResolverEditComponent } from './container/resolver-edit.component'; -import { ResolverEditStepComponent } from './container/resolver-edit-step.component'; -import { ResolverSelectComponent } from './container/resolver-select.component'; -import { MetadataSourceEditor } from '../domain/model/wizards/metadata-source-editor'; -import { FinishFormComponent } from './component/finish-form.component'; -import { ProviderFormFragmentComponent } from './component/provider-form-fragment.component'; -import { MetadataResolverPageComponent } from './resolver.component'; -import { MetadataConfigurationModule } from '../configuration/configuration.module'; - -@NgModule({ - declarations: [ - NewResolverComponent, - UploadResolverComponent, - CopyResolverComponent, - ConfirmCopyComponent, - ResolverEditComponent, - ResolverEditStepComponent, - ResolverSelectComponent, - ResolverWizardComponent, - ResolverWizardStepComponent, - FinishFormComponent, - ProviderFormFragmentComponent, - MetadataResolverPageComponent - ], - entryComponents: [], - imports: [ - DomainModule, - SharedModule, - HttpClientModule, - CommonModule, - RouterModule, - ReactiveFormsModule, - FormsModule, - NgbDropdownModule, - I18nModule, - WizardModule, - FormModule, - NgbPopoverModule, - NgbModalModule, - MetadataConfigurationModule - ], - exports: [], - providers: [] -}) -export class ResolverModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootResolverModule, - providers: [ - CopyIsSetGuard - ] - }; - } -} - -@NgModule({ - imports: [ - ResolverModule, - StoreModule.forFeature('resolver', fromResolver.reducers), - EffectsModule.forFeature([ - SearchIdEffects, - CopyResolverEffects, - ResolverCollectionEffects, - DraftCollectionEffects, - WizardEffects, - EntityEffects - ]) - ], - providers: [ - { provide: METADATA_SOURCE_WIZARD, useClass: MetadataSourceWizard }, - { provide: METADATA_SOURCE_EDITOR, useClass: MetadataSourceEditor } - ] -}) -export class RootResolverModule { } diff --git a/ui/src/app/metadata/resolver/resolver.routing.ts b/ui/src/app/metadata/resolver/resolver.routing.ts deleted file mode 100644 index efd3c6b72..000000000 --- a/ui/src/app/metadata/resolver/resolver.routing.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Routes } from '@angular/router'; - -import { ResolverWizardComponent } from './container/resolver-wizard.component'; - -import { NewResolverComponent } from './container/new-resolver.component'; -import { UploadResolverComponent } from './container/upload-resolver.component'; -import { CopyResolverComponent } from './container/copy-resolver.component'; -import { ConfirmCopyComponent } from './container/confirm-copy.component'; -import { CopyIsSetGuard } from './guard/copy-isset.guard'; - -import { CanDeactivateGuard } from '../../core/service/can-deactivate.guard'; -import { ResolverWizardStepComponent } from './container/resolver-wizard-step.component'; -import { ResolverEditComponent } from './container/resolver-edit.component'; -import { ResolverEditStepComponent } from './container/resolver-edit-step.component'; -import { ResolverSelectComponent } from './container/resolver-select.component'; -import { MetadataResolverPageComponent } from './resolver.component'; -import { IndexResolver } from '../configuration/service/index-resolver.service'; - -export const ResolverRoutes: Routes = [ - { - path: 'resolver', - component: MetadataResolverPageComponent, - children: [ - { - path: 'new', - component: NewResolverComponent, - children: [ - { path: '', redirectTo: 'blank/common', pathMatch: 'prefix' }, - { - path: 'blank/:index', - component: ResolverWizardComponent, - resolve: [IndexResolver], - canDeactivate: [ - CanDeactivateGuard - ], - children: [ - { - path: '', - component: ResolverWizardStepComponent, - data: { title: `Create Metadata Source`, subtitle: true }, - resolve: [] - } - ] - }, - { - path: 'upload', - component: UploadResolverComponent, - canDeactivate: [], - data: { title: `Upload Metadata Source` } - }, - { - path: 'copy', - component: CopyResolverComponent, - canDeactivate: [], - data: { title: `Copy Metadata Source` } - } - ] - }, - { - path: 'new/copy/confirm', - component: ConfirmCopyComponent, - canActivate: [CopyIsSetGuard], - data: { title: `Confirm Metadata Source Copy` } - }, - { - path: ':id', - component: ResolverSelectComponent, - children: [ - { - path: 'edit', - component: ResolverEditComponent, - children: [ - { path: '', redirectTo: 'common', pathMatch: 'prefix' }, - { - path: ':index', - resolve: [IndexResolver], - component: ResolverEditStepComponent, - data: { title: `Edit Metadata Source`, subtitle: true } - } - ], - canDeactivate: [ - CanDeactivateGuard - ] - } - ] - } - ] - } -]; diff --git a/ui/src/app/metadata/resolver/wizard-definition.ts b/ui/src/app/metadata/resolver/wizard-definition.ts deleted file mode 100644 index 2bd4c8122..000000000 --- a/ui/src/app/metadata/resolver/wizard-definition.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { InjectionToken } from '@angular/core'; -import { Wizard } from '../../wizard/model'; -import { MetadataResolver } from '../domain/model'; - -export const METADATA_SOURCE_WIZARD = new InjectionToken>('METADATA_SOURCE_WIZARD'); -export const METADATA_SOURCE_EDITOR = new InjectionToken>('METADATA_SOURCE_EDITOR'); diff --git a/ui/src/app/notification/action/notification.action.ts b/ui/src/app/notification/action/notification.action.ts deleted file mode 100644 index 3e5ada658..000000000 --- a/ui/src/app/notification/action/notification.action.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Notification } from '../model/notification'; - -export const ADD_NOTIFICATION = '[Notification] Add Notification'; -export const CLEAR_NOTIFICATION = '[Metadata Draft] Clear Notification'; - -export class AddNotification implements Action { - readonly type = ADD_NOTIFICATION; - - constructor(public payload: Notification) { } -} - -export class ClearNotification implements Action { - readonly type = CLEAR_NOTIFICATION; - - constructor(public payload: Notification) { } -} - -export type Actions = - | AddNotification - | ClearNotification; diff --git a/ui/src/app/notification/component/notification-item.component.html b/ui/src/app/notification/component/notification-item.component.html deleted file mode 100644 index 235941254..000000000 --- a/ui/src/app/notification/component/notification-item.component.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-item.component.scss b/ui/src/app/notification/component/notification-item.component.scss deleted file mode 100644 index ba091474a..000000000 --- a/ui/src/app/notification/component/notification-item.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - word-wrap: break-word; -} \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-item.component.spec.ts b/ui/src/app/notification/component/notification-item.component.spec.ts deleted file mode 100644 index 35d962da7..000000000 --- a/ui/src/app/notification/component/notification-item.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromNotifications from '../reducer'; -import { NotificationItemComponent } from './notification-item.component'; -import { Notification, NotificationType } from '../model/notification'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -describe('Notification List Component', () => { - let fixture: ComponentFixture; - let instance: NotificationItemComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - 'notifications': combineReducers(fromNotifications.reducers), - }), - MockI18nModule - ], - declarations: [ - NotificationItemComponent - ], - }); - - fixture = TestBed.createComponent(NotificationItemComponent); - instance = fixture.componentInstance; - instance.notification = new Notification(); - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('timeout', () => { - it('should timeout after the given number of seconds', fakeAsync(() => { - spyOn(instance.clear, 'emit'); - instance.timerCallback(); - expect(instance.clear.emit).toHaveBeenCalled(); - })); - - it('should call timeout after the given number of seconds', fakeAsync(() => { - spyOn(window, 'setTimeout'); - fixture = TestBed.createComponent(NotificationItemComponent); - instance = fixture.componentInstance; - instance.notification = new Notification(); - fixture.detectChanges(); - expect(window.setTimeout).toHaveBeenCalledWith(instance.timerCallback, instance.notification.timeout); - })); - - it('should NOT clear if 0 is passed as the timeout of the notification', async () => { - spyOn(window, 'setTimeout'); - instance.notification = new Notification(NotificationType.Info, 'foo', 0); - fixture.detectChanges(); - expect(window.setTimeout).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/ui/src/app/notification/component/notification-item.component.ts b/ui/src/app/notification/component/notification-item.component.ts deleted file mode 100644 index b080724e5..000000000 --- a/ui/src/app/notification/component/notification-item.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core'; -import { Notification } from '../model/notification'; -import { LiveAnnouncer } from '@angular/cdk/a11y'; - -@Component({ - selector: 'notification-item', - templateUrl: './notification-item.component.html', - styleUrls: ['./notification-item.component.scss'] -}) -export class NotificationItemComponent implements OnInit { - @Input() notification: Notification; - @Output() clear: EventEmitter = new EventEmitter(); - readonly timerCallback = () => this.clear.emit(this.notification); - constructor( - private announce: LiveAnnouncer - ) {} - - ngOnInit(): void { - if (this.notification.timeout > 0) { - setTimeout(this.timerCallback, this.notification.timeout); - } - - this.announce.announce(`Error: ${this.notification.body}`); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/notification/component/notification-list.component.html b/ui/src/app/notification/component/notification-list.component.html deleted file mode 100644 index 5b6e7d621..000000000 --- a/ui/src/app/notification/component/notification-list.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
    -
  • - -
  • -
-
\ No newline at end of file diff --git a/ui/src/app/notification/component/notification-list.component.scss b/ui/src/app/notification/component/notification-list.component.scss deleted file mode 100644 index f90ee0ae8..000000000 --- a/ui/src/app/notification/component/notification-list.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -:host { - & > .position-fixed { - bottom: 0px; - right: 0px; - z-index: 2000; - } -} \ No newline at end of file diff --git a/ui/src/app/notification/component/notification-list.component.spec.ts b/ui/src/app/notification/component/notification-list.component.spec.ts deleted file mode 100644 index a9c0db081..000000000 --- a/ui/src/app/notification/component/notification-list.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import * as fromNotifications from '../reducer'; -import { NotificationListComponent } from './notification-list.component'; -import { NotificationItemComponent } from './notification-item.component'; -import { Notification } from '../model/notification'; - -describe('Notification List Component', () => { - let fixture: ComponentFixture; - let instance: NotificationListComponent; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - 'notifications': combineReducers(fromNotifications.reducers), - }) - ], - declarations: [ - NotificationListComponent, - NotificationItemComponent - ], - }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(NotificationListComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('clear function', () => { - it('should dispatch a clear action to the store', () => { - instance.clear(new Notification()); - expect(store.dispatch).toHaveBeenCalled(); - }); - }); - - describe('sorter function', () => { - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - b.createdAt = Date.now() + 100; - expect(instance.sorter(a, b)).toBe(-1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - a.createdAt = Date.now() + 100; - expect(instance.sorter(a, b)).toBe(1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - expect(instance.sorter(a, b)).toBe(0); - }); - }); - - describe('limit function', () => { - it('should return true if index is > 5', () => { - expect(instance.filter(new Notification(), 4)).toBe(true); - }); - it('should return true if index is <= 5', () => { - expect(instance.filter(new Notification(), 5)).toBe(false); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - a.createdAt = Date.now() + 1; - expect(instance.sorter(a, b)).toBe(1); - }); - it('should return -1 if the first parameter was created first', () => { - const a = new Notification(); - const b = new Notification(); - expect(instance.sorter(a, b)).toBe(0); - }); - }); -}); diff --git a/ui/src/app/notification/component/notification-list.component.ts b/ui/src/app/notification/component/notification-list.component.ts deleted file mode 100644 index 38531da51..000000000 --- a/ui/src/app/notification/component/notification-list.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component } from '@angular/core'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromNotifications from '../reducer'; -import { ClearNotification } from '../action/notification.action'; -import { Notification } from '../model/notification'; - -@Component({ - selector: 'notification-list', - templateUrl: './notification-list.component.html', - styleUrls: ['./notification-list.component.scss'] -}) -export class NotificationListComponent { - notifications$: Observable; - - max = 5; - - constructor( - private store: Store - ) { - this.notifications$ = this.store - .select(fromNotifications.getNotifications) - .pipe( - map(notifications => notifications.sort(this.sorter)), - map(notifications => notifications.filter(this.filter)) - ); - } - - sorter(a: Notification, b: Notification): number { - return(a.createdAt < b.createdAt) ? - 1 : (a.createdAt > b.createdAt) ? 1 : 0; - } - - filter(n: Notification, index): boolean { - return index < 5; - } - - clear(event: Notification): void { - this.store.dispatch(new ClearNotification(event)); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/notification/model/notification.ts b/ui/src/app/notification/model/notification.ts deleted file mode 100644 index 4c7b237cd..000000000 --- a/ui/src/app/notification/model/notification.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class Notification { - createdAt: number = Date.now(); - constructor( - public type: NotificationType = NotificationType.Info, - public body: string = '', - public timeout: number = 8000, - public closeable: boolean = true - ) {} -} - -export enum NotificationType { - Success = 'alert-success', - Info = 'alert-info', - Warning = 'alert-warning', - Danger = 'alert-danger' -} diff --git a/ui/src/app/notification/notification.module.ts b/ui/src/app/notification/notification.module.ts deleted file mode 100644 index 24b175df7..000000000 --- a/ui/src/app/notification/notification.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; - -import { reducers } from './reducer'; -import { NotificationListComponent } from './component/notification-list.component'; -import { NotificationItemComponent } from './component/notification-item.component'; - -const COMPONENTS = [ - NotificationListComponent, - NotificationItemComponent -]; - -@NgModule({ - declarations: COMPONENTS, - entryComponents: COMPONENTS, - imports: [ - CommonModule, - StoreModule.forFeature('notifications', reducers) - ], - exports: COMPONENTS, - providers: [] -}) -export class NotificationModule {} - diff --git a/ui/src/app/notification/reducer/index.ts b/ui/src/app/notification/reducer/index.ts deleted file mode 100644 index f8458bb12..000000000 --- a/ui/src/app/notification/reducer/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromNotifications from './notification.reducer'; -import * as fromRoot from '../../core/reducer'; - -export interface State extends fromRoot.State { - notifications: NotificationState; -} - -export interface NotificationState { - notifications: fromNotifications.NotificationState; -} - -export const reducers = { - notifications: fromNotifications.reducer -}; - -export const getNotificationState = createFeatureSelector('notifications'); -export const getNotificationEntityState = createSelector(getNotificationState, (state: NotificationState) => state.notifications); -export const getNotifications = createSelector( - getNotificationEntityState, - (state: fromNotifications.NotificationState) => state.notifications -); diff --git a/ui/src/app/notification/reducer/notification.reducer.spec.ts b/ui/src/app/notification/reducer/notification.reducer.spec.ts deleted file mode 100644 index 50f43c869..000000000 --- a/ui/src/app/notification/reducer/notification.reducer.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { reducer } from './notification.reducer'; -import * as fromNotifications from './notification.reducer'; -import * as notificationActions from '../action/notification.action'; -import { Notification } from '../model/notification'; - -let notifications: Notification[] = [ - new Notification(), - new Notification() -], -snapshot: fromNotifications.NotificationState = { - notifications: [] -}; - -describe('Notification Reducer', () => { - const initialState: fromNotifications.NotificationState = { - notifications: [] - }; - - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(undefined, {} as any); - - expect(result).toEqual(initialState); - }); - }); - - describe('create notification action', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.AddNotification(n); - const result = reducer(initialState, action); - expect(result).toEqual( - Object.assign({}, initialState, { - notifications: [n] - }) - ); - }); - }); - - describe('remove notification action', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.ClearNotification(n); - const state: fromNotifications.NotificationState = { - notifications: [n] - }; - const result = reducer(state, action); - expect(result).toEqual({notifications: []}); - }); - }); - - describe('get notifications selector', () => { - it('should update the status when a provider is saved', () => { - const n = new Notification(); - const action = new notificationActions.ClearNotification(n); - const state: fromNotifications.NotificationState = { - notifications: [n] - }; - const result = reducer(state, action); - expect(fromNotifications.getNotifications(state)).toEqual(state.notifications); - }); - }); -}); diff --git a/ui/src/app/notification/reducer/notification.reducer.ts b/ui/src/app/notification/reducer/notification.reducer.ts deleted file mode 100644 index 2a6ddbdde..000000000 --- a/ui/src/app/notification/reducer/notification.reducer.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { createSelector } from '@ngrx/store'; -import { Notification } from '../model/notification'; -import * as actions from '../action/notification.action'; - -export interface NotificationState { - notifications: Notification[]; -} - -export const initialState: NotificationState = { - notifications: [] -}; - -export function reducer(state = initialState, action: actions.Actions): NotificationState { - switch (action.type) { - case actions.ADD_NOTIFICATION: { - return { - notifications: [ - ...state.notifications, - action.payload - ] - }; - } - case actions.CLEAR_NOTIFICATION: { - return { - notifications: [ - ...state.notifications.filter(n => n !== action.payload) - ] - }; - } - default: { - return state; - } - } -} - -export const getNotifications = (state: NotificationState) => state.notifications; diff --git a/ui/src/app/schema-form/model/messages.ts b/ui/src/app/schema-form/model/messages.ts deleted file mode 100644 index 6d6fa61fd..000000000 --- a/ui/src/app/schema-form/model/messages.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const HARD_CODED_REQUIRED_MSG = RegExp('Missing required property'); - -export const REQUIRED_MSG_OVERRIDE = 'message.required'; \ No newline at end of file diff --git a/ui/src/app/schema-form/model/one-of.ts b/ui/src/app/schema-form/model/one-of.ts deleted file mode 100644 index 7a33306e4..000000000 --- a/ui/src/app/schema-form/model/one-of.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface OneOf { - enum: string[]; - description: string; -} diff --git a/ui/src/app/schema-form/registry.ts b/ui/src/app/schema-form/registry.ts deleted file mode 100644 index 428d2d7fa..000000000 --- a/ui/src/app/schema-form/registry.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { BooleanRadioComponent } from './widget/boolean-radio/boolean-radio.component'; -import { FieldsetComponent } from './widget/fieldset/fieldset.component'; -import { CustomStringComponent } from './widget/string/string.component'; - -import { WidgetRegistry } from 'ngx-schema-form'; - -import { ButtonWidget } from 'ngx-schema-form'; -import { FileWidget } from 'ngx-schema-form'; -import { RangeWidget } from 'ngx-schema-form'; -import { CustomSelectComponent } from './widget/select/select.component'; -import { DatalistComponent } from './widget/datalist/datalist.component'; -import { CustomCheckboxComponent } from './widget/check/checkbox.component'; -import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; -import { CustomArrayComponent } from './widget/array/array.component'; -import { CustomIntegerComponent } from './widget/number/number.component'; -import { FilterTargetComponent } from './widget/filter-target/filter-target.component'; -import { ChecklistComponent } from './widget/check/checklist.component'; -import { IconButtonComponent } from './widget/button/icon-button.component'; -import { CustomObjectWidget } from './widget/object/object.component'; -import { CustomRadioComponent } from './widget/radio/radio.component'; -import { InlineObjectListComponent } from './widget/array/inline-obj-list.component'; -import { InlineObjectComponent } from './widget/object/inline-obj.component'; -import { CustomFloatComponent } from './widget/number/float.component'; -import { Injectable } from "@angular/core"; - -@Injectable() -export class CustomWidgetRegistry extends WidgetRegistry { - constructor() { - super(); - - /* Custom */ - this.register('string', CustomStringComponent); - this.register('search', CustomStringComponent); - this.register('tel', CustomStringComponent); - this.register('url', CustomStringComponent); - this.register('email', CustomStringComponent); - this.register('password', CustomStringComponent); - this.register('color', CustomStringComponent); - this.register('date', CustomStringComponent); - this.register('date-time', CustomStringComponent); - this.register('time', CustomStringComponent); - - this.register('boolean-radio', BooleanRadioComponent); - - this.register('fieldset', FieldsetComponent); - this.register('object', CustomObjectWidget); - this.register('inline-obj-list', InlineObjectListComponent); - this.register('inline-obj', InlineObjectComponent); - - this.register('array', CustomArrayComponent); - this.register('checklist', ChecklistComponent); - - this.register('select', CustomSelectComponent); - this.register('boolean', CustomCheckboxComponent); - this.register('checkbox', CustomCheckboxComponent); - - this.register('textarea', CustomTextAreaComponent); - - this.register('integer', CustomIntegerComponent); - this.register('number', CustomIntegerComponent); - this.register('float', CustomFloatComponent); - - this.register('datalist', DatalistComponent); - - this.register('filter-target', FilterTargetComponent); - - this.register('icon-button', IconButtonComponent); - - this.register('radio', CustomRadioComponent); - - /* NGX-Form */ - this.register('range', RangeWidget); - - this.register('file', FileWidget); - this.register('button', ButtonWidget); - - this.setDefaultWidget(CustomStringComponent); - } -} diff --git a/ui/src/app/schema-form/schema-form.module.ts b/ui/src/app/schema-form/schema-form.module.ts deleted file mode 100644 index 034b895c1..000000000 --- a/ui/src/app/schema-form/schema-form.module.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { SchemaFormModule } from 'ngx-schema-form'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { BooleanRadioComponent } from './widget/boolean-radio/boolean-radio.component'; -import { SchemaService } from './service/schema.service'; -import { FieldsetComponent } from './widget/fieldset/fieldset.component'; -import { CustomStringComponent } from './widget/string/string.component'; -import { NgbPopoverModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { SharedModule } from '../shared/shared.module'; -import { CustomSelectComponent } from './widget/select/select.component'; -import { DatalistComponent } from './widget/datalist/datalist.component'; -import { CustomCheckboxComponent } from './widget/check/checkbox.component'; -import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; -import { CustomArrayComponent } from './widget/array/array.component'; -import { CustomIntegerComponent } from './widget/number/number.component'; -import { CustomFloatComponent } from './widget/number/float.component'; -import { FilterTargetComponent } from './widget/filter-target/filter-target.component'; -import { ChecklistComponent } from './widget/check/checklist.component'; -import { IconButtonComponent } from './widget/button/icon-button.component'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomObjectWidget } from './widget/object/object.component'; -import { CustomRadioComponent } from './widget/radio/radio.component'; -import { InlineObjectListComponent } from './widget/array/inline-obj-list.component'; -import { InlineObjectComponent } from './widget/object/inline-obj.component'; - -export const COMPONENTS = [ - BooleanRadioComponent, - FieldsetComponent, - CustomStringComponent, - CustomSelectComponent, - DatalistComponent, - CustomCheckboxComponent, - CustomTextAreaComponent, - CustomArrayComponent, - CustomIntegerComponent, - CustomFloatComponent, - FilterTargetComponent, - ChecklistComponent, - IconButtonComponent, - CustomRadioComponent, - CustomObjectWidget, - InlineObjectListComponent, - InlineObjectComponent -]; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - NgbPopoverModule, - NgbDropdownModule, - SharedModule, - I18nModule, - SchemaFormModule.forRoot() - ], - declarations: COMPONENTS, - entryComponents: COMPONENTS, - exports: [ - ...COMPONENTS, - SchemaFormModule, - SharedModule - ], -}) -export class FormModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootFormModule, - providers: [ - SchemaService - ] - }; -} -} - -@NgModule({ - imports: [], -}) -export class RootFormModule { } diff --git a/ui/src/app/schema-form/service/schema.service.spec.ts b/ui/src/app/schema-form/service/schema.service.spec.ts deleted file mode 100644 index eac84cd95..000000000 --- a/ui/src/app/schema-form/service/schema.service.spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { TestBed, inject } from '@angular/core/testing'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { HttpClientModule } from '@angular/common/http'; -import { SchemaService } from './schema.service'; - -describe(`Schema Service`, () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - HttpClientTestingModule - ], - providers: [ - SchemaService - ] - }); - }); - - describe('isRequired method', () => { - it(`should return false if no property is provided`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired(null)).toBe(false); - })); - it(`should return false if no properties are defined`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { schema: {} }, - path: '' - })).toBe(false); - })); - - it(`should return true if the property is required`, inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { schema: { - properties: { - foo: { - type: 'string' - } - }, - required: ['foo'] - } }, - path: '/foo' - })).toBe(true); - })); - - it(`should return true if the property is currently required based on anyOf`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [ true ] } - }, - required: [ 'bar' ] - }, - { - properties: { - foo: { enum: [ false ] } - } - } - ] - }, - value: { foo: true } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if the property is NOT currently required based on anyOf`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: { foo: false } - }, - path: '/bar' - })).toBe(false); - }) - ); - - it(`should return false if the property is NOT currently in any values`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: {} - }, - path: '/bar' - })).toBe(false); - }) - ); - - it(`should return true if dependant on multiple values and any is true`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - anyOf: [ - { - properties: { - foo: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - baz: { enum: [true] } - }, - required: ['bar'] - }, - { - properties: { - foo: { enum: [false] } - } - } - ] - }, - value: { - foo: true, - baz: true - } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if dependency is active`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - dependencies: { - foo: { required: ['bar', 'baz'] }, - bar: { required: ['foo', 'baz'] }, - baz: { required: ['foo', 'bar'] } - } - }, - value: { - foo: 'abcdef' - } - }, - path: '/bar' - })).toBe(true); - }) - ); - - it(`should return true if the property has an active dependency`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - }, - dependencies: { - foo: { required: ['bar', 'baz'] }, - bar: { required: ['foo', 'baz'] }, - baz: { required: ['foo', 'bar'] } - } - }, - value: { - foo: 'abc', - bar: '123' - } - }, - path: '/foo' - })).toBe(true); - }) - ); - - it(`should return false if no dependencies are defined`, - inject([SchemaService], (service: SchemaService) => { - expect(service.isRequired({ - parent: { - schema: { - properties: { - foo: { type: 'string' }, - bar: { type: 'string' }, - baz: { type: 'string' } - } - }, - value: { - foo: true, - baz: true - } - }, - path: '/bar' - })).toBe(false); - }) - ); - }); - - describe('getRequiredDependencies method', () => { - it('should return the provided result if an array', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies(['foo', 'bar'])).toEqual(['foo', 'bar']); - })); - - it('should return the content of the required attribute if provided', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies({required: ['foo', 'bar'] })).toEqual(['foo', 'bar']); - })); - - it('should return an empty array if not provided with required property', inject([SchemaService], (service: SchemaService) => { - expect(service.getRequiredDependencies({ foo: 'bar' })).toEqual([]); - })); - }); -}); diff --git a/ui/src/app/schema-form/service/schema.service.ts b/ui/src/app/schema-form/service/schema.service.ts deleted file mode 100644 index 0e5905a8a..000000000 --- a/ui/src/app/schema-form/service/schema.service.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -@Injectable() -export class SchemaService { - - constructor( - private http: HttpClient - ) { } - - get(path: string): Observable { - return this.http.get(`${path}`); - } - - isRequired(formProperty: any): boolean { - let required = false; - if (!formProperty || !formProperty.parent) { - return false; - } - - let requiredFields = formProperty.parent.schema.required || []; - let fieldPath = formProperty.path; - let controlName = fieldPath.substr(fieldPath.lastIndexOf('/') + 1); - required = requiredFields.indexOf(controlName) > -1; - - if (!required) { - const conditions = formProperty.parent.schema.anyOf || []; - const values = formProperty.parent.value; - const currentConditions = conditions.filter(condition => - 'properties' in condition ? Object - .keys(condition.properties) - .some( - key => values.hasOwnProperty(key) && condition.properties[key].enum ? - condition.properties[key].enum[0] === values[key] : false - ) - : false - ); - currentConditions.forEach(el => { - requiredFields = el.required || []; - required = !required ? requiredFields.indexOf(controlName) > -1 : required; - }); - } - - if (!required && formProperty.parent instanceof Object) { - const parent = formProperty.parent; - const dependencies = parent.schema.dependencies; - if (dependencies) { - const isDependencyOf = Object.keys(dependencies).filter(d => { - let dep = dependencies[d]; - return this.getRequiredDependencies(dep); - }); - const hasActiveDependencies = dependencies.hasOwnProperty(controlName) && - this.getRequiredDependencies(dependencies[controlName]).filter( - d => parent.value.hasOwnProperty(d) - ); - const isRequired = isDependencyOf.some(d => parent.value.hasOwnProperty(d) && !!parent.value[d]); - required = isRequired || !!hasActiveDependencies.length; - } - } - - return required; - } - - getRequiredDependencies(dep: any): string[] { - return (dep instanceof Array) ? dep : dep.hasOwnProperty('required') ? dep.required : []; - } -} diff --git a/ui/src/app/schema-form/widget/array/array.component.html b/ui/src/app/schema-form/widget/array/array.component.html deleted file mode 100644 index 84a5a1e9b..000000000 --- a/ui/src/app/schema-form/widget/array/array.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
- -    - -   - - - - - - , - {{ error.message }} - - -
-
    -
  • -
    - - - -
    - -
    -
    - -
    -
    - - - -   - - - - (default) - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
  • -
- - {{ schema.description }} - -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/array/array.component.ts b/ui/src/app/schema-form/widget/array/array.component.ts deleted file mode 100644 index 82a089635..000000000 --- a/ui/src/app/schema-form/widget/array/array.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ArrayWidget } from 'ngx-schema-form'; -import { map } from 'rxjs/operators'; -import { Observable, Subscription } from 'rxjs'; -import { FormProperty } from 'ngx-schema-form/lib/model/formproperty'; - -export interface FormError { - code: string; - description: string; - message: string; - params?: any[]; - path: string; - schemaId?: any; -} - -@Component({ - selector: 'array-component', - templateUrl: `./array.component.html` -}) -export class CustomArrayComponent extends ArrayWidget implements AfterViewInit { - errors$: Observable; - hasErrors$: Observable; - hasErrorSub: Subscription; - - messages = { - ARRAY_UNIQUE: 'message.array-items-must-be-unique' - }; - - ngAfterViewInit(): void { - this.errors$ = this.formProperty.errorsChanges.pipe( - map(errors => errors ? - errors.filter(err => err.code !== 'UNRESOLVABLE_REFERENCE').reduce((coll, err) => { - coll[err.code] = err; - return coll; - }, {}) : {}), - map(collection => Object.values(collection)) - ); - - this.hasErrors$ = this.errors$.pipe(map(errors => !!errors.length)); - } - - removeItem(item: FormProperty = null): void { - this.formProperty.properties = (this.formProperty.properties).filter(i => i !== item); - this.formProperty.updateValueAndValidity(false, true); - } - - addItem(): void { - super.addItem(); - } - - getListType(property: any): string { - return property.properties.length ? property.properties[0].type : null; - } -} diff --git a/ui/src/app/schema-form/widget/array/inline-obj-list.component.html b/ui/src/app/schema-form/widget/array/inline-obj-list.component.html deleted file mode 100644 index 2afe19994..000000000 --- a/ui/src/app/schema-form/widget/array/inline-obj-list.component.html +++ /dev/null @@ -1,56 +0,0 @@ -
-
- -    - -   - - - - - - , - {{ error.message }} - - -
-
    -
  • -
    -
    -
    -
    - - -   - - - - - (default) - - - - -
    -
    -
    - -
    -
    -
    -
    -
  • -
- - {{ schema.description }} - -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts b/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts deleted file mode 100644 index 0062cd0f3..000000000 --- a/ui/src/app/schema-form/widget/array/inline-obj-list.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { CustomArrayComponent } from './array.component'; - -/* tslint:disable */ -@Component({ - selector: 'inline-obj-list', - templateUrl: `./inline-obj-list.component.html` -}) -export class InlineObjectListComponent extends CustomArrayComponent { } diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html deleted file mode 100644 index 217dd94ee..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
- - {{ schema.description }} -
- -
- - -
-
-
- -
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss deleted file mode 100644 index 333cbb84e..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - .control-label { - display: block; - } -} diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.spec.ts b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.spec.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts b/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts deleted file mode 100644 index d4ad09d6f..000000000 --- a/ui/src/app/schema-form/widget/boolean-radio/boolean-radio.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; -import { ControlWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'boolean-radio', - templateUrl: './boolean-radio.component.html', - styleUrls: ['./boolean-radio.component.scss'] -}) -export class BooleanRadioComponent extends ControlWidget implements AfterViewInit { - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly) { - this.control.disable(); - } else { - this.control.enable(); - } - } -} diff --git a/ui/src/app/schema-form/widget/button/icon-button.component.html b/ui/src/app/schema-form/widget/button/icon-button.component.html deleted file mode 100644 index 7ed1f4f3b..000000000 --- a/ui/src/app/schema-form/widget/button/icon-button.component.html +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/schema-form/widget/button/icon-button.component.ts b/ui/src/app/schema-form/widget/button/icon-button.component.ts deleted file mode 100644 index f023330b6..000000000 --- a/ui/src/app/schema-form/widget/button/icon-button.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - Component, AfterViewInit, ChangeDetectorRef -} from '@angular/core'; -import { ButtonWidget, ActionRegistry } from 'ngx-schema-form'; - -@Component({ - selector: 'icon-button', - templateUrl: `./icon-button.component.html` -}) -export class IconButtonComponent extends ButtonWidget implements AfterViewInit { - - visible = false; - - action = (e) => {}; - - constructor( - private actionRegistry: ActionRegistry, - private changeDetector: ChangeDetectorRef - ) { - super(); - } - - ngAfterViewInit(): void { - this.action = (e) => { - let action = this.actionRegistry.get(this.button.id); - if (this.button.id && action) { - action(this.formProperty, this.button.parameters); - } - e.preventDefault(); - }; - - this.visible = !!this.actionRegistry.get(this.button.id); - this.changeDetector.detectChanges(); - } -} diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.html b/ui/src/app/schema-form/widget/check/checkbox.component.html deleted file mode 100644 index 538251826..000000000 --- a/ui/src/app/schema-form/widget/check/checkbox.component.html +++ /dev/null @@ -1,38 +0,0 @@ -
- -
-
- - -
-
- -
-
-
- -
- -
-
-
diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.ts b/ui/src/app/schema-form/widget/check/checkbox.component.ts deleted file mode 100644 index ebb784d71..000000000 --- a/ui/src/app/schema-form/widget/check/checkbox.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -import { CheckboxWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'checkbox-component', - templateUrl: `./checkbox.component.html` -}) -export class CustomCheckboxComponent extends CheckboxWidget { } diff --git a/ui/src/app/schema-form/widget/check/checklist.component.html b/ui/src/app/schema-form/widget/check/checklist.component.html deleted file mode 100644 index ed7ac4fe6..000000000 --- a/ui/src/app/schema-form/widget/check/checklist.component.html +++ /dev/null @@ -1,57 +0,0 @@ -
- - {{ schema.title }} - - - - - - - - - - - - - - - - - - - - - - -
Attribute NameYes
{{ attr.label | translate }} -
-
- - -
-
-
Check All Attributes - -
Clear All Attributes - -
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/check/checklist.component.ts b/ui/src/app/schema-form/widget/check/checklist.component.ts deleted file mode 100644 index e7a056690..000000000 --- a/ui/src/app/schema-form/widget/check/checklist.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { ArrayWidget } from 'ngx-schema-form'; -import { AttributesService } from '../../../metadata/domain/service/attributes.service'; -import { Observable, of, Subscription } from 'rxjs'; - -/* istanbul ignore next */ -@Component({ - selector: 'checklist-component', - templateUrl: `./checklist.component.html` -}) -export class ChecklistComponent extends ArrayWidget implements AfterViewInit, OnDestroy { - checked: any = {}; - currentData: { key: string, label: string }[]; - sub: Subscription; - - constructor( - private attributes: AttributesService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.formProperty.value.forEach(val => this.checked[val] = true); - - this.sub = this.data.subscribe(d => this.currentData = d); - } - - ngOnDestroy(): void { - this.sub.unsubscribe(); - } - - private commitValue(): void { - this.formProperty.setValue(Object.keys(this.checked), false); - } - - get data(): Observable<{ key: string, label: string }[]> { - return this.schema.widget.data ? of(this.schema.widget.data) : this.attributes.query(this.schema.widget.dataUrl); - } - - onCheck(value) { - if (!this.checked[value]) { - this.checked[value] = true; - } else { - delete this.checked[value]; - } - this.commitValue(); - } - - onCheckAll(): void { - this.currentData.forEach(attr => this.checked[attr.key] = true); - this.commitValue(); - } - onCheckNone(event: Event | null = null): void { - this.currentData.forEach(attr => { - delete this.checked[attr.key]; - }); - this.commitValue(); - } -} diff --git a/ui/src/app/schema-form/widget/datalist/datalist.component.html b/ui/src/app/schema-form/widget/datalist/datalist.component.html deleted file mode 100644 index cacc3c319..000000000 --- a/ui/src/app/schema-form/widget/datalist/datalist.component.html +++ /dev/null @@ -1,44 +0,0 @@ -
- - {{ schema.description }} - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/datalist/datalist.component.ts b/ui/src/app/schema-form/widget/datalist/datalist.component.ts deleted file mode 100644 index 728af8f3f..000000000 --- a/ui/src/app/schema-form/widget/datalist/datalist.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ControlWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'datalist-component', - templateUrl: `./datalist.component.html` -}) -export class DatalistComponent extends ControlWidget implements AfterViewInit { - - data: string[] = []; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly) { - this.control.disable(); - } else { - this.control.enable(); - } - } - - getData(query: string): void { - this.data = [...this.schema.widget.data]; - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - get title(): string { - return this.schema.title || this.formProperty.parent.schema.title; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? 'message.required' : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.html b/ui/src/app/schema-form/widget/fieldset/fieldset.component.html deleted file mode 100644 index 90a0e09ba..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
- -
- - {{ fieldset.title }} - -

{{ fieldset.description }}

-
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss b/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss deleted file mode 100644 index ac2db04af..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - fieldset { - margin-bottom: 1rem; - legend { - font-size: 1rem; - } - } -} diff --git a/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts b/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts deleted file mode 100644 index a7246cbfc..000000000 --- a/ui/src/app/schema-form/widget/fieldset/fieldset.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { ObjectWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'fieldset-object', - templateUrl: `./fieldset.component.html`, - styleUrls: ['./fieldset.component.scss'] -}) -export class FieldsetComponent extends ObjectWidget { } diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.html b/ui/src/app/schema-form/widget/filter-target/filter-target.component.html deleted file mode 100644 index 2f3cd28b0..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.html +++ /dev/null @@ -1,124 +0,0 @@ -
-
-
-
- -
- - -
-
-
-
- -
-
- - - - - - You must add at least one entity id target and they must each be unique. - - - - -

- - - Required for Scripts - -   - -
- - - - Required for Regex -   - - - - , - {{ error.message }} - - - -
-
- -
-
-
-
-
- -
-
    -
  • - {{ id }} - - - - - -
  • -
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss b/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss deleted file mode 100644 index 13926cdb3..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - -} \ No newline at end of file diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts b/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts deleted file mode 100644 index 7eed2fca9..000000000 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Component, OnDestroy, AfterViewInit } from '@angular/core'; -import { FormControl, Validators, AbstractControl, ValidatorFn } from '@angular/forms'; -import { ObjectWidget } from 'ngx-schema-form'; -import { Store } from '@ngrx/store'; -import { Observable, Subject } from 'rxjs'; -import { distinctUntilChanged, skipWhile, takeUntil, map, withLatestFrom, filter, switchMap, startWith } from 'rxjs/operators'; - -import * as fromRoot from '../../../app.reducer'; -import * as fromFilters from '../../../metadata/filter/reducer'; - -import { QueryEntityIds, ClearSearch } from '../../../metadata/filter/action/search.action'; - -/* istanbul ignore next */ -@Component({ - selector: 'filter-target', - templateUrl: `./filter-target.component.html`, - styleUrls: ['./filter-target.component.scss'] -}) -export class FilterTargetComponent extends ObjectWidget implements OnDestroy, AfterViewInit { - private ngUnsubscribe: Subject = new Subject(); - ids$: Observable; - idCount$: Observable; - - search: FormControl = new FormControl( - '', - [], - [] - ); - - script: FormControl = new FormControl( - '', - [Validators.required] - ); - - errors$: Observable; - hasErrors$: Observable; - - constructor( - private store: Store - ) { - super(); - this.ids$ = this.store.select(fromFilters.getEntityCollection); - - this.idCount$ = this.ids$.pipe(map(list => list.length)); - - this.search - .valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - withLatestFrom(this.ids$), - filter(([term, ids]) => term && term.length >= 4 && ids.indexOf(term) < 0), - map(([term]) => new QueryEntityIds({ - term, - limit: 10 - })) - ) - .subscribe(action => this.store.dispatch(action)); - - this.script - .valueChanges - .pipe( - takeUntil(this.ngUnsubscribe), - distinctUntilChanged(), - skipWhile(() => this.targetType === 'ENTITY') - ) - .subscribe(script => { - this.setTargetValue([script]); - }); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.script.setValue(this.targets[0]); - this.search.setValidators(this.unique()); - - this.errors$ = this.formProperty.errorsChanges.pipe( - map(errors => - errors && errors.length > 1 ? - Array - .from(new Set(errors.filter(e => e.code !== 'ARRAY_LENGTH_SHORT').map(e => e.code))) - .map(id => ({ ...errors.find(e => e.code === id) })) - : [] - )); - - this.errors$ - .pipe( - takeUntil(this.ngUnsubscribe), - map(errors => errors.reduce((collection, e) => ({ ...collection, [e.code]: e.message }), {})), - map(errors => Object.keys(errors).length > 0 ? errors : null) - ) - .subscribe(errors => this.script.setErrors( - errors, - { - emitEvent: true - } - ) - ); - - this.hasErrors$ = this.errors$.pipe(map(e => e && e.length > 0)); - } - - unique(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } | null => { - return this.targets.indexOf(control.value) > -1 ? { unique: true } : null; - }; - } - - getButtonConfig(id: string): any { - let buttons = this.formProperty.getProperty('value').schema.buttons; - return (buttons || []).map(btn => ({ - ...btn, - parameters: { - id - } - })); - } - - get targets(): string[] { - return this.formProperty.getProperty('value').value; - } - - get targetType(): string { - return this.formProperty.getProperty(this.targetAttribute).value; - } - - get displayType(): string { - if (!this.targetAttribute) { - return null; - } - return this.typeOptions.find(opt => opt.value === this.targetType).description; - } - - get targetAttribute(): string { - return this.formProperty.schema.widget.target; - } - - get typeOptions(): any[] { - return this.formProperty - .getProperty(this.targetAttribute) - .schema - .oneOf - .map(option => ({ ...option, value: option.enum[0] })); - } - - select(value: string): void { - this.formProperty.getProperty(this.targetAttribute).setValue(value); - this.setTargetValue([]); - this.script.reset(); - this.search.reset(); - } - - removeId(id: string): void { - let rest = this.targets.filter(target => target !== id); - this.setTargetValue(rest); - } - - setTargetValue(value: string[]): void { - this.formProperty.getProperty('value').setValue(value); - } - - onSelectValue(value: string): void { - this.setTargetValue([...this.formProperty.getProperty('value').value, value]); - this.search.reset(null); - } - - ngOnDestroy(): void { - this.store.dispatch(new ClearSearch()); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } -} diff --git a/ui/src/app/schema-form/widget/number/float.component.html b/ui/src/app/schema-form/widget/number/float.component.html deleted file mode 100644 index 3781e45e0..000000000 --- a/ui/src/app/schema-form/widget/number/float.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
- - {{schema.description}} - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/number/float.component.ts b/ui/src/app/schema-form/widget/number/float.component.ts deleted file mode 100644 index 9ad124211..000000000 --- a/ui/src/app/schema-form/widget/number/float.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - Component, AfterViewInit, ViewChild, ElementRef, -} from '@angular/core'; -import { IntegerWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'float-component', - templateUrl: `./float.component.html` -}) -export class CustomFloatComponent extends IntegerWidget implements AfterViewInit { - private _displayValue: string; - @ViewChild('input', { static: true }) element: ElementRef; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit() { - const control = this.control; - - if (this.formProperty.value) { - control.setValue(this.formProperty.value, { emitEvent: false }); - } - this.formProperty.errorsChanges.subscribe((errors) => { - control.setErrors(errors, { emitEvent: true }); - const messages = (errors || []) - .filter(e => { - return e.path && e.path.slice(1) === this.formProperty.path; - }) - .map(e => e.message); - this.errorMessages = messages.filter((m, i) => messages.indexOf(m) === i); - }); - control.valueChanges.subscribe((newValue) => { - const native = (this.element.nativeElement); - this._displayValue = newValue; - if (newValue === '' && native.validity.badInput) { - this.formProperty.setValue(native.valueAsNumber, false); - this.formProperty.extendErrors([{ - code: 'INVALID_NUMBER', - path: `#${this.formProperty.path}`, - message: 'Invalid number', - }]); - } else { - this.formProperty.setValue(newValue, false); - } - }); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - get minimum(): number { - return this.required ? - this.schema.minimum : - this.formProperty.value === null ? null : this.schema.minimum; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/number/number.component.html b/ui/src/app/schema-form/widget/number/number.component.html deleted file mode 100644 index 053269b8c..000000000 --- a/ui/src/app/schema-form/widget/number/number.component.html +++ /dev/null @@ -1,45 +0,0 @@ -
- - - {{schema.description}} - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/number/number.component.ts b/ui/src/app/schema-form/widget/number/number.component.ts deleted file mode 100644 index e6885edeb..000000000 --- a/ui/src/app/schema-form/widget/number/number.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - Component, -} from '@angular/core'; -import { IntegerWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'integer-component', - templateUrl: `./number.component.html` -}) -export class CustomIntegerComponent extends IntegerWidget { - constructor( - private widgetService: SchemaService - ) { - super(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/object/inline-obj.component.html b/ui/src/app/schema-form/widget/object/inline-obj.component.html deleted file mode 100644 index a9f57749f..000000000 --- a/ui/src/app/schema-form/widget/object/inline-obj.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
-
- -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/object/inline-obj.component.ts b/ui/src/app/schema-form/widget/object/inline-obj.component.ts deleted file mode 100644 index 4ab29534a..000000000 --- a/ui/src/app/schema-form/widget/object/inline-obj.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -import { CustomObjectWidget } from './object.component'; - -/* tslint:disable */ -@Component({ - selector: 'inline-obj', - templateUrl: `./inline-obj.component.html` -}) -export class InlineObjectComponent extends CustomObjectWidget { } diff --git a/ui/src/app/schema-form/widget/object/object.component.html b/ui/src/app/schema-form/widget/object/object.component.html deleted file mode 100644 index 7824ef6f6..000000000 --- a/ui/src/app/schema-form/widget/object/object.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
- -
{{error.message | translate}}
-
-
- -
- - {{ fieldset.title }} - -

- {{ fieldset.description }} -

-
-
- -
-
-
-
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/object/object.component.ts b/ui/src/app/schema-form/widget/object/object.component.ts deleted file mode 100644 index da584b860..000000000 --- a/ui/src/app/schema-form/widget/object/object.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; - -import { ObjectWidget } from 'ngx-schema-form'; -import { filter, map } from 'rxjs/operators'; -import { Observable } from 'rxjs'; -import { FormError } from '../array/array.component'; - -/* tslint:disable */ -@Component({ - selector: 'custom-object', - templateUrl: `./object.component.html` -}) -export class CustomObjectWidget extends ObjectWidget implements AfterViewInit { - - customErrors$: Observable; - - constructor() { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.formProperty) { - this.customErrors$ = this.formProperty.errorsChanges - .pipe( - map(errors => errors ? errors : []), - map(errors => { - return errors.filter(err => err.path.replace('#', '') === (this.formProperty.path)); - }), - map(errors => Object.values(errors.reduce((collection, error) => ({ ...collection, [error.code]: error }), {}))), - map(errors => errors.length ? errors : null) - ) as Observable; - } - } -} diff --git a/ui/src/app/schema-form/widget/radio/radio.component.html b/ui/src/app/schema-form/widget/radio/radio.component.html deleted file mode 100644 index de9187120..000000000 --- a/ui/src/app/schema-form/widget/radio/radio.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - {{schema.description}} - - -
- - -
-
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/radio/radio.component.ts b/ui/src/app/schema-form/widget/radio/radio.component.ts deleted file mode 100644 index 23faf2cc0..000000000 --- a/ui/src/app/schema-form/widget/radio/radio.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; -import { RadioWidget } from 'ngx-schema-form'; - -@Component({ - selector: 'custom-radio-widget', - templateUrl: `./radio.component.html` -}) -export class CustomRadioComponent extends RadioWidget {} diff --git a/ui/src/app/schema-form/widget/select/select.component.html b/ui/src/app/schema-form/widget/select/select.component.html deleted file mode 100644 index aab941a48..000000000 --- a/ui/src/app/schema-form/widget/select/select.component.html +++ /dev/null @@ -1,69 +0,0 @@ -
- - - {{ schema.description }} - - - - - - {{ schema.widget.help }} - - - - , - error - - - - -
diff --git a/ui/src/app/schema-form/widget/select/select.component.ts b/ui/src/app/schema-form/widget/select/select.component.ts deleted file mode 100644 index a596d740e..000000000 --- a/ui/src/app/schema-form/widget/select/select.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { SelectWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { map, shareReplay, startWith } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'select-component', - templateUrl: `./select.component.html` -}) -export class CustomSelectComponent extends SelectWidget implements AfterViewInit, OnDestroy { - - options$: any; - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - if (this.schema.readOnly || this.schema.widget.disabled) { - this.control.disable(); - } else { - this.control.enable(); - } - - if (!(this.schema.widget instanceof String) && this.schema.widget.dataUrl) { - this.options$ = this.widgetService - .get(this.schema.widget.dataUrl) - .pipe( - shareReplay(), - map(opts => - opts.map(opt => - ({ label: opt.replace('Resolver', 'Provider'), value: opt }) - ) - ) - ); - } - - this.errorSub = this.control.valueChanges.pipe(startWith(this.control.value)).subscribe(v => { - if (!v && this.required && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg))) { - this.errorMessages.push('message.required'); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? 'message.required' : error; - } - - get cleanId(): string { - return this.formProperty._canonicalPath.replace('@', ''); - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/string/string.component.html b/ui/src/app/schema-form/widget/string/string.component.html deleted file mode 100644 index 561d5f8e4..000000000 --- a/ui/src/app/schema-form/widget/string/string.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
- - - {{ schema.description }} - - - - - - {{ schema.widget.help }} - - - - , - error - - - -
diff --git a/ui/src/app/schema-form/widget/string/string.component.scss b/ui/src/app/schema-form/widget/string/string.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/schema-form/widget/string/string.component.ts b/ui/src/app/schema-form/widget/string/string.component.ts deleted file mode 100644 index d4a3c7ee1..000000000 --- a/ui/src/app/schema-form/widget/string/string.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; -import { StringWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { startWith } from 'rxjs/operators'; -import { Subscription } from 'rxjs'; - -import { HARD_CODED_REQUIRED_MSG, REQUIRED_MSG_OVERRIDE } from '../../model/messages'; - -@Component({ - selector: 'custom-string', - templateUrl: `./string.component.html`, - styleUrls: ['../widget.component.scss'] -}) -export class CustomStringComponent extends StringWidget implements AfterViewInit, OnDestroy { - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - let listener = this.formProperty.parent ? this.formProperty.parent : this.control; - this.errorSub = listener.valueChanges.pipe(startWith(listener.value)).subscribe(v => { - if (!this.control.value - && this.required - && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg)) - && this.errorMessages.indexOf(REQUIRED_MSG_OVERRIDE) < 0) { - this.errorMessages.push(REQUIRED_MSG_OVERRIDE); - } - if (!this.required) { - this.errorMessages = this.errorMessages.filter(e => e !== REQUIRED_MSG_OVERRIDE); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - const req = this.widgetService.isRequired(this.formProperty); - - return req; - } - - getError(error: string): string { - return HARD_CODED_REQUIRED_MSG.test(error) ? REQUIRED_MSG_OVERRIDE : error; - } - - get showHint(): boolean { - return (this.control.touched ? !this.showError : true) && this.schema.widget.help; - } - - get showError(): boolean { - return !!this.errorMessages && this.errorMessages.length > 0; - } -} diff --git a/ui/src/app/schema-form/widget/textarea/textarea.component.html b/ui/src/app/schema-form/widget/textarea/textarea.component.html deleted file mode 100644 index 55b2587c7..000000000 --- a/ui/src/app/schema-form/widget/textarea/textarea.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
- - - {{ schema.description }} - - - - - , - error - - - - {{ schema.widget.help }} - -
diff --git a/ui/src/app/schema-form/widget/textarea/textarea.component.ts b/ui/src/app/schema-form/widget/textarea/textarea.component.ts deleted file mode 100644 index fdbce4b35..000000000 --- a/ui/src/app/schema-form/widget/textarea/textarea.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, AfterViewInit, OnDestroy } from '@angular/core'; - -import { TextAreaWidget } from 'ngx-schema-form'; -import { SchemaService } from '../../service/schema.service'; -import { Subscription } from 'rxjs'; -import { startWith } from 'rxjs/operators'; -import { HARD_CODED_REQUIRED_MSG } from '../../model/messages'; - -@Component({ - selector: 'textarea-component', - templateUrl: `./textarea.component.html` -}) -export class CustomTextAreaComponent extends TextAreaWidget implements AfterViewInit, OnDestroy { - - errorSub: Subscription; - - constructor( - private widgetService: SchemaService - ) { - super(); - } - - ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.errorSub = this.control.valueChanges.pipe(startWith(this.control.value)).subscribe(v => { - if (!v && this.required && !this.errorMessages.some(msg => HARD_CODED_REQUIRED_MSG.test(msg))) { - this.errorMessages.push('message.required'); - } - }); - } - - ngOnDestroy(): void { - this.errorSub.unsubscribe(); - } - - get required(): boolean { - return this.widgetService.isRequired(this.formProperty); - } - - getError(error: string): string { - return error.match('required').length ? 'message.required' : error; - } -} diff --git a/ui/src/app/schema-form/widget/widget.component.scss b/ui/src/app/schema-form/widget/widget.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.html b/ui/src/app/shared/autocomplete/autocomplete.component.html deleted file mode 100644 index 7800382cd..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.html +++ /dev/null @@ -1,61 +0,0 @@ -
- -
- -
-
- diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.scss b/ui/src/app/shared/autocomplete/autocomplete.component.scss deleted file mode 100644 index 2bd2273d3..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -@import "~bootstrap/scss/functions"; -@import "~bootstrap/scss/variables"; -@import "../../../theme/palette"; - -.dropdown.form-group { - margin-bottom: 0px; -} - -.dropdown-menu { - min-width: 100%; - width: auto; -} - -:host { - position: relative; - display: block; - - .btn-outline-secondary { - border-color: $input-border-color; - } - - &.is-invalid { - input.form-control { - border-color: $brand-danger; - } - } - - &.is-valid { - input.form-control { - border-color: $brand-success; - } - } -} \ No newline at end of file diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts b/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts deleted file mode 100644 index c7fe5fc32..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.spec.ts +++ /dev/null @@ -1,386 +0,0 @@ -import { Component, ViewChild, SimpleChange, ElementRef, SimpleChanges } from '@angular/core'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { AutoCompleteComponent } from './autocomplete.component'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { ValidationClassDirective } from '../validation/validation-class.directive'; -import { HighlightPipe } from '../pipe/highlight.pipe'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -const iPodAgent = `Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) - AppleWebKit/534.46 (KHTML, like Gecko) - Version/5.1 Mobile/9A334 Safari/7534.48.3`; -const regularAgent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) - AppleWebKit/537.36 (KHTML, like Gecko) - Chrome/64.0.3282.186 Safari/537.36`; - -@Component({ - template: ` -
- - -
- ` -}) -class TestHostComponent { - config: any = { - autoSelect: false, - options: [], - defaultValue: '', - id: 'foo', - allowCustom: false, - noneFoundText: 'None Found', - disabled: false - }; - - constructor(public fb: FormBuilder) {} - - group = this.fb.group({ - search: [''] - }); - - @ViewChild(AutoCompleteComponent, {static: true}) - public autoCompleteUnderTest: AutoCompleteComponent; - - configure(opts: any): void { - this.config = Object.assign({}, this.config, opts); - } - - search(query: string = ''): void {} -} - -describe('AutoComplete Input Component', () => { - let testHostInstance: TestHostComponent; - let testHostFixture: ComponentFixture; - let instanceUnderTest: AutoCompleteComponent; - let navigatorInstance: NavigatorService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - NavigatorService - ], - imports: [ - NoopAnimationsModule, - FormsModule, - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - AutoCompleteComponent, - TestHostComponent, - ValidationClassDirective, - HighlightPipe - ], - }).compileComponents(); - }); - - beforeEach(() => { - testHostFixture = TestBed.createComponent(TestHostComponent); - testHostInstance = testHostFixture.componentInstance; - instanceUnderTest = testHostInstance.autoCompleteUnderTest; - navigatorInstance = TestBed.get(NavigatorService); - testHostFixture.detectChanges(); - }); - - it('should compile', () => { - expect(testHostFixture).toBeDefined(); - }); - - describe('ControlValueAccessor interface', () => { - describe('writeValue method', () => { - it('should set the value of the internal input element', () => { - let val = 'foo'; - instanceUnderTest.writeValue(val); - expect(instanceUnderTest.input.value).toBe(val); - }); - }); - - describe('registerOnChange method', () => { - it('should set the onChange callback method', () => { - let cb = jasmine.createSpy('registerOnChange'); - instanceUnderTest.registerOnChange(cb); - instanceUnderTest.propagateChange('foo'); - expect(cb).toHaveBeenCalledWith('foo'); - }); - }); - - describe('registerOnTouched method', () => { - it('should set the onTouched callback method', () => { - let cb = jasmine.createSpy('registerOnTouched'); - instanceUnderTest.registerOnTouched(cb); - instanceUnderTest.propagateTouched(null); - expect(cb).toHaveBeenCalledWith(null); - }); - }); - - describe('setDisabledState method', () => { - it('should set the disabled property to true', () => { - testHostInstance.group.get('search').disable(); - testHostFixture.detectChanges(); - expect(instanceUnderTest.input.disabled).toBe(true); - }); - it('should set the disabled property to false', () => { - testHostInstance.group.get('search').enable(); - testHostFixture.detectChanges(); - expect(instanceUnderTest.input.disabled).toBe(false); - }); - - it('should set the disabled property to false if not provided', () => { - instanceUnderTest.setDisabledState(); - expect(instanceUnderTest.input.disabled).toBe(false); - }); - }); - }); - - describe('handleKeyDown method', () => { - const keyCodes = { - 13: 'enter', - 27: 'escape', - 32: 'space', - 38: 'up', - 40: 'down' - }; - it('should call the handleUpArrow handler when the up arrow key is entered', () => { - spyOn(instanceUnderTest, 'handleUpArrow'); - instanceUnderTest.handleKeyDown({keyCode: 38} as KeyboardEvent); - expect(instanceUnderTest.handleUpArrow).toHaveBeenCalled(); - }); - it('should call the handleKeyDown handler when the down arrow key is entered', () => { - spyOn(instanceUnderTest, 'handleDownArrow'); - instanceUnderTest.handleKeyDown({ keyCode: 40 } as KeyboardEvent); - expect(instanceUnderTest.handleDownArrow).toHaveBeenCalled(); - }); - - it('should call the handleSpace handler when the arrow space is entered', () => { - spyOn(instanceUnderTest, 'handleSpace'); - instanceUnderTest.handleKeyDown({ keyCode: 32 } as KeyboardEvent); - expect(instanceUnderTest.handleSpace).toHaveBeenCalled(); - }); - - it('should call the handleEnter when the enter key is entered', () => { - spyOn(instanceUnderTest, 'handleEnter'); - instanceUnderTest.handleKeyDown({ keyCode: 13 } as KeyboardEvent); - expect(instanceUnderTest.handleEnter).toHaveBeenCalled(); - }); - it('should call the handleComponentBlur when the escape key is entered', () => { - spyOn(instanceUnderTest, 'handleComponentBlur'); - instanceUnderTest.handleKeyDown({ keyCode: 27 } as KeyboardEvent); - expect(instanceUnderTest.handleComponentBlur).toHaveBeenCalled(); - }); - }); - - describe('handleComponentBlur handler', () => { - const opts = ['foo', 'bar', 'baz']; - it('should set a new state', () => { - instanceUnderTest.state.setState({ selected: 0 }); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleComponentBlur({menuOpen: true}); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ - focused: null, - selected: null, - menuOpen: true - }); - }); - - it('should set the menuOpen state to false if not provided', () => { - instanceUnderTest.state.setState({ selected: 0 }); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ - focused: null, - selected: null, - menuOpen: false - }); - }); - - it('should allow custom values when the property is set', () => { - const val = 'hi'; - testHostInstance.configure({allowCustom: true}); - instanceUnderTest.input.setValue(val); - instanceUnderTest.state.setState({ selected: -1 }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith(val); - }); - - it('should detect if query is in current options', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({options: [val]}); - instanceUnderTest.state.setState({ selected: -1 }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleComponentBlur(); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith('foo'); - }); - }); - - describe('handleEnter handler', () => { - const opts = ['foo', 'bar', 'baz']; - it('should call preventDefault on the provided event if the menu is currently open', () => { - const ev = { preventDefault: () => {} } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - instanceUnderTest.state.setState({ menuOpen: true}); - instanceUnderTest.handleEnter(ev); - expect(ev.preventDefault).toHaveBeenCalled(); - }); - it('should NOT call preventDefault on the provided event if the menu is not open', () => { - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - instanceUnderTest.state.setState({ menuOpen: false }); - instanceUnderTest.handleEnter(ev); - expect(ev.preventDefault).not.toHaveBeenCalled(); - }); - - it('should call componentBlur if there is no selected option and the query is not in the options', () => { - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - spyOn(instanceUnderTest, 'handleComponentBlur'); - instanceUnderTest.state.setState({ menuOpen: true, selected: -1 }); - instanceUnderTest.handleEnter(ev); - expect(instanceUnderTest.handleComponentBlur).toHaveBeenCalledWith({ - focused: -1, - selected: -1, - menuOpen: false - }); - }); - - it('should call handleOptionClick if there is no selected option but the query is in the options', () => { - const i = 0; - const val = opts[i]; - const ev = { preventDefault: () => { } } as KeyboardEvent; - spyOn(ev, 'preventDefault'); - testHostInstance.configure({ options: opts }); - instanceUnderTest.input.setValue(val); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'handleOptionClick'); - instanceUnderTest.state.setState({ menuOpen: true, selected: -1 }); - instanceUnderTest.handleEnter(ev); - expect(instanceUnderTest.handleOptionClick).toHaveBeenCalledWith(i); - }); - }); - - describe('handleInputFocus handler', () => { - it('should set the state focused attribute to the input fields index', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleInputFocus(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({focused: -1}); - }); - }); - - describe('handleOptionFocus handler', () => { - it('should set the state focused attribute to the focused option', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionFocus(1); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({focused: 1, selected: 1}); - }); - }); - - describe('handleOptionClick handler', () => { - const expected = { - menuOpen: false, - focused: -1, - selected: -1 - }; - it('should set the state to menuOpen: false, focused to -1, selected to -1, and the query to the selected option', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({ options: [val, 'bar', 'baz'] }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionClick(0); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith(expected); - }); - - it('should call propagateChange if the selected option is in the list of matches', () => { - const val = 'foo'; - instanceUnderTest.input.setValue(val); - testHostInstance.configure({ options: [val, 'bar', 'baz'] }); - testHostFixture.detectChanges(); - spyOn(instanceUnderTest, 'propagateChange'); - instanceUnderTest.handleOptionClick(0); - expect(instanceUnderTest.propagateChange).toHaveBeenCalledWith(val); - }); - }); - - describe('handleOptionMouseDown method', () => { - it('should call the preventDefault method on the provided event', () => { - let spy = jasmine.createSpy('preventDefault'), - evt = {preventDefault: spy}; - instanceUnderTest.handleOptionMouseDown(evt); - expect(evt.preventDefault).toHaveBeenCalled(); - }); - }); - - describe('handleOptionMouseEnter method', () => { - it('should update the current state with the provided index', () => { - let index = 1; - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionMouseEnter(index); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({ hovered: index }); - }); - }); - - describe('handleOptionMouseOut method', () => { - it('should update the current state on the components model', () => { - spyOn(instanceUnderTest.state, 'setState'); - instanceUnderTest.handleOptionMouseOut(); - expect(instanceUnderTest.state.setState).toHaveBeenCalledWith({hovered: null}); - }); - }); - - describe('displayState getter function', () => { - it('should return the current state', () => { - let spy = spyOnProperty(instanceUnderTest.state, 'currentState', 'get'); - let state = instanceUnderTest.displayState; - expect(state).toEqual({}); - expect(spy).toHaveBeenCalled(); - }); - }); - - describe('hasAutoSelect getter', () => { - it('should return true if not an ios device and autoSelect is set to true', () => { - spyOn(instanceUnderTest, 'isIosDevice').and.returnValue(false); - testHostInstance.configure({autoSelect: true}); - testHostFixture.detectChanges(); - expect(instanceUnderTest.hasAutoselect).toBe(true); - }); - - it('should return false if an ios device', () => { - spyOn(instanceUnderTest, 'isIosDevice').and.returnValue(true); - expect(instanceUnderTest.hasAutoselect).toBe(false); - }); - }); - - describe('activeDescendant getter', () => { - it('should return a formatted string of an item is focused', () => { - let id = 'foo', - focused = 1, - matches = ['foo']; - testHostInstance.configure({id}); - spyOnProperty(instanceUnderTest.state, 'currentState', 'get').and.returnValue({focused, matches}); - testHostFixture.detectChanges(); - expect(instanceUnderTest.activeDescendant).toBe(`${id}__option--${focused}`); - }); - }); - - describe('isIosDevice method', () => { - it('should return true if navigator.userAgent is an ipad', () => { - spyOnProperty(navigatorInstance, 'native', 'get').and.returnValue({ userAgent: iPodAgent }); - expect(instanceUnderTest.isIosDevice()).toBe(true); - }); - it('should return false if navigator.userAgent is not an ios device', () => { - spyOnProperty(navigatorInstance, 'native', 'get').and.returnValue({ userAgent: regularAgent }); - expect(instanceUnderTest.isIosDevice()).toBe(false); - }); - }); -}); diff --git a/ui/src/app/shared/autocomplete/autocomplete.component.ts b/ui/src/app/shared/autocomplete/autocomplete.component.ts deleted file mode 100644 index cda5d6406..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.component.ts +++ /dev/null @@ -1,377 +0,0 @@ -import { - Component, - Input, - Output, - EventEmitter, - OnInit, - OnDestroy, - OnChanges, - AfterViewInit, - ViewChild, - ViewChildren, - QueryList, - ElementRef, - forwardRef, - HostListener, - SimpleChanges -} from '@angular/core'; -import { FormControl, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { Observable, Subject, Subscription, interval } from 'rxjs'; -import { takeUntil, combineLatest, map } from 'rxjs/operators'; - -import { LiveAnnouncer } from '@angular/cdk/a11y'; - -import { keyCodes } from '../../shared/keycodes'; -import { AutoCompleteStateEmitter } from './autocomplete.model'; -import { NavigatorService } from '../../core/service/navigator.service'; - -const POLL_TIMEOUT = 1000; -const INPUT_FIELD_INDEX = -1; - -@Component({ - selector: 'auto-complete', - templateUrl: './autocomplete.component.html', - styleUrls: ['./autocomplete.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AutoCompleteComponent), - multi: true - } - ] -}) -export class AutoCompleteComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit, ControlValueAccessor { - @Input() defaultValue = ''; - @Input() matches: string[] = []; - @Input() id: string; - @Input() fieldId: string; - @Input() autoSelect = false; - @Input() noneFoundText = 'No Options Found'; - @Input() limit = 0; - @Input() processing = false; - @Input() dropdown = false; - @Input() placeholder = ''; - @Input() count = null; - - @Output() more: EventEmitter = new EventEmitter(); - @Output() onChange: EventEmitter = new EventEmitter(); - - @ViewChild('inputField', { static: true }) inputField: ElementRef; - @ViewChildren('matchElement', { read: ElementRef }) listItems: QueryList; - - focused: number; - selected: number; - - isMenuOpen$: Observable; - query$: Observable; - - $pollInput: Observable; - $checkInputValue: Observable; - $pollSubscription: Subscription; - - showMoreAvailable: boolean; - numMatches: number; - - input: FormControl = new FormControl(); - elementReferences: {[id: number]: ElementRef} = {}; - state: AutoCompleteStateEmitter = new AutoCompleteStateEmitter(); - - menuIsVisible$: Observable; - - private ngUnsubscribe: Subject = new Subject(); - - propagateChange = (_: any | null) => { }; - propagateTouched = (_: any | null) => { }; - - constructor(private navigator: NavigatorService, private live: LiveAnnouncer) {} - - ngOnInit(): void { - this.$pollInput = interval(POLL_TIMEOUT); - this.$checkInputValue = this.$pollInput - .pipe( - takeUntil(this.ngUnsubscribe), - combineLatest(this.input.valueChanges) - ); - this.$pollSubscription = this.$checkInputValue.subscribe(([polled, value]) => { - const inputReference = this.inputField.nativeElement; - const queryHasChanged = inputReference && inputReference.value !== value; - if (queryHasChanged) { - this.input.setValue(inputReference.value); - this.input.updateValueAndValidity(); - } - }); - - this.input.valueChanges.subscribe(query => this.onChange.emit(query)); - this.input.valueChanges.subscribe(newValue => this.handleInputChange(newValue)); - this.input.setValue(this.defaultValue); - - this.menuIsVisible$ = this.state.changes$.pipe(map(state => state.menuOpen)); - } - - ngOnDestroy(): void { - this.$pollSubscription.unsubscribe(); - this.ngUnsubscribe.next(); - this.ngUnsubscribe.complete(); - } - - ngAfterViewInit(): void { - this.listItems.changes.subscribe((changes) => this.setElementReferences(changes) ); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.matches && this.matches && this.state.currentState.menuOpen) { - this.announceResults(); - } - } - - announceResults(): void { - const count = this.matches.length; - this.live.announce(count === 0 ? - `${this.noneFoundText}` : - `${count} result${count === 1 ? '' : 's'} available`, 'polite', 5000); - } - - writeValue(value: any): void { - this.input.setValue(value); - } - - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - - registerOnTouched(fn: any): void { - this.propagateTouched = fn; - } - - setDisabledState(isDisabled: boolean = false): void { - if (isDisabled) { - this.input.disable(); - } else { - this.input.enable(); - } - } - - setElementReferences(changes): void { - this.elementReferences = { - [INPUT_FIELD_INDEX]: this.inputField - }; - this.listItems.map((item, index) => { - this.elementReferences[index] = item; - }); - } - - handleDropdown($event: MouseEvent | KeyboardEvent | Event): void { - const open = this.state.currentState.menuOpen; - this.state.setState({menuOpen: !open}); - this.handleOptionFocus(0); - } - - handleViewMore($event: MouseEvent | KeyboardEvent | Event): void { - $event.preventDefault(); - $event.stopPropagation(); - this.handleInputBlur(); - this.input.markAsTouched(); - this.more.emit(this.input.value); - } - - handleComponentBlur(newState: any = {}): void { - let { selected } = this.state.currentState, - query = this.input.value, - change = this.matches && this.matches[selected] ? this.matches[selected] : query; - this.propagateChange(change); - this.propagateTouched(null); - this.state.setState({ - focused: null, - selected: null, - menuOpen: newState.menuOpen || false - }); - } - - handleOptionBlur(event: FocusEvent, index): void { - const elm = event.relatedTarget as HTMLElement; - const { focused, menuOpen, selected } = this.state.currentState; - const focusingOutsideComponent = event.relatedTarget === null; - const focusingInput = elm.id === this.elementReferences[-1].nativeElement.id; - const focusingAnotherOption = focused !== index && focused !== -1; - const blurComponent = (!focusingAnotherOption && focusingOutsideComponent) || !(focusingAnotherOption || focusingInput); - if (blurComponent) { - const keepMenuOpen = menuOpen && this.isIosDevice(); - this.handleComponentBlur({ - menuOpen: keepMenuOpen, - query: this.matches[selected] - }); - } - } - - handleInputBlur(): void { - const { focused, menuOpen, selected } = this.state.currentState; - const query = this.input.value; - const focusingAnOption = focused !== -1; - const isIosDevice = this.isIosDevice(); - if (!focusingAnOption && this.matches) { - const keepMenuOpen = menuOpen && isIosDevice; - const newQuery = isIosDevice ? query : this.matches[selected]; - this.handleComponentBlur({ - menuOpen: keepMenuOpen, - query: newQuery - }); - } else { - this.handleComponentBlur({ - menuOpen: false, - query - }); - } - } - - handleInputChange(query: string): void { - query = query || ''; - const queryEmpty = query.length === 0; - const autoselect = this.hasAutoselect; - const optionsAvailable = this.matches.length > 0; - const searchForOptions = !queryEmpty; - const focused = this.state.currentState.focused !== null; - this.state.setState({ - menuOpen: searchForOptions && (focused && !this.matches.some(m => m === query)), - selected: searchForOptions ? ((autoselect && optionsAvailable) ? 0 : -1) : null - }); - this.propagateChange(query); - } - - handleInputFocus(): void { - this.state.setState({ - focused: INPUT_FIELD_INDEX - }); - } - handleOptionFocus(index: number) { - this.state.setState({ - focused: index, - selected: index - }); - } - handleOptionClick(index: number): void { - const selectedOption = this.matches[index]; - this.propagateChange(selectedOption); - this.input.setValue(selectedOption); - this.state.setState({ - focused: -1, - selected: -1, - menuOpen: false - }); - } - - @HostListener('keydown', ['$event']) - handleKeyDown(event: KeyboardEvent): void { - switch (keyCodes[event.keyCode]) { - case 'up': - this.handleUpArrow(event); - break; - case 'down': - this.handleDownArrow(event); - break; - case 'space': - this.handleSpace(event); - break; - case 'enter': - this.handleEnter(event); - break; - case 'escape': - this.handleComponentBlur(); - break; - } - } - - handleUpArrow(event: KeyboardEvent): void { - event.preventDefault(); - const isNotAtTop = this.state.currentState.selected !== 0; - const allowMoveUp = isNotAtTop && this.state.currentState.menuOpen; - if (allowMoveUp) { - this.handleOptionFocus(this.state.currentState.selected - 1); - } - } - - handleDownArrow(event: KeyboardEvent): void { - let isNotAtBottom = this.state.currentState.selected !== this.matches.length - 1; - if (this.showMoreAvailable) { - isNotAtBottom = this.state.currentState.selected !== this.matches.length; - } - const allowMoveDown = isNotAtBottom && this.state.currentState.menuOpen; - if (allowMoveDown) { - this.handleOptionFocus(this.state.currentState.selected + 1); - } - event.preventDefault(); - } - - handleSpace(event: KeyboardEvent): void { - const focusIsOnOption = this.state.currentState.focused !== -1; - if (focusIsOnOption) { - event.preventDefault(); - this.handleOptionClick(this.state.currentState.focused); - } - } - - handleEnter(event: KeyboardEvent): void { - let { selected, menuOpen } = this.state.currentState, - query = this.input.value; - if (menuOpen) { - event.preventDefault(); - let hasSelectedOption = selected >= 0; - if (!hasSelectedOption) { - const queryIndex = this.matches.indexOf(query); - hasSelectedOption = queryIndex > -1; - selected = hasSelectedOption ? queryIndex : selected; - } - if (hasSelectedOption && selected < this.matches.length) { - this.handleOptionClick(selected); - } else if (hasSelectedOption && selected === this.matches.length) { - this.handleViewMore(event as KeyboardEvent); - } else { - this.handleComponentBlur({ - focused: -1, - selected: -1, - menuOpen: false - }); - } - } - } - - handleOptionMouseDown(event: MouseEvent | { preventDefault: () => {} }): void { - event.preventDefault(); - } - - handleOptionMouseEnter(index: number): void { - this.state.setState({ - hovered: index - }); - } - - handleOptionMouseOut(): void { - this.state.setState({ - hovered: null - }); - } - - isIosDevice() { - let agent = this.navigator.native.userAgent; - return !!(agent.match(/(iPod|iPhone|iPad)/g) && agent.match(/AppleWebKit/g)); - } - - getOptionId(index: string | number): string { - return `${this.fieldId}__option--${index}`.replace('/', ''); - } - - get hasAutoselect(): boolean { - return this.isIosDevice() ? false : this.autoSelect; - } - - get activeDescendant (): string { - let { focused } = this.state.currentState, - optionFocused = focused !== -1 && focused !== null; - return optionFocused ? this.getOptionId(focused) : null; - } - - get displayState(): any { - return { - ...this.state.currentState - }; - } -} diff --git a/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts b/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts deleted file mode 100644 index 5719d3d7e..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.model.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AutoCompleteStateEmitter, AutoCompleteState, defaultState } from './autocomplete.model'; - -describe('AutoCompleteStateEmitter', () => { - let emitter: AutoCompleteStateEmitter; - - describe('constructor', () => { - it('should init with a default state', () => { - emitter = new AutoCompleteStateEmitter(); - expect(emitter.currentState).toEqual(defaultState); - }); - - it('should init with a provided state', () => { - const st: AutoCompleteState = { - ...defaultState - }; - emitter = new AutoCompleteStateEmitter(st); - expect(emitter.currentState).toEqual(st); - }); - }); -}); diff --git a/ui/src/app/shared/autocomplete/autocomplete.model.ts b/ui/src/app/shared/autocomplete/autocomplete.model.ts deleted file mode 100644 index 8e96dae05..000000000 --- a/ui/src/app/shared/autocomplete/autocomplete.model.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ElementRef } from '@angular/core'; -import { Subject } from 'rxjs'; - -export const defaultState: AutoCompleteState = { - focused: null, - selected: null, - hovered: null, - menuOpen: false -}; - -export interface AutoCompleteState { - focused: number | null; - selected: number | null; - hovered: number | null; - menuOpen: boolean; -} - -export class AutoCompleteStateEmitter { - private subj = new Subject(); - - private state: AutoCompleteState; - - changes$ = this.subj.asObservable(); - - constructor( - public defaults: AutoCompleteState = defaultState - ) { - this.state = {...defaults}; - } - - get currentState(): AutoCompleteState { - return this.state; - } - - setState(change: Partial) { - this.state = { - ...this.state, - ...change - }; - this.subj.next(this.state); - } -} diff --git a/ui/src/app/shared/autocomplete/keys.service.ts b/ui/src/app/shared/autocomplete/keys.service.ts deleted file mode 100644 index dca1f77ee..000000000 --- a/ui/src/app/shared/autocomplete/keys.service.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface KeyService { - codes: any; - isPrintableKeyCode (): boolean; -} diff --git a/ui/src/app/shared/client.ts b/ui/src/app/shared/client.ts deleted file mode 100644 index 9942538fb..000000000 --- a/ui/src/app/shared/client.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isIosDevice() { - return !!(navigator.userAgent.match(/(iPod|iPhone|iPad)/g) && navigator.userAgent.match(/AppleWebKit/g)); -} diff --git a/ui/src/app/shared/component/info-icon.component.html b/ui/src/app/shared/component/info-icon.component.html deleted file mode 100644 index ed7279e48..000000000 --- a/ui/src/app/shared/component/info-icon.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - {{ description }} - - diff --git a/ui/src/app/shared/component/info-icon.component.scss b/ui/src/app/shared/component/info-icon.component.scss deleted file mode 100644 index 87b013155..000000000 --- a/ui/src/app/shared/component/info-icon.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -:host { - .btn-nostyle { - margin: 0px; - padding: 0px; - background: none; - border: none; - display: inline; - } -} - - diff --git a/ui/src/app/shared/component/info-icon.component.spec.ts b/ui/src/app/shared/component/info-icon.component.spec.ts deleted file mode 100644 index e3b8c1347..000000000 --- a/ui/src/app/shared/component/info-icon.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, ViewChild, Renderer2 } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { InfoIconComponent } from './info-icon.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(InfoIconComponent, { static: true }) - public componentUnderTest: InfoIconComponent; - - public description = 'Foo bar baz'; -} - -describe('Info Icon Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: InfoIconComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - TestHostComponent, - InfoIconComponent - ], - providers: [ - Renderer2 - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should display an information icon', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/shared/component/info-icon.component.ts b/ui/src/app/shared/component/info-icon.component.ts deleted file mode 100644 index ceba5f733..000000000 --- a/ui/src/app/shared/component/info-icon.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy, Renderer2 } from '@angular/core'; -import { NgbPopover, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'info-icon', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './info-icon.component.html', - styleUrls: ['./info-icon.component.scss'] -}) -export class InfoIconComponent { - @Input() description: string; - - id: string = String.fromCharCode(65 + Math.floor(Math.random() * 26)) + Date.now().toString(); - - // triggers = 'mouseenter:mouseleave focus:blur'; - triggers = 'click'; - container = 'body'; - placement = ['top']; - - constructor( - private renderer: Renderer2 - ) { } - focus(element): void { - element.elementRef.nativeElement.focus(); - } -} diff --git a/ui/src/app/shared/component/valid-form-icon.component.html b/ui/src/app/shared/component/valid-form-icon.component.html deleted file mode 100644 index ff292db23..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/src/app/shared/component/valid-form-icon.component.spec.ts b/ui/src/app/shared/component/valid-form-icon.component.spec.ts deleted file mode 100644 index 146f6f44e..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, ViewChild, Renderer2 } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { MockI18nModule } from '../../../testing/i18n.stub'; -import { ValidFormIconComponent } from './valid-form-icon.component'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(ValidFormIconComponent, { static: true }) - public componentUnderTest: ValidFormIconComponent; - - public status = 'INVALID'; -} - -describe('Info Icon Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: ValidFormIconComponent; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbPopoverModule, - MockI18nModule - ], - declarations: [ - TestHostComponent, - ValidFormIconComponent - ], - providers: [ - Renderer2 - ] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should display an information icon', waitForAsync(() => { - expect(app).toBeTruthy(); - })); -}); diff --git a/ui/src/app/shared/component/valid-form-icon.component.ts b/ui/src/app/shared/component/valid-form-icon.component.ts deleted file mode 100644 index 4528f273b..000000000 --- a/ui/src/app/shared/component/valid-form-icon.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; - -@Component({ - selector: 'valid-form-icon', - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './valid-form-icon.component.html' -}) -export class ValidFormIconComponent { - @Input() status: string; - - constructor() {} -} diff --git a/ui/src/app/shared/constant.ts b/ui/src/app/shared/constant.ts deleted file mode 100644 index a0eaf09b8..000000000 --- a/ui/src/app/shared/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_FIELD_MAX_LENGTH = 255; diff --git a/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts b/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts deleted file mode 100644 index adbf77284..000000000 --- a/ui/src/app/shared/contenteditable/contenteditable.directive.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, DebugElement, Renderer2 } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ContenteditableDirective } from './contenteditable.directive'; -import { FormControl, ReactiveFormsModule } from '@angular/forms'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - - - -@Component({ - template: `
` -}) -class TestComponent { - control: FormControl = new FormControl(''); -} - -describe('Content Editable Directive', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let element: DebugElement; - let renderer: Renderer2; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: Renderer2, useClass: Renderer2 } - ], - imports: [ - ReactiveFormsModule, - MockI18nModule - ], - declarations: [ - ContenteditableDirective, - TestComponent - ], - }); - - fixture = TestBed.createComponent(TestComponent); - element = fixture.debugElement.query(By.css('div')); - fixture.detectChanges(); - - renderer = TestBed.get(Renderer2); - }); - - describe('functions', () => { - it('should compile', () => { - expect(element).toBeDefined(); - }); - }); - - describe('setDisabledState', () => { - it('should set the field to disabled', () => { - fixture.componentInstance.control.disable(); - expect(element.attributes.disabled).toBeDefined(); - }); - - it('should set the field to enabled', () => { - fixture.componentInstance.control.disable(); - fixture.detectChanges(); - fixture.componentInstance.control.enable(); - expect(element.attributes.disabled).toBeUndefined(); - }); - - it('should set the field to enabled', () => { - fixture.componentInstance.control.enable(); - expect(element.attributes.disabled).toBeUndefined(); - }); - }); -}); diff --git a/ui/src/app/shared/contenteditable/contenteditable.directive.ts b/ui/src/app/shared/contenteditable/contenteditable.directive.ts deleted file mode 100644 index 13b90bd0f..000000000 --- a/ui/src/app/shared/contenteditable/contenteditable.directive.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - Directive, - ElementRef, - Renderer2, - HostListener, - forwardRef, - Input, - OnInit -} from '@angular/core'; - -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -@Directive({ - selector: '[contenteditable]', - providers: - [ - { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ContenteditableDirective), multi: true } - ] -}) -export class ContenteditableDirective implements ControlValueAccessor { - @Input() propValueAccessor = 'textContent'; - - private removeDisabledState: () => void; - - private propagateChange = (_: any | null) => { }; - private propagateTouched = (_: any | null) => { }; - - constructor(private elementRef: ElementRef, private renderer: Renderer2) {} - - @HostListener('input') - callOnChange() { - this.propagateChange(this.elementRef.nativeElement[this.propValueAccessor]); - } - - @HostListener('blur') - callOnTouched() { - this.propagateTouched(null); - } - writeValue(value: any): void { - const normalizedValue = value || ''; - this.renderer.setProperty(this.elementRef.nativeElement, this.propValueAccessor, normalizedValue); - } - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - registerOnTouched(fn: any): void { - this.propagateTouched = fn; - } - setDisabledState(isDisabled: boolean): void { - if (isDisabled) { - this.renderer.setAttribute(this.elementRef.nativeElement, 'disabled', 'true'); - this.removeDisabledState = this.renderer.listen(this.elementRef.nativeElement, 'keydown', this.listenerDisabledState); - } else { - if (this.removeDisabledState) { - this.renderer.removeAttribute(this.elementRef.nativeElement, 'disabled'); - this.removeDisabledState(); - } - } - } - - private listenerDisabledState(e: KeyboardEvent) { - e.preventDefault(); - } -} diff --git a/ui/src/app/shared/keycodes.spec.ts b/ui/src/app/shared/keycodes.spec.ts deleted file mode 100644 index d5c68f22c..000000000 --- a/ui/src/app/shared/keycodes.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as Keycodes from './keycodes'; - -function range (start, edge, step = 1) { - const ret = []; - edge = edge || 0; - step = step || 1; - for (ret; (edge - start) * step > 0; start += step) { - ret.push(start); - } - return ret; -} - -describe('Keycodes utility', () => { - describe('isPrintableKeyCode function', () => { - it('should return true if keycode is between (not including) 47 and 58', () => { - let rng = range(48, 57); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 64 and 91', () => { - let rng = range(64 + 1, 91 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 95 and 112', () => { - let rng = range(95 + 1, 112 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 185 and 193', () => { - let rng = range(185 + 1, 193 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is between (not including) 218 and 223', () => { - let rng = range(218 + 1, 223 - 1); - rng.forEach((num) => { - expect(Keycodes.isPrintableKeyCode(num)).toBe(true); - }); - }); - - it('should return true if keycode is 32 or 8', () => { - expect(Keycodes.isPrintableKeyCode(32)).toBe(true); - expect(Keycodes.isPrintableKeyCode(8)).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/keycodes.ts b/ui/src/app/shared/keycodes.ts deleted file mode 100644 index 717c1bb22..000000000 --- a/ui/src/app/shared/keycodes.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const keyCodes = { - 13: 'enter', - 27: 'escape', - 32: 'space', - 38: 'up', - 40: 'down' -}; - -export function isPrintableKeyCode (keyCode) { - return ( - (keyCode > 47 && keyCode < 58) || // number keys - keyCode === 32 || keyCode === 8 || // spacebar or backspace - (keyCode > 64 && keyCode < 91) || // letter keys - (keyCode > 95 && keyCode < 112) || // numpad keys - (keyCode > 185 && keyCode < 193) || // ;=,-./` (in order) - (keyCode > 218 && keyCode < 223) // [\]' (in order) - ); -} diff --git a/ui/src/app/shared/memo.spec.ts b/ui/src/app/shared/memo.spec.ts deleted file mode 100644 index 01fcd9898..000000000 --- a/ui/src/app/shared/memo.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { memoize } from './memo'; - -const fns = { - square(n) { - return n * n; - } -}; - -describe('memoize function', () => { - it('should return a memoized function', () => { - spyOn(fns, 'square').and.callThrough(); - const memoized = memoize(fns.square); - const call1 = memoized(1); - const call2 = memoized(2); - const call3 = memoized(2); - expect(call1).toBe(1); - expect(call2).toBe(4); - expect(call3).toBe(4); - expect(fns.square).toHaveBeenCalledTimes(2); - }); -}); diff --git a/ui/src/app/shared/memo.ts b/ui/src/app/shared/memo.ts deleted file mode 100644 index 3f719142a..000000000 --- a/ui/src/app/shared/memo.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function memoize(func) { - const cache = {}; - return function (...args: any[]) { - const key = JSON.stringify(args); - if (cache[key]) { - return cache[key]; - } else { - const val = func.apply(null, args); - cache[key] = val; - return val; - } - }; -} - -export default { memoize }; diff --git a/ui/src/app/shared/pipe/date.pipe.ts b/ui/src/app/shared/pipe/date.pipe.ts deleted file mode 100644 index 80f648ec4..000000000 --- a/ui/src/app/shared/pipe/date.pipe.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PipeTransform, Pipe } from '@angular/core'; -import { DatePipe } from '@angular/common'; - -@Pipe({ name: 'customDate' }) -export class CustomDatePipe implements PipeTransform { - pipe: DatePipe; - constructor() { - this.pipe = new DatePipe('en'); - } - transform(value: string, format: string): string { - let transformed: string; - try { - transformed = this.pipe.transform(value, format); - } catch (err) { - transformed = value; - } - return transformed; - } -} diff --git a/ui/src/app/shared/pipe/highlight.pipe.spec.ts b/ui/src/app/shared/pipe/highlight.pipe.spec.ts deleted file mode 100644 index 40a5cffce..000000000 --- a/ui/src/app/shared/pipe/highlight.pipe.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { HighlightPipe } from './highlight.pipe'; -import { DomSanitizer } from '@angular/platform-browser'; - -describe('Pipe: Highlight', () => { - let pipe: HighlightPipe; - - beforeEach(() => { - pipe = new HighlightPipe({ - bypassSecurityTrustHtml: jasmine.createSpy('bypassSecurityTrustHtml'), - sanitize: jasmine.createSpy('sanitize'), - bypassSecurityTrustStyle: jasmine.createSpy('bypassSecurityTrustStyle'), - bypassSecurityTrustScript: jasmine.createSpy('bypassSecurityTrustScript'), - bypassSecurityTrustUrl: jasmine.createSpy('bypassSecurityTrustUrl'), - bypassSecurityTrustResourceUrl: jasmine.createSpy('bypassSecurityTrustResourceUrl') - }); - }); - - it('should return the attribute value', () => { - const str = 'foobar'; - const query = 'foo'; - expect(pipe.transform(str, query)).toBeUndefined(); - }); - it('should return - if the attribute is null', () => { - expect(pipe.transform(null, null)).toBeNull(); - expect(pipe.transform('foo', null)).toEqual('foo'); - expect(pipe.transform(null, 'foo')).toBeNull(); - }); -}); diff --git a/ui/src/app/shared/pipe/highlight.pipe.ts b/ui/src/app/shared/pipe/highlight.pipe.ts deleted file mode 100644 index e3b20b10c..000000000 --- a/ui/src/app/shared/pipe/highlight.pipe.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PipeTransform, Pipe } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -@Pipe({ name: 'highlight' }) -export class HighlightPipe implements PipeTransform { - constructor(public sanitizer: DomSanitizer) {} - transform(value: string, query: string): SafeHtml { - if (!query || !value) { - return value; - } - let pattern = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); - pattern = pattern.split(' ').filter((t) => { - return t.length > 0; - }).join('|'); - const regex = new RegExp(pattern, 'gi'); - return this.sanitizer.bypassSecurityTrustHtml( - value.replace(regex, (match) => `${match}`) - ); - } -} diff --git a/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts b/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts deleted file mode 100644 index 9aa1d875a..000000000 --- a/ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PrettyXml } from './pretty-xml.pipe'; -import * as XmlFormatter from 'xml-formatter'; - -describe('Pipe: Pretty Xml', () => { - let pipe: PrettyXml; - - beforeEach(() => { - pipe = new PrettyXml(); - }); - - it('should return the formatted xml', () => { - const str = ''; - expect(pipe.transform(str)).toEqual(XmlFormatter(str)); - }); - - it('should return the provided string if not truthy', () => { - const str = ''; - expect(pipe.transform(str)).toEqual(''); - }); -}); diff --git a/ui/src/app/shared/pipe/pretty-xml.pipe.ts b/ui/src/app/shared/pipe/pretty-xml.pipe.ts deleted file mode 100644 index d0fc54d05..000000000 --- a/ui/src/app/shared/pipe/pretty-xml.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import * as XmlFormatter from 'xml-formatter'; - -@Pipe({ name: 'prettyXml' }) -export class PrettyXml implements PipeTransform { - transform(value: string): string { - if (!value) { - return value; - } - return XmlFormatter(value); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/shared/regex.ts b/ui/src/app/shared/regex.ts deleted file mode 100644 index 3d84b2ee0..000000000 --- a/ui/src/app/shared/regex.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const URL_REGEX = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/; -export const EMAIL_REGEX = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,})+$/; -export const INTEGER_REGEX = /^[0-9]+$/; diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts deleted file mode 100644 index 720f2a407..000000000 --- a/ui/src/app/shared/shared.module.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HighlightPipe } from './pipe/highlight.pipe'; -import { AutoCompleteComponent } from './autocomplete/autocomplete.component'; -import { ValidationClassDirective } from './validation/validation-class.directive'; -import { ValidFormIconComponent } from './component/valid-form-icon.component'; -import { PrettyXml } from './pipe/pretty-xml.pipe'; -import { ToggleSwitchComponent } from './switch/switch.component'; -import { ContenteditableDirective } from './contenteditable/contenteditable.directive'; -import { I18nModule } from '../i18n/i18n.module'; -import { CustomDatePipe } from './pipe/date.pipe'; -import { InfoIconComponent } from './component/info-icon.component'; -import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - I18nModule, - NgbPopoverModule - ], - declarations: [ - HighlightPipe, - AutoCompleteComponent, - ToggleSwitchComponent, - ValidationClassDirective, - ValidFormIconComponent, - PrettyXml, - CustomDatePipe, - ContenteditableDirective, - InfoIconComponent - ], - exports: [ - HighlightPipe, - AutoCompleteComponent, - ToggleSwitchComponent, - CommonModule, - ReactiveFormsModule, - FormsModule, - ValidFormIconComponent, - ValidationClassDirective, - ContenteditableDirective, - CustomDatePipe, - InfoIconComponent - ] -}) -export class SharedModule { } diff --git a/ui/src/app/shared/storage.spec.ts b/ui/src/app/shared/storage.spec.ts deleted file mode 100644 index 81f4f70e0..000000000 --- a/ui/src/app/shared/storage.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Storage } from './storage'; - -describe('storage class', () => { - describe('key', () => { - it('should set a readonly key', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(storage.key).toBe(key); - }); - it('should check for a list in local storage', () => { - spyOn(localStorage, 'getItem').and.returnValue('[]'); - spyOn(localStorage, 'setItem'); - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(localStorage.setItem).not.toHaveBeenCalled(); - }); - it('should check if the list in local storage is an array', () => { - spyOn(localStorage, 'getItem').and.returnValue('{}'); - spyOn(localStorage, 'setItem'); - let key = 'foo'; - let storage: Storage = new Storage(key); - expect(localStorage.setItem).toHaveBeenCalled(); - }); - }); - - describe('add method', () => { - it('should add the object to the stored list', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let obj = 'foo'; - spyOn(storage, 'save'); - spyOn(storage, 'query').and.returnValue([]); - storage.add(obj); - expect(storage.query).toHaveBeenCalled(); - expect(storage.save).toHaveBeenCalledWith([obj]); - }); - }); - - describe('save method', () => { - it('should save the list to local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = ['foo']; - spyOn(localStorage, 'setItem'); - storage.save(list); - expect(localStorage.setItem).toHaveBeenCalledWith(key, JSON.stringify(list)); - }); - }); - - describe('findByAttr method', () => { - it('should retrieve an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ id: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('foo')).toBe(list[0]); - }); - - it('should retrieve an item based on the provided key from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('foo', 'val')).toBe(list[0]); - }); - - it('should return null if the item is not found', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - expect(storage.findByAttr('baz', 'val')).toBeUndefined(); - }); - }); - - describe('query method', () => { - it('should return the list from localStorage', () => { - let list = ['foo']; - let key = 'foo'; - spyOn(localStorage, 'getItem').and.returnValue(JSON.stringify(list)); - let storage: Storage = new Storage(key); - expect(storage.query()).toEqual(list); - }); - }); - - describe('removeByAttr method', () => { - it('should remove an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ id: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - spyOn(storage, 'save'); - storage.removeByAttr('foo'); - expect(storage.save).toHaveBeenCalledWith([]); - }); - - it('should remove an item from the list in local storage', () => { - let key = 'foo'; - let storage: Storage = new Storage(key); - let list = [{ val: 'foo', name: 'bar' }]; - spyOn(storage, 'query').and.returnValue(list); - spyOn(storage, 'save'); - storage.removeByAttr('foo', 'val'); - expect(storage.save).toHaveBeenCalledWith([]); - }); - }); -}); diff --git a/ui/src/app/shared/storage.ts b/ui/src/app/shared/storage.ts deleted file mode 100644 index 6672ee2d5..000000000 --- a/ui/src/app/shared/storage.ts +++ /dev/null @@ -1,36 +0,0 @@ -export class Storage { - constructor(readonly key: string) { - const list = localStorage.getItem(key); - if (!list || !Array.isArray(JSON.parse(list))) { - localStorage.setItem(key, JSON.stringify([])); - } - } - - add(obj): T[] { - const list = this.query(); - list.push(obj); - this.save(list); - return list; - } - - save(list): T[] { - localStorage.setItem(this.key, JSON.stringify(list)); - return list; - } - - findByAttr(val, attr: string = 'id'): T { - const list = this.query(); - return list.find(entity => entity[attr] === val); - } - - query(): T[] { - const list = JSON.parse(localStorage.getItem(this.key)); - return [...list]; - } - - removeByAttr(val, attr: string = 'id'): void { - const list = this.query().filter(entity => entity[attr] !== val); - this.save(list); - return null; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/shared/switch/switch.component.html b/ui/src/app/shared/switch/switch.component.html deleted file mode 100644 index cdc69e69d..000000000 --- a/ui/src/app/shared/switch/switch.component.html +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/app/shared/switch/switch.component.scss b/ui/src/app/shared/switch/switch.component.scss deleted file mode 100644 index 0571b7ce9..000000000 --- a/ui/src/app/shared/switch/switch.component.scss +++ /dev/null @@ -1,62 +0,0 @@ -@import '../../../theme/_palette'; - -:host { - - $width: 60px; - $height: 34px; - - $transition-duration: 400ms; - - $off-color: $brand-danger; - $on-color: $brand-info; - - $distance: 26px; - - & { - line-height: 1; - } - - .switch { - position: relative; - width: $width; - height: $height; - line-height: 1.5; - margin-bottom: 0px; - } - .slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: $off-color; - transition: $transition-duration; - border-radius: $height; - } - - .slider:before { - position: absolute; - content: ""; - height: 26px; - width: 26px; - left: 4px; - bottom: 4px; - background-color: $white; - transition: $transition-duration; - border-radius: 50%; - } - - input:checked + .slider { - background-color: $on-color; - } - - input:focus + .slider { - box-shadow: 0 0 1px $on-color; - } - - input:checked + .slider:before { - transform: translateX($distance); - } -} - diff --git a/ui/src/app/shared/switch/switch.component.spec.ts b/ui/src/app/shared/switch/switch.component.spec.ts deleted file mode 100644 index 52659f4df..000000000 --- a/ui/src/app/shared/switch/switch.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ViewChild, Component } from '@angular/core'; -import { ToggleSwitchComponent } from './switch.component'; - - -@Component({ - template: `` -}) -class TestHostComponent { - - foo: FormControl = new FormControl(false); - - @ViewChild(ToggleSwitchComponent, {static: true}) - public instanceUnderTest: ToggleSwitchComponent; -} - - -describe('Toggle Switch Component', () => { - let fixture: ComponentFixture; - let instance: TestHostComponent; - let cmp: ToggleSwitchComponent; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - FormsModule - ], - declarations: [ - ToggleSwitchComponent, - TestHostComponent - ], - }); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - cmp = instance.instanceUnderTest; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('value getter', () => { - it('should return the checked value', () => { - expect(cmp.value).toBe(false); - }); - }); - - describe('setDisabledState', () => { - it('should set the disabled property', () => { - cmp.setDisabledState(true); - expect(cmp.disabled).toBe(true); - }) - }); -}); diff --git a/ui/src/app/shared/switch/switch.component.ts b/ui/src/app/shared/switch/switch.component.ts deleted file mode 100644 index e51919f87..000000000 --- a/ui/src/app/shared/switch/switch.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, Input, forwardRef, HostBinding, HostListener } from '@angular/core'; -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; - -@Component({ - selector: 'toggle-switch', - templateUrl: './switch.component.html', - styleUrls: ['./switch.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => ToggleSwitchComponent), - multi: true - } - ] -}) - -export class ToggleSwitchComponent implements ControlValueAccessor { - checked = false; - - @Input() disabled = false; - @HostBinding('style.opacity') - get opacity() { - return this.disabled ? 0.25 : 1; - } - - onChange = (checked: boolean) => { }; - - onTouched = () => { }; - - get value(): boolean { - return this.checked; - } - - writeValue(checked: boolean): void { - this.checked = checked; - } - registerOnChange(fn: (checked: boolean) => void): void { - this.onChange = fn; - this.onChange(this.checked); - } - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - } -} - diff --git a/ui/src/app/shared/util.spec.ts b/ui/src/app/shared/util.spec.ts deleted file mode 100644 index 2c4e1b957..000000000 --- a/ui/src/app/shared/util.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { removeNulls, checkByType } from './util'; - -describe('removeNulls', () => { - let obj = { - foo: null, - bar: 'baz' - }, - expected = { - bar: 'baz' - }; - it(`should remove null values from the object provided`, () => { - expect(removeNulls(obj)).toEqual(expected); - }); - - it(`should return an empty object if passed a falsy value`, () => { - expect(removeNulls(undefined)).toEqual({}); - }); -}); - -describe('checkByType', () => { - it('should return false for an empty object', () => { - expect(checkByType({})).toBe(false); - }); - it('should return for a populated object', () => { - expect(checkByType({foo: 'bar'})).toBe(true); - }); - it('should return true for non-object types', () => { - expect(checkByType('foo')).toBe(true); - }); -}); diff --git a/ui/src/app/shared/util.ts b/ui/src/app/shared/util.ts deleted file mode 100644 index a5fe7f0df..000000000 --- a/ui/src/app/shared/util.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { RouterStateSerializer } from '@ngrx/router-store'; -import { RouterStateSnapshot, Params } from '@angular/router'; -import { Injectable } from "@angular/core"; - -export interface RouterStateUrl { - url: string; - queryParams: Params; -} - -@Injectable() -export class CustomRouterStateSerializer implements RouterStateSerializer { - serialize(routerState: RouterStateSnapshot): RouterStateUrl { - const { url } = routerState; - const queryParams = routerState.root.queryParams; - - return { url, queryParams }; - } -} - -export function removeNulls(attribute: any, discardObjects: boolean = false): any { - if (!attribute) { return {}; } - let removed = Object.keys(attribute).reduce((coll, val, index) => { - if (attribute[val] !== null) { - if (!discardObjects || checkByType(attribute[val])) { - coll[val] = attribute[val]; - } - } - return coll; - }, {}); - return removed; -} - -export function checkByType(value): boolean { - switch (typeof value) { - case 'object': { - return Object.keys(value).filter(k => !!value[k]).length > 0; - } - default: { - return true; - } - } -} - -export function pick(approvedProperties: string[]): Function { - return (original) => - Object.keys(original) - .filter((key) => approvedProperties.indexOf(key) > -1) - .reduce((newObj, key) => { - let value = original[key]; - newObj[key] = value; - return newObj; - }, {}); -} - -export function array_move(arr, old_index, new_index): any[] { - if (new_index >= arr.length) { - let k = new_index - arr.length + 1; - while (k--) { - arr.push(undefined); - } - } - arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); - return arr; -} - -export function getCurrentLanguage(navigator: any = null): string { - return getCurrentLocale(navigator).split('-', 1)[0]; -} - -export function getCurrentCountry(navigator: any = null): string { - return getCurrentLocale(navigator).split('-', 1)[1]; -} - -export function getCurrentLocale(nav: any = null): string { - nav = nav || navigator; - const getLocaleId = (lang: string) => lang.trim(); - // supported regional languages - const supportedLanguages: string[] = ['en', 'es', 'en-US', 'es-ES'].map(lang => getLocaleId(lang)); - // language code without regional details - const shortSupportedLanguages: string[] = supportedLanguages.map(lang => lang.substring(0, 2)); - - // look for an exact match to a regional translation - let preferredLanguage = getLocaleId(nav.language); - if (supportedLanguages.includes(preferredLanguage)) { - return preferredLanguage; - } - - // for language only match, no regional details - let shortPreferredLanguage: string = preferredLanguage.substring(0, 2); - let index = shortSupportedLanguages.indexOf(shortPreferredLanguage); - if (index > -1) { - return supportedLanguages[index]; - } - - // not all browsers share full language list - if (nav.languages instanceof Array) { - // get list of all languages user understands, check for an exact regional match - const allPreferredLanugages: string[] = nav.languages.map(lang => getLocaleId(lang)); - preferredLanguage = allPreferredLanugages.find(language => supportedLanguages.includes(language)); - if (preferredLanguage) { - return preferredLanguage; - } - - // from list of all languages user understand, check for language only match - const shortAllPreferredLanugages: string[] = allPreferredLanugages.map(language => language.substring(0, 2)); - index = shortAllPreferredLanugages.findIndex(language => shortSupportedLanguages.includes(language)); - if (index > -1) { - return supportedLanguages[index]; - } - } - - // if no match has been found return first (default) language - return supportedLanguages[0]; -} diff --git a/ui/src/app/shared/validation/regex.validator.spec.ts b/ui/src/app/shared/validation/regex.validator.spec.ts deleted file mode 100644 index 4835efd94..000000000 --- a/ui/src/app/shared/validation/regex.validator.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RegexValidator } from './regex.validator'; - -describe('RegexValidator', () => { - describe('isValidRegex method', () => { - it('should return true if no error is thrown', () => { - expect(RegexValidator.isValidRegex('/abc/')).toBe(true); - expect(RegexValidator.isValidRegex('/*123/')).toBe(true); - }); - - it('should return false if an error is thrown trying to construct a regex', () => { - expect(RegexValidator.isValidRegex(')')).toBe(false); - }); - - it('should return true even if the regex doesnt begin and end with slashes', () => { - expect(RegexValidator.isValidRegex('abc')).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/validation/regex.validator.ts b/ui/src/app/shared/validation/regex.validator.ts deleted file mode 100644 index f05fadf8d..000000000 --- a/ui/src/app/shared/validation/regex.validator.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class RegexValidator { - static isValidRegex(pattern: string): boolean { - if (!pattern) { - return false; - } - let regex; - try { - regex = new RegExp(pattern); - } catch (err) { - return false; - } - return true; - } -} - -export default RegexValidator; diff --git a/ui/src/app/shared/validation/uri.validator.spec.ts b/ui/src/app/shared/validation/uri.validator.spec.ts deleted file mode 100644 index 617971831..000000000 --- a/ui/src/app/shared/validation/uri.validator.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { UriValidator } from './uri.validator'; -import { FormControl } from '@angular/forms'; - -describe('UriValidator class', () => { - describe('isUri method', () => { - it('should return false if invalid', () => { - expect(UriValidator.isUri('foo')).toBe(false); - }); - - it('should return true if valid', () => { - expect(UriValidator.isUri('http://foo.bar')).toBe(true); - }); - }); - - describe('uri method', () => { - it('should return a validation object if invalid', () => { - let form: FormControl = new FormControl('foo'); - expect(UriValidator.uri(form)).toEqual({uri: true}); - }); - - it('should return null if valid', () => { - let form: FormControl = new FormControl('http://goo.gle'); - expect(UriValidator.uri(form)).toBeNull(); - }); - }); -}); diff --git a/ui/src/app/shared/validation/uri.validator.ts b/ui/src/app/shared/validation/uri.validator.ts deleted file mode 100644 index 243a099ad..000000000 --- a/ui/src/app/shared/validation/uri.validator.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AbstractControl, ValidationErrors } from '@angular/forms'; - -export class UriValidator { - static uri(control: AbstractControl): ValidationErrors | null { - return UriValidator.isUri(control.value) ? null : { uri: true }; - } - - static isUri(value: string): boolean { - try { - let url = new URL(value); - } catch (err) { - return false; - } - return true; - } -} - -export default UriValidator; diff --git a/ui/src/app/shared/validation/validation-class.directive.spec.ts b/ui/src/app/shared/validation/validation-class.directive.spec.ts deleted file mode 100644 index ab662feb5..000000000 --- a/ui/src/app/shared/validation/validation-class.directive.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, DebugElement } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormsModule, NgControl, AbstractControl } from '@angular/forms'; -import { ValidationClassDirective } from './validation-class.directive'; - -import * as constants from '../../shared/constant'; - -@Component({ - template: `` -}) -class TestComponent { - foo = ''; -} - -describe('Validation Classes Directive', () => { - let component: TestComponent; - let fixture: ComponentFixture; - let inputEl: DebugElement; - let ctrl: AbstractControl; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [], - imports: [ - FormsModule, - ReactiveFormsModule - ], - declarations: [ - ValidationClassDirective, - TestComponent - ], - }); - - fixture = TestBed.createComponent(TestComponent); - inputEl = fixture.debugElement.query(By.css('input')); - ctrl = inputEl.injector.get(NgControl).control; - fixture.detectChanges(); - }); - - describe('directive', () => { - it('should compile', () => { - expect(inputEl).toBeDefined(); - }); - }); - - describe('validation classes', () => { - it('should add the is-invalid class when the control is invalid and has been touched', () => { - ctrl.markAsTouched(); - fixture.detectChanges(); - expect(inputEl.classes['is-invalid']).toBe(true); - }); - - it('should add the is-valid class when the control is valid and has been touched', () => { - ctrl.markAsTouched(); - ctrl.setValue('foo'); - fixture.detectChanges(); - expect(inputEl.classes['is-valid']).toBe(true); - }); - }); -}); diff --git a/ui/src/app/shared/validation/validation-class.directive.ts b/ui/src/app/shared/validation/validation-class.directive.ts deleted file mode 100644 index 5459731c9..000000000 --- a/ui/src/app/shared/validation/validation-class.directive.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Directive, Self, HostBinding, Input } from '@angular/core'; -import { NgControl } from '@angular/forms'; - -@Directive({ - selector: '[formControlName],[ngModel],[formControl]' -}) -export class ValidationClassDirective { - public constructor( - @Self() private ngCtrl: NgControl - ) { } - - @Input() disableValidation = false; - - @HostBinding('class.is-invalid') - get hasErrors() { - const ctrl = this.ngCtrl.control; - return (ctrl.invalid && this.isTouched) && !this.disableValidation; - } - - @HostBinding('class.is-valid') - get hasSuccess() { - const ctrl = this.ngCtrl.control; - return (ctrl.valid && this.isTouched) && !this.disableValidation; - } - - get isTouched() { - const ctrl = this.ngCtrl.control; - return ctrl.touched; - } -} /* istanbul ignore next */ diff --git a/ui/src/app/wizard/action/wizard.action.ts b/ui/src/app/wizard/action/wizard.action.ts deleted file mode 100644 index 3e630f1a1..000000000 --- a/ui/src/app/wizard/action/wizard.action.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Action } from '@ngrx/store'; -import { Wizard } from '../model'; - -export enum WizardActionTypes { - SET_INDEX = '[Wizard] Set Index', - SET_DEFINITION = '[Wizard] Set Definition', - UPDATE_DEFINITION = '[Wizard] Update Definition', - SET_DISABLED = '[Wizard] Set Disabled', - - ADD_SCHEMA = '[Wizard] Add Schema', - - NEXT = '[Wizard] Next Page', - PREVIOUS = '[Wizard] Previous Page', - - CLEAR = '[Wizard] Clear', - - LOAD_SCHEMA_REQUEST = '[Wizard] Load Schema Request', - LOAD_SCHEMA_SUCCESS = '[Wizard] Load Schema Success', - LOAD_SCHEMA_FAIL = '[Wizard] Load Schema Fail', - - LOCK = '[Wizard] Lock', - UNLOCK = '[Wizard] Unlock' -} - -export class SetIndex implements Action { - readonly type = WizardActionTypes.SET_INDEX; - - constructor(public payload: string) { } -} - -export class SetDefinition implements Action { - readonly type = WizardActionTypes.SET_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class UpdateDefinition implements Action { - readonly type = WizardActionTypes.UPDATE_DEFINITION; - - constructor(public payload: Wizard) { } -} - -export class SetDisabled implements Action { - readonly type = WizardActionTypes.SET_DISABLED; - - constructor(public payload: boolean) { } -} - -export class Next implements Action { - readonly type = WizardActionTypes.NEXT; - - constructor(public payload: string) { } -} - -export class Previous implements Action { - readonly type = WizardActionTypes.PREVIOUS; - - constructor(public payload: string) { } -} - -export class ClearWizard implements Action { - readonly type = WizardActionTypes.CLEAR; -} - -export class LoadSchemaRequest implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_REQUEST; - - constructor(public payload: string) { } -} - -export class LoadSchemaSuccess implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_SUCCESS; - - constructor(public payload: any) { } -} - -export class LoadSchemaFail implements Action { - readonly type = WizardActionTypes.LOAD_SCHEMA_FAIL; - - constructor(public payload: Error) { } -} - -export class LockEditor implements Action { - readonly type = WizardActionTypes.LOCK; -} - -export class UnlockEditor implements Action { - readonly type = WizardActionTypes.UNLOCK; -} - -export type WizardActionUnion = - | SetIndex - | SetDefinition - | UpdateDefinition - | SetDisabled - | Next - | Previous - | ClearWizard - | LoadSchemaRequest - | LoadSchemaSuccess - | LoadSchemaFail - | LockEditor - | UnlockEditor; diff --git a/ui/src/app/wizard/component/wizard.component.html b/ui/src/app/wizard/component/wizard.component.html deleted file mode 100644 index aca2a1e2e..000000000 --- a/ui/src/app/wizard/component/wizard.component.html +++ /dev/null @@ -1,63 +0,0 @@ - diff --git a/ui/src/app/wizard/component/wizard.component.scss b/ui/src/app/wizard/component/wizard.component.scss deleted file mode 100644 index fe24b9a93..000000000 --- a/ui/src/app/wizard/component/wizard.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -:host { - .nav.nav-wizard { - justify-content: start; - - .nav-item { - &:last-child { - &:first-child { - margin-left: 0px; - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/app/wizard/component/wizard.component.spec.ts b/ui/src/app/wizard/component/wizard.component.spec.ts deleted file mode 100644 index c694cbf91..000000000 --- a/ui/src/app/wizard/component/wizard.component.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { TestBed, ComponentFixture, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; - -import * as fromWizard from '../reducer'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { WizardComponent } from './wizard.component'; -import { WizardService } from '../service/wizard.service'; -import { MockI18nModule } from '../../../testing/i18n.stub'; - -@Component({ - template: ` - - ` -}) -class TestHostComponent { - @ViewChild(WizardComponent, {static: true}) - public componentUnderTest: WizardComponent; -} - -describe('Wizard Component', () => { - - let fixture: ComponentFixture; - let instance: TestHostComponent; - let app: WizardComponent; - let store: Store; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - NgbDropdownModule, - RouterTestingModule, - StoreModule.forRoot({ - wizard: combineReducers(fromWizard.reducers) - }), - MockI18nModule - ], - declarations: [ - WizardComponent, - TestHostComponent - ], - providers: [ - WizardService - ] - }).compileComponents(); - - store = TestBed.get(Store); - spyOn(store, 'dispatch'); - - fixture = TestBed.createComponent(TestHostComponent); - instance = fixture.componentInstance; - app = instance.componentUnderTest; - fixture.detectChanges(); - })); - - it('should compile without error', () => { - expect(app).toBeTruthy(); - }); -}); diff --git a/ui/src/app/wizard/component/wizard.component.ts b/ui/src/app/wizard/component/wizard.component.ts deleted file mode 100644 index 1b7103c93..000000000 --- a/ui/src/app/wizard/component/wizard.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Wizard, WizardStep } from '../model'; -import * as fromWizard from '../reducer'; -import { Observable } from 'rxjs'; -import { withLatestFrom, map } from 'rxjs/operators'; -import { WizardService } from '../service/wizard.service'; - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard', - templateUrl: './wizard.component.html', - styleUrls: ['./wizard.component.scss'] -}) -export class WizardComponent { - @Output() onNext = new EventEmitter(); - @Output() onPrevious = new EventEmitter(); - @Output() onLast = new EventEmitter(); - @Output() onSave = new EventEmitter(); - - currentPage: any = {}; - previousPage: any = {}; - nextPage: any = {}; - - index$: Observable; - disabled$: Observable; - definition$: Observable>; - - previous$: Observable; - next$: Observable; - current$: Observable; - last$: Observable; - - currentIcon$: Observable; - - icons = this.service.icons; - - constructor( - private store: Store, - private service: WizardService - ) { - this.index$ = this.store.select(fromWizard.getWizardIndex); - this.definition$ = this.store.select(fromWizard.getWizardDefinition); - this.disabled$ = this.store.select(fromWizard.getWizardIsDisabled); - this.previous$ = this.store.select(fromWizard.getPrevious); - this.next$ = this.store.select(fromWizard.getNext); - this.current$ = this.store.select(fromWizard.getCurrent); - this.last$ = this.store.select(fromWizard.getLast); - - this.currentIcon$ = this.current$.pipe( - withLatestFrom(this.last$), - map(([current, last]) => this.service.getIcon(current, last)) - ); - } -} diff --git a/ui/src/app/wizard/model/form-definition.ts b/ui/src/app/wizard/model/form-definition.ts deleted file mode 100644 index 5e3cbb6ea..000000000 --- a/ui/src/app/wizard/model/form-definition.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Selector } from '@ngrx/store'; - -export interface FormDefinition { - label: string; - type: string; - schema: string; - bindings?: any; - validatorParams: any; - getEntity?(entity: any): any; - parser(changes: Partial, schema?: any); - formatter(changes: Partial, schema?: any); - getValidators?(...args: any[]): { [key: string]: any }; - schemaPreprocessor?(schema: any): any; -} diff --git a/ui/src/app/wizard/model/index.ts b/ui/src/app/wizard/model/index.ts deleted file mode 100644 index b42933239..000000000 --- a/ui/src/app/wizard/model/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './wizard'; -export * from './form-definition'; diff --git a/ui/src/app/wizard/model/wizard.ts b/ui/src/app/wizard/model/wizard.ts deleted file mode 100644 index 5729c4f24..000000000 --- a/ui/src/app/wizard/model/wizard.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { FormDefinition } from './form-definition'; - -export interface Wizard extends FormDefinition { - steps: WizardStep[]; - schema: string; -} - -export interface WizardStep { - id: string; - label: string; - initialValues?: WizardValue[]; - index: number; - locked?: boolean; - fields?: string[]; - fieldsets?: WizardFieldset[]; - summary?: boolean; - override?: any; - order?: string[]; -} - -export interface WizardFieldset { - type: string; - class?: string[]; - fields: (string | WizardFieldsubset)[]; -} - -export interface WizardValue { - key: string; - value: any; -} - -export interface WizardFieldsubset { - parent: string; - children: string[]; -} diff --git a/ui/src/app/wizard/reducer/index.spec.ts b/ui/src/app/wizard/reducer/index.spec.ts deleted file mode 100644 index 5f72dd71f..000000000 --- a/ui/src/app/wizard/reducer/index.spec.ts +++ /dev/null @@ -1,165 +0,0 @@ -import * as selectors from './'; -import { FileBackedHttpMetadataProviderWizard } from '../../metadata/provider/model'; - -describe('wizard index selectors', () => { - describe('getSchema method', () => { - it('should return the schema by index name', () => { - expect( - selectors.getSchemaPath(FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.schema); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getSchemaPath(null) - ).toBeFalsy(); - }); - }); - describe('getPreviousFn method', () => { - it('should return the previous step', () => { - expect( - selectors.getPreviousFn('reloading', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[0]); - }); - it('should return null if the index is the first step', () => { - expect( - selectors.getPreviousFn('common', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getPreviousFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getNextFn method', () => { - it('should return the previous step', () => { - expect( - selectors.getNextFn('common', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[1]); - }); - it('should return null if the index is the last step', () => { - expect( - selectors.getNextFn('summary', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getNextFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getCurrentFn method', () => { - it('should return the current step', () => { - expect( - selectors.getCurrentFn('common', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps[0]); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getCurrentFn('common', null) - ).toBeFalsy(); - }); - }); - - describe('getLastFn method', () => { - it('should return the last step', () => { - expect( - selectors.getLastFn('summary', FileBackedHttpMetadataProviderWizard) - ).toBe(FileBackedHttpMetadataProviderWizard.steps.find(step => step.id === 'summary')); - }); - it('should return nothing if no definition is provided', () => { - expect( - selectors.getLastFn('common', null) - ).toBeFalsy(); - }); - it('should return nothing if no schema is found', () => { - expect( - selectors.getLastFn('common', FileBackedHttpMetadataProviderWizard) - ).toBeFalsy(); - }); - }); - - describe('getModelFn method', () => { - it('should return the model', () => { - const step = FileBackedHttpMetadataProviderWizard.steps.find(s => s.id === 'common'); - expect(selectors.getModelFn(step)).toEqual({}); - }); - }); - - describe(`reducer/selector logic functions`, () => { - - describe('getSchemaParseFn', () => { - const schema = { - properties: { - foo: { - type: 'string' - } - } - }; - const schema2 = { - properties: { - foo: { - type: 'object', - properties: { - bar: { - type: 'string' - } - } - } - } - }; - it('should lock all properties', () => { - expect(selectors.getSchemaParseFn(schema, true)).toEqual({ - ...schema, - properties: { - ...schema.properties, - foo: { - ...schema.properties.foo, - readOnly: true - } - } - }); - }); - - it('should unlock all properties', () => { - expect(selectors.getSchemaParseFn(schema, false)).toEqual({ - ...schema, - properties: { - ...schema.properties, - foo: { - type: 'string', - readOnly: false - } - } - }); - }); - - it('should lock child properties properties', () => { - expect(selectors.getSchemaParseFn(schema2, true)).toEqual({ - ...schema, - properties: { - ...schema2.properties, - foo: { - ...schema2.properties.foo, - readOnly: true, - properties: { - bar: { - ...schema2.properties.foo.properties.bar, - readOnly: true - } - } - } - } - }); - }); - }); - - describe('getSchemaLockedFn', () => { - it('should return true if the step is locked', () => { - expect(selectors.getSchemaLockedFn({ locked: true }, false)).toEqual(false); - }); - }); - }); -}); diff --git a/ui/src/app/wizard/reducer/index.ts b/ui/src/app/wizard/reducer/index.ts deleted file mode 100644 index ca4cdb0f7..000000000 --- a/ui/src/app/wizard/reducer/index.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as fromRoot from '../../app.reducer'; -import * as fromWizard from './wizard.reducer'; -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { Wizard, WizardStep } from '../model'; - -export interface WizardState { - wizard: fromWizard.State; -} - -export const reducers = { - wizard: fromWizard.reducer, -}; - -export interface State extends fromRoot.State { - 'wizard': WizardState; -} - -export function getSchemaParseFn(schema, locked): any { - if (!schema || !schema.properties) { - return schema; - } - return { - ...schema, - properties: Object.keys(schema.properties).reduce((prev, current) => { - return { - ...prev, - [current]: { - ...schema.properties[current], - readOnly: locked, - ...(schema.properties[current].hasOwnProperty('properties') ? - getSchemaParseFn(schema.properties[current], locked) : - {} - ) - } - }; - }, {}) - }; -} - -export const getWizardState = createFeatureSelector('wizard'); -export const getWizardStateFn = (state: WizardState) => state.wizard; -export const getState = createSelector(getWizardState, getWizardStateFn); - -export const getWizardIndex = createSelector(getState, fromWizard.getIndex); -export const getWizardIsDisabled = createSelector(getState, fromWizard.getDisabled); -export const getWizardDefinition = createSelector(getState, fromWizard.getDefinition); - -export const getSchemaPath = (wizard: Wizard) => wizard ? wizard.schema : null; - -export const getSplitSchema = (schema: any, step: WizardStep) => { - if (!schema || !step || !step.fields || !step.fields.length || !schema.properties) { - return schema; - } - const keys = Object.keys(schema.properties).filter(key => step.fields.indexOf(key) > -1); - const required = (schema.required || []).filter(val => keys.indexOf(val) > -1); - let s: any = { - type: schema.type, - properties: { - ...keys.reduce( (properties, key) => ({ ...properties, [key]: schema.properties[key] }) , {}) - } - }; - - if (step.override) { - Object.keys(step.override).forEach(key => { - let override = step.override[key]; - if (s.properties.hasOwnProperty(key)) { - s.properties[key] = { ...s.properties[key], ...override }; - } - }); - } - - if (step.order) { - s.order = step.order; - } - - if (schema.definitions) { - s.definitions = schema.definitions; - } - if (required && required.length) { - s.required = required; - } - if (step.fieldsets) { - s.fieldsets = step.fieldsets; - } - - return s; -}; - -export const getCurrentWizardSchema = createSelector(getWizardDefinition, getSchemaPath); - -export const getPreviousFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.findIndex(s => s.id === index); - return wizard.steps[step - 1]; -}; - -export const getNextFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.findIndex(s => s.id === index); - return wizard.steps[step + 1]; -}; - -export const getCurrentFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - return wizard.steps.find(s => s.id === index); -}; - -export const getLastFn = (index: string, wizard: Wizard) => { - if (!wizard) { return null; } - const step = wizard.steps.length > 1 && wizard.steps[wizard.steps.length - 1]; - return index === step.id ? step : null; -}; - -export const getModelFn = (currentStep: WizardStep) => { - const model = (currentStep && currentStep.initialValues) ? currentStep.initialValues : []; - return model.reduce((m, property) => ({...m, [property.key]: property.value }), {}); -}; - -export const getPrevious = createSelector(getWizardIndex, getWizardDefinition, getPreviousFn); -export const getCurrent = createSelector(getWizardIndex, getWizardDefinition, getCurrentFn); -export const getNext = createSelector(getWizardIndex, getWizardDefinition, getNextFn); -export const getLast = createSelector(getWizardIndex, getWizardDefinition, getLastFn); -export const getModel = createSelector(getCurrent, getModelFn); - -export const getRoutes = createSelector(getWizardDefinition, d => d ? d.steps.map(step => ({ path: step.id, label: step.label })) : [] ); - -export const getLockedStatus = createSelector(getState, fromWizard.getLocked); -export const getSchemaLockedFn = (step, locked) => step ? step.locked ? locked : false : false; -export const getLocked = createSelector(getCurrent, getLockedStatus, getSchemaLockedFn); - -export const getSchemaProcessedFn = (schema, definition) => - definition && definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema; - -export const getSchemaObject = createSelector(getState, fromWizard.getSchema); -export const getProcessedSchema = createSelector(getSchemaObject, getWizardDefinition, getSchemaProcessedFn); -export const getParsedSchema = createSelector(getProcessedSchema, getLocked, getSchemaParseFn); - -export const getSchema = createSelector(getParsedSchema, getCurrent, getSplitSchema); - -export const getWizardDefinitionValidationParams = createSelector(getWizardDefinition, def => def.validatorParams); - -export const getValidators = (params: any) => createSelector(getWizardDefinition, (definition) => { - return definition.getValidators(...params); -}); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts b/ui/src/app/wizard/reducer/wizard.reducer.spec.ts deleted file mode 100644 index 8276a2d68..000000000 --- a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { reducer, initialState as snapshot } from './wizard.reducer'; -import * as selectors from './wizard.reducer'; -import { - WizardActionTypes, - ClearWizard, - SetDisabled, - SetDefinition, - SetIndex, - LockEditor, - LoadSchemaRequest, - LoadSchemaFail, - LoadSchemaSuccess, - UnlockEditor, - UpdateDefinition -} from '../action/wizard.action'; -import { SCHEMA } from '../../../testing/form-schema.stub'; -import { MetadataProviderWizard, FileBackedHttpMetadataProviderWizard } from '../../metadata/provider/model'; - - - -describe('Wizard Reducer', () => { - describe('undefined action', () => { - it('should return the default state', () => { - const result = reducer(snapshot, {} as any); - - expect(result).toEqual(snapshot); - }); - }); - - describe(`${WizardActionTypes.CLEAR}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new ClearWizard())).toEqual(snapshot); - }); - }); - - describe(`${WizardActionTypes.SET_DISABLED}`, () => { - it('should set the disabled property on the wizard', () => { - expect(reducer(snapshot, new SetDisabled(true)).disabled).toBe(true); - expect(reducer(snapshot, new SetDisabled(false)).disabled).toBe(false); - }); - }); - - describe(`${WizardActionTypes.SET_DEFINITION}`, () => { - it('should set the definition property on the wizard', () => { - expect(reducer(snapshot, new SetDefinition(MetadataProviderWizard)).definition).toBe(MetadataProviderWizard); - }); - }); - - describe(`${WizardActionTypes.SET_INDEX}`, () => { - it('should set the definition property on the wizard', () => { - expect(reducer(snapshot, new SetIndex(MetadataProviderWizard.steps[0].id)).index).toBe('new'); - }); - }); - - describe(`${WizardActionTypes.SET_INDEX}`, () => { - let state = reducer(snapshot, new SetDefinition(MetadataProviderWizard)); - it('should set the definition property on the wizard', () => { - expect(reducer(state, new UpdateDefinition(FileBackedHttpMetadataProviderWizard))).toEqual({ - ...state, - definition: { - ...MetadataProviderWizard, - ...FileBackedHttpMetadataProviderWizard, - steps: [ - ...MetadataProviderWizard.steps, - ...FileBackedHttpMetadataProviderWizard.steps - ] - } - }); - }); - }); - - describe(`${WizardActionTypes.LOCK}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LockEditor())).toEqual({ ...snapshot, locked: true }); - }); - }); - - describe(`${WizardActionTypes.UNLOCK}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new UnlockEditor())).toEqual({ ...snapshot, locked: false }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_REQUEST}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaRequest('foo'))).toEqual({ ...snapshot, schemaPath: 'foo', loading: true }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_FAIL}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaFail(new Error('fail')))).toEqual({ ...snapshot }); - }); - }); - - describe(`${WizardActionTypes.LOAD_SCHEMA_REQUEST}`, () => { - it('should reset to initial state', () => { - expect(reducer(snapshot, new LoadSchemaSuccess({}))).toEqual({ ...snapshot, schema: {} }); - }); - }); - - describe('selector functions', () => { - it('should return pieces of state', () => { - expect(selectors.getDefinition(snapshot)).toEqual(snapshot.definition); - expect(selectors.getDisabled(snapshot)).toEqual(snapshot.disabled); - expect(selectors.getIndex(snapshot)).toEqual(snapshot.index); - }); - }); -}); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.ts b/ui/src/app/wizard/reducer/wizard.reducer.ts deleted file mode 100644 index 819a82533..000000000 --- a/ui/src/app/wizard/reducer/wizard.reducer.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Wizard } from '../model'; -import { WizardActionUnion, WizardActionTypes } from '../action/wizard.action'; - -export interface State { - index: string; - disabled: boolean; - definition: Wizard; - schemaPath: string; - loading: boolean; - schema: any; - locked: boolean; -} - -export const initialState: State = { - index: null, - disabled: false, - definition: null, - schemaPath: null, - loading: false, - schema: null, - locked: false -}; - -export function reducer(state = initialState, action: WizardActionUnion): State { - switch (action.type) { - case WizardActionTypes.LOAD_SCHEMA_REQUEST: { - return { - ...state, - loading: true, - schemaPath: action.payload - }; - } - case WizardActionTypes.LOAD_SCHEMA_SUCCESS: { - return { - ...state, - loading: false, - schema: action.payload - }; - } - case WizardActionTypes.LOAD_SCHEMA_FAIL: { - return { - ...state, - loading: false, - schema: initialState.schema - }; - } - - case WizardActionTypes.LOCK: { - return { - ...state, - locked: true - }; - } - - case WizardActionTypes.UNLOCK: { - return { - ...state, - locked: false - }; - } - case WizardActionTypes.SET_DISABLED: { - return { - ...state, - disabled: action.payload - }; - } - case WizardActionTypes.SET_INDEX: { - return { - ...state, - index: action.payload - }; - } - case WizardActionTypes.SET_DEFINITION: { - return { - ...state, - definition: action.payload - }; - } - case WizardActionTypes.UPDATE_DEFINITION: { - const current = state.definition; - return { - ...state, - definition: { - ...current, - ...action.payload, - steps: [ - ...current.steps, - ...action.payload.steps - ] - } - }; - } - case WizardActionTypes.CLEAR: { - return { - ...initialState - }; - } - default: { - return state; - } - } -} - -export const getSchema = (state: State) => state.schema; -export const getLocked = (state: State) => state.locked; - -export const getIndex = (state: State) => state.index; -export const getDisabled = (state: State) => state.disabled; -export const getDefinition = (state: State) => state.definition; diff --git a/ui/src/app/wizard/service/wizard.service.spec.ts b/ui/src/app/wizard/service/wizard.service.spec.ts deleted file mode 100644 index f7aa204cd..000000000 --- a/ui/src/app/wizard/service/wizard.service.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { WizardService, ICONS } from './wizard.service'; -import { TestBed } from '@angular/core/testing'; - -describe('Wizard Service', () => { - let service: WizardService; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - WizardService - ] - }); - - service = TestBed.get(WizardService); - }); - - describe('getIcon method', () => { - it('should return the check string for the last index', () => { - expect(service.getIcon({ index: 'foo' }, { index: 'foo' })).toEqual(ICONS.CHECK); - }); - it('should return the index icon for other indexes', () => { - expect(service.getIcon({ index: 'foo' }, { index: 'bar' })).toEqual(ICONS.INDEX); - expect(service.getIcon({ index: 'foo' }, null)).toEqual(ICONS.INDEX); - }); - }); -}); diff --git a/ui/src/app/wizard/service/wizard.service.ts b/ui/src/app/wizard/service/wizard.service.ts deleted file mode 100644 index 83eebe089..000000000 --- a/ui/src/app/wizard/service/wizard.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; - - -export enum ICONS { - CHECK = 'CHECK', - INDEX = 'INDEX' -} - -@Injectable() -export class WizardService { - - public icons = ICONS; - - constructor() { } - - getIcon(current, last): string { - return (last && current.index === last.index) ? ICONS.CHECK : ICONS.INDEX; - } -} diff --git a/ui/src/app/wizard/wizard.module.spec.ts b/ui/src/app/wizard/wizard.module.spec.ts deleted file mode 100644 index 547090d8f..000000000 --- a/ui/src/app/wizard/wizard.module.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { WizardModule } from './wizard.module'; -import { TestBed } from '@angular/core/testing'; -import { WizardService } from './service/wizard.service'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -describe('Wizard Module', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({}), - EffectsModule.forRoot([]), - WizardModule.forRoot() - ] - }); - }); - - it('should compile', () => { - expect(TestBed.get(WizardService)).toBeDefined(); - }); -}); diff --git a/ui/src/app/wizard/wizard.module.ts b/ui/src/app/wizard/wizard.module.ts deleted file mode 100644 index 75fdb7e39..000000000 --- a/ui/src/app/wizard/wizard.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { WizardComponent } from './component/wizard.component'; -import { reducers } from './reducer'; -import { I18nModule } from '../i18n/i18n.module'; -import { WizardService } from './service/wizard.service'; - -@NgModule({ - declarations: [ - WizardComponent - ], - entryComponents: [], - imports: [ - CommonModule, - I18nModule - ], - exports: [ - WizardComponent - ] -}) -export class WizardModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootWizardModule, - providers: [WizardService] - }; - } -} - -@NgModule({ - imports: [ - WizardModule, - StoreModule.forFeature('wizard', reducers), - EffectsModule.forFeature([]), - ], -}) -export class RootWizardModule { } diff --git a/ui/src/assets/favicon-96x96.png b/ui/src/assets/favicon-96x96.png deleted file mode 100644 index e19516fff44f2ee7d0a432dc542424d98bf30aac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12383 zcmZ{~1yEc~&^EfbyGw9)*97pQ8xYMu%gX@X|N9j6R;EJlptvaLxj}1%|0!}{2QdJEeL+!1Qrr92MZTB6 z(NcO`=x2U|%2 znb^E5-mww=a?`aP$Uk}dYJBp?ZRYn?A}f*7@6Vx@!+tG+{iXG8k9u4B4h_AYol?x@ zPimdO5~EARmv@eLlx?2LBMJ#V(u3pq($@BNlgo-1quWlTxrK!xJhhL5hts)DY-g^5 zN6s0upMtx(L?$K$@BXYioSd9=ZcIPt9=Ksp5ypPoAIEv=y&xAimUML7JaAgrVhe+% z!i~m`mqY5k+1%VbUu%g)KtmlL*FN9s51JcFN=vDzU=R@zAs(L!7=Te=X6EEPs;(?B z|M%wuA0Hofw9H$*pKPfHYzUx9_Z%QDb}5w6tM3v=O{+hsv6ono)A4z+d+qJ|v%} zNDHSf9mTpt){`|CHaFvEk1USoifw;YwlqDR0e73mC`#+=6S^8 zTwQtUzYFj*&o-OwQFL{)_x#p2RK+rOrooI1lc16iB8N`l@87?TY+>q5!Db_k>p!2u zSiML<@}Z|FiJkSEFPsi*as`U-B%KggTXuV@|3UI z0O&OIdVTrTKHjh

K)c3A>F?OpvMvV8kHdrLG60h|X6)*2y z3)aBd1CQS_Tj1lpKn|&Iwg7vfR(gIMdG^c_S}b_nWlyouti=u)BP|UXe|j1QlhS?| znPinO1X7$_aA|p8WtoEKh>!I!x7ZrH^>QeZq9Zn@4vQeb7K zx4eZQp#)B*m49Ap2n6*7kagZfkPjtW`gUDR6?}>;D=V8719WfB#F6lNpH|EK4(d;6 zZU!ntcH>uAQ6e$UJ>z$Gs;3G~#%uL_=;%eR|IwWPUK;tcxdxFH;q z$A&bmg4xw|mn9g)Tzt&^gC()?v21kFjIi{UPpKJSyhnvQ0R6=sW7SdQx*c??KsS`Z zZs7BBQwW*&4VKp-;BMl}4|>_bsZhV$5pW-9E4S?(Xf-SHP(X#6!QQv~W##ynn>N6=+EMDc_8SBcAMv zcyM1)Z?WKJ+hx{b&JV0BX^73p$k1sgcBu;J4&X!w!grjkaR?sEH?G?Da z-H6Lh2jw}SF_ESyc;x5rCby7?_GOL8pm|AUrQxS)ltQw(-OwEaNS&QUhL6*jWUFEO zO>X|oYctFk%{nCx7xNA67=LXD%+AXrC*&}U+H|7C{)C}~EW&tqIK4MYmeG8;w8aZtHM{Kfg0-_# znV7-KUf3=Q0?rpSLAEHga;$uHs9LZidtKO} z=Z1s5kBLY3)qAz;?S;*3l5VUD@`QMdDsM7pkI()+cQc~oqMmWjfF%;VxTsCxz5O}wlff)r zKTBmD`@lteyctlDCEA#*y^dJX!$WYPnF|B17+y(_iCH+X1P_>^L9c;b*)-!(h5ENe zs|>;JB$V62h+McDaum5|!;jk{msC(7M~6Fl;5zoM!u+GA#^=wP%`>F%O(t|qTE&Ba zo!=l^pfzkgV|c_IqZ0EC(fg2n)#ukF99Eq5Ny<)-&Tom=YgpOct?qO!8@ zlyBFO{#Sm~1uuyzoQJ#%pfAu(bSj?aS8_ZFHPNMW~$zY??Puyxk9a$uMy04A17Z!Ht%A z+783=KFr?I@HzxkEJ>HOM571sV;OR0^Xm^g;LXw7UTO3+8fXSiOb=tlZO;%OXs@_8 zn+33IRc;L?QA;Cgi-%!KAWIq>QwR%pmQ{9UiHahXf&M=HETgkaOZbeymewkvk4#-% z^PsV{njpGV@&i>$60SHK*=+u|QfadFY}a?4t4{Q5Cmx@6-yoE!LZNBtEOVa{CMmP&Y7`e0%llu$L68p&(T&(Wxw@jjCs6V~vP_ zw*qm}p{Obf5f`^NTwEjt_jSvg**oY6sNPJ#fVd-QsN@C#a(?I;E zKlIUac{uxTORY(NLB8lp%hRZTpUWfPazlf;LTje%iRXd{pEi7#ubEp5XwrslT*Lp) zc<>A4MYoT`IB>eizdLpPQhyL?zmW_D!!W5xPpR*xJDSixhDr?1_ z=qd8ID^3G9!is8**%VdY^OTK`oDsD0p}jrjf#y9z8xmWayt5KGOg%IAh4C0{94zf& zBQd)zNT=ByU;eK2)6mk6uJmyyffk};N6t#$3&TPO~I{x1N3Y0p$8J29vz%W5$!#IPDMp{2z| zQdouZNa}Y08Qd5uZf7#kfBTf?FEFRXpAoDt4+zFOZY0?Zo57+o(4G1Rl|)FxMN-?| zGXEB*J;A)^@zNJb6cdRhf$(tA!Wah~Fv-b^R#U_;ITGetFyu$4;Or5IXTk8wInZ^& zCkueq|KY0v-HSJz%m=Ad;#HW+5nHhZj{#|#5&YYbKA4|)DurAx^Oup#+HLt~lI&efi17QK60#`idrf65<&Nvhk zLJ$&&{Cq+vIQ7u@%?;q3IcNlNq*KJ8`LU7+^qnJ5}f9}i1Z-M>ty1uHkH z?|j9)bhciv(5mgJNW8T?cEo;x(B!88F>(>yQEHJF-I)r+e+V&acAUL&8}?G=G8WdA zTTWRrs18<oO&!``r8NC>t_Mf)59vd&m7aFN zkC7{9n}zT5LV1{M$q{@Owo-|aJ%F~&BR$w6J z7SdV)M>T0!`(zF%sFMj?W?*72Q$`dDAr*;-fP|(@Esk z43TN0xQ3B=Q8T_j6=hMMgf^RlSQ+UXJaazgS&y;8`-Kux!n0dXxi-0I68jaw4Z--c zGl;TKE!%4(Q-MhvI&3;i4swv7_!?ikK-kYf2g8$iBdCaxOh~LhCZvG==8iL zZ0BUsO4gY#<5UTx?+Yi1=vRAD9)DCBq>`N~yh#F)h7UAwg1Xg8nB zLL#d7ZI+IS1eMHFO5TJ4>(dK=2AiIUDIP~ALa<#Ij*NGv!aImprD31bSQgfD?>~;j%Iuv-Wdw7ay=pkMzUd#I2f9EPO4@- zCcwsd>ME-L%00Mfhs9hV2D~+%D{I2@?~>&+O8F$y+^WmfrNGrAF}F|&b-6&xcnEAp zH(ZaKUX);PSmuKvE(4kwa2V;^sGE?AApFxzL&E{DYfrlesVn2}!2%a~L8(NZe)K z5tX09DzrMWI) zZ61fh7uXjGcuQTEbM!n^1tocf%L3LcQ56e=@{$huqh)fWlchQQFSTbspNiyN+1O6v zK>z&vx4aaWTa0-CKi*5xJwj$_R`5!ie^Kf1b~xn}2_Y0TMErChXrKQ6oex7fJc<|_ zAucv;3u{~Ar}-H(XgU=hj~C&7G+j-5ZW)1bcBp;ymmbg8;hitFfn%1#PP+ELR_ED; zP4yN<==3WrhuAt_usZn2v3GzUWCU`# zrk-8#T4QuUm#w-hG>S`R200<3B+a+@?Fr#_<-yX8PW|R8!mAs4_!uOib~$01u6_Fe zpa5BRcJ^^syaXVwNLEUdN01XdR)9~p?KGTydbr#j!3#`CWotng#*t}{oX>+zPyc>; zD)oJ+s7Mf=^Freuo?xp-vviKSNNog0hMN5QLnWQ4XfZ80Z4Rwn+h+zpk3Myvg>nLw zDBMS8?4O@8&(nKc7R@0z$Jb#_4LkDUe{m@NuVFrCa#$TsWz#V*1O~#`=E&LGvvfJp z;=-_^2ADBsOSe2Ngu&M7?L0;{`fZ;+V_G^Rrg!^)CsX78R*R8a5k^6Y_axO=r?i8{ z)F&oy;o22(3`cWROZh{efYFc2f+;TF5~rE@WgTAdSYQ;q$0rVUvqZZU4rc62N3RrtsIw^QM3 zou6sfI;H^aTdKr7V#X+f@;>?fxrWjY>9VneJD%O*CIA2r56?9N!~DjYBo!bVGZkZ9 z^qU+4L>^Vs!&Zpir;>H5q&gHGUfL*>afRu(52X_+++8fZbdUNmwyg#X%#6XOdG9B? z2j(Fo(g@s_w#gDPhE5tqTDuYnC6|+=y#M)Fdp{sHV_rhWwJwmO|18{JXS4Eb<$7j&GddP&jbn&f|HmYY1mpM#cx=$c$~VIb+_^ zRt;Jc&RMR5RhbQsKaQov=5hLO8AmHG&lFMomu6`UDgYA2}8F=>b#?i5a zUDd?jb46%zNwWKbzzmkEy62Y5baSt@t3s_znTW6e})-O9h;f0a^=!7mYDtO(qKAVT@?OIH{ty)Q1=xQ8g>>q@w z7}g#qGQCPm{H2tT%u!L_UlbxqBe%b#vnHO(;^(DI7#1)7Q zR{Jt}pc!fmwsaHtIhe-j43iKp@=L0a^?1naoZ+9>gv~1^6}mJvgBT6|F%DeI@AMig zF1rw?uwWmtz2^~CC3+7&7rG@gBD(@%GZ|J7c&mUwYXviED=RCwW>wp{PXkWvEzev5S%zyY;PW1=2XoZ$*v(j0GHY#)jq;R8#7R*S6>)i-B-)0Ge z=F7`WvzWn_74!sPL_qYxUqXg+JVv zqK?LsjeXH!FKU`q)xw&hVDbK`dUJ6>s1zB=Xt(G-7_@2M)S|&HqIb>7>p_uI)KsEt zp%5Bn!$MRZpEXibjuq&4WeeN$L+x%^3;a|2t>^8oNi&suO zx9Z^UfPbrJYTg@^=0fKSsa1he+d1 zP2)|?E)gfwW#!g!vr8vcnc%e&zWzpaZq|?hP`^N-zGD}aoCAx@9$$RJx~WoQlxQHE2=wfh5qRS<1E(Dn z`}1u+rJnc{I}HS^tpFZb6_wG2_3M@o+d`!v2viZ>3go z-i310RwG&irqh|c;_B*?I~ddVH#qI{HE;~ylSXkE3P-#Vd(72&+f#cOVdOf&e1F=K zf-S0)Y(p17qI3&wAaaP2+H^FijM)V_#7xp6QwsIrTXxu4#fJ}zD=R^NU|PN0uYWl-q-^XaHdc87NMObXVNy zR?qpQTUd16HDD2GEsfJM5;+QY)I)88x4#De>C-2u6YtNmiT;hlJ7 zL9xPqf7r;j0x}^sGcHvk3e8TM=OI$<5r|n7peG>vC5(tn`0lJxN~I_}EH3nsJYdGI zh_d;r2rX@)tndx)IZ!Q?X7RzhABFdba>gu*Q?$~O(Ub} zx7U9@C*_$6musLD%@7C*3;I9*l=m-=^LW_Gb9|>|vJ#T6`lLF>KJ>#87}Cfgkdv~$ zz5=hUfJ7|Jb}fzaaaD~~{&4BYXIccTnYnB4?Ku(J-$2Dv5e^(^?N_l3ljmQ zhu;@}eO`Q2oLCSCJAj#9)a!B|L{vEJZZMYuHVAmEvB+f>|;=r%X zDofr&G-=-rr%j2m2BB6`so@dv6vncay;3WHy(7i3Z5ZE-0IGRHgLrB$X~nX28$SP_ zF9u>U^e9_FX)gBi!HA6<$J#rEO58}@pw#;eU%8+=Dw5Lonv><-Tv*R1hB4@lcn=q= z#TNINyXuBD&_@9WxU6f{0;$8lVg^MmX!bqSIX78?aZ^%L#oY_f&w*d-4Z(B8($x*( zp97{fDD=@EO<1psk|YP0d1F=*B+h$I$BB9SwbSw_wXSFj2goP@U+;Pt9VrNv@SyD zLgX{=XAat5zT8ckyok>9srcUz#?m#&o#{PIi^+QZ9F@+=FUxqh8aoAfx@Fi6O$0xU9-9BSVa2VR>>a z928Qqh%gdwctQ*B@xEPjU{UsGKoRaG-#~eO;#7K-js;0`v{++?r z)^`7-vXExshGVOjcKli@q(SfI-U$SzB^A^aIhZj0>?^Xe87OKJxQ`>3ND+?>JIqy8 zUw>HF{<~s#o5T0DPJuPb2&<^Z*jfd-$-Q1xBLsm#fecuaLVh*1?eOj{eqvYc|8ITk zP$A%x^LOP@#$&pHu?2Pd!G?haK0}U`O8to^K^SNN{rj*P)F)Dt_xmvW(JjkMaPixE zvl%|RqVza4xc~hxFR4NMX935R8+la4SvH0mw#;M_AG(fBK7RftXsn^laZ|}g2W`-l zF(8C0{{s$C|9eVtum4#rmqi@LNsISc<8J2#sX>6B$n@s$fZK&(D|ZwjjAirhl6rs!>!{ z-p_HU-&s2V`xz7DaxR&z-)v?CvxiuUVI5a?`uW4~{?&qFlgQiK01yB5(efOf) z(=(){e<<$O~@q8^G%U~yWoao}+HljP!5EMvQD}S;H%qMHyU*PrkKIC9BD=MS%Qn^7axd5;_O9dPaGqTB z*UZ$3Fghm-4dXNw1aHX9Lz)S`D*=L$4US0$h5J98ZJAzf2$z+Y2aKPxO`6XZ^tQGZ z9CmNz#tDLlGaTdDdU)`d`DmJuAAY91@F9T{;J?RdY+2pjevQ3G| zT}o8=m^%-?VxA_<^hQQT(A0?WNwwWD_V|5kQH4nb8Cx8d1o_qe_DoUd+Y;eT84Hc& zD~xX)GsA*?y?ML4yLXQhU~q9!QLu&IBd(aBntw7=k&=>r2={A{pB@02dWKW~=Ngbw zpSvPWBnX9ihLsH)SzSlxvy>F-Rc(zVGkCbBV%t;HC&&#+hL%oQL249uE^2*y9~&Aa zR#-z+w~xkqq;6>V60Mh3VMoWvIRBgQ@L`43>A@=?4!v2T^j-VB06LjT}{}l+3;; zORww#R@5@cd^nkGe1j8!a$G7&;*-UHiNdfG0Jx@`?CaYH)}DD$k9t9b~gQ_2#8hX zkLCSnA}QiO4$qZWfrZgl?! z*vK+=4i^?jZve#;i1+=xytw7-Q5@K*-2w^suf-b(K$=!E)T%HuZuKcvS3oT&^ddtGPsM>!6JyEopt{ef^zS>V4O zV#WqqVOv*~R9^Ve6tPF|bIN{OOm7ck?<0%ML7Uv%(9`(KxsABRWJVouy)AwEK-6dN z!L>}gV-p-4Hld$7GD1F4p|VrpcWL&!r<2m)eQRY!-pfl6EYVaEP-W~4Ggbytq$l|V zB*tS9d6XOR^!_V8M(aI;dHkuRNHH@3B)me-yL6HBxJc)D(8*G8v@|~~6-^=r2 zV!FNelfTsJHsv8v`Uk5sO`&o23>Y}~4pN!`tuI79(Rni)g7(&x^K}2{v`a(yBCsfD z8qJ0~PAbT%tE!5st4XNg_4KlBb0W;LpgWDn_x`v)OU%>D3o^f^SU*QxV|SEUhFT=g zERcg}R+$=(MpVG*WB3&ykQ=|&Vw0MhI(#=PJ~ryL;&LoOYtq>tJcUap1I!8#nY2Ou z+CM*f*C3`yhkHo*ej|$hLI1m5&eN-ytD76Ks3*B+WY`V}q@2a|cIE1<0vVs0+J`#& zuiXWeZEYD5r}l&=B5RZ|?)ple285lmvW7k&f6f?1 zej9H&EHAc&rm?OjBv|yHWd1(&3Cjfg;FUK8PgTsVzlVZ1zP)Vvtx;!CM$7-uommiU z#8#{xW#sn<+tFdqJ{Kdg!-Yjho!M9rW5%A;%g~3uyu2LlHV00GK07~uI)-3UL5XAg z!UN-8fR9QfV9r`1RW8M3?{_k0y#m(lZEVo)KnR?K|60u0o+PAovcf<3$Ep2qqy7TB z3XrAB(eCe^;8tB5(tUg)D3j3)vp)A}+il2VEWyg(j%19*LYp#13T>`dIu=odR4;&Z z#b!0?Cx2sg&kJXt_*8j@i_lcAbFb_cICaCSMXSp0sGYu*6%-pG83y^!kXz5>3B&#A zg2SYurw?C1!8=A_XmljXQhA+lo-g_mCJ;X#p{m3-(zG`w{xDP#f?bXe_1X98mTEc~ z$jw5gJp&Iu<9iSDc|)4BxO{lL>J5d97;Q10(#q=3pfpVWew@^wF9oBS?BiVg+RpyY z4amWhoQ=78Tf_mK2jlalFQ+$SU|}Or7$#EnYm*6#D0?cSg~t7c;nzBSe$%G+JoJg? zw1ovt2Gtw|*_P3nJ=7%@Y-p$%(;Ydd8^3o*)l+q*=xX@2U-8Qqf<*B*p%8Y1XQa(h zVioazK!c_dMXYS~gLlVKfgkj(%|(16&Xt5o%E_5%HgKlT$QtHM0IllMp4f%;sR}JJ zKWimM&%&A*h%WK-XM)hm(#UJ8w)@}P-{l^1be_AcxQ|Nav^eR-6J=M;TfUve5PXDY ziiEjErION}TwZ>Cf0=!+ZRX`&L>4_|s8nzN6`sSSUM{8eZtqpaNykvVp2?i zs(8+n|G)wlHGDC`YwJra5xXYZrqj>)gReNwDJj3{tb9_nRYG;@n%BO>Y}VIzzxjGV zlm8?gV%6=hry73#OxH09NWY!Ff^05@SD^59e=xD4_iAh7mWTLIfRlH3*gCI_GdK<8 zG&JUm$Z`Bp*Pg;u;$FT=VFlEq`Yg`-9T*9Fg(e4i8%HP``-hs zp=)OANXmyL#28^#b$RLZMN6yn^z>BQ&8_8cB4eSp4mxFhpqW=ys#D_M?9F29@`@h^ z?HeV=Z+C@X4E(xzRNMxBnd)WOJ3H%ezCX{}KeM-2=~Y*sj(JA@P`qZD%q>e3R1EJ` zv@d0qG-|M80qtp+bR1DYCrE9jw_J2;qyA}|Q_+NK;55^CH+_s^?=(k0<4k}weP4ER z*V2h2yv4fN8;onMTBs@+__oz6EP@-qu(2@(rKfZs4|DU@`tp<6>uMK0tj~z#x*U~m za&Y#TAw|55x!qUKG&K}~Sx^>Il9Je%5P(hj1Z3enS}S~w3k~?!@tGyUUgRHJYI}MK zk8t)#v!*qtu7sT)$#85eGaJ)DeiF7x_FHmNQJNHsEFUR!hll6<(r3XWH(gn-bEo*I z5Is9Kt;DtN#HfPIM^%RJR}P|#BPQdEABx7)`)Nu=t03Q;-WL^X1J+dKSUV|;W)(&w+oLlP#`1j++EIP{fKHzc?=$udpRo_h1s{DR zw&+iIF#x+6>%W#qMbEa(F7AQ`j5P)^c97l9J$b_A8Z`M7!6=jaRcY>`AKbe)j!~RS zUUvqoC1h#JzDt$Kmc}jd$(@Nv^W_^-yP$@kw6ZFu)34c*0=032R59^vW~~n{{&V?4 zB}H)#crmu~h$AFDR4^QjeZoJH32Y1Lf%ny;n5DSBLKGpbZ__-eS|G3f`#*x8^pM?g zwoshqx3OT`LD9*n!r7yi^xD zse@{*^Ix5*w-{u$4OLXVWAb15hFlP2bL8qPlIeDxe_0US*bQfCwld2~DC(D$Na`;# zE0$J3&RusOeM!We$nP3DLf2ZXxjWz8HzxH0!e^<1-OPy*+3V`^>VKI3OZY%8;+<45 zDrdgANgOEtRVa=yy5vD{3znuU;?lKr!wJX??%?Gi<^d9?GOAiGj6|bzaxidmI;*P< z{53e>Mcd9}Dvtu0!-q-g>l;+p)s!|>M?-g0S9cee^4-fw=i~v+C)%+4MQv0xG!kxe z_!B$3j!ma?&wp0!f7DWDKL#hpoSIy^UY;d>QV&wVl^WT)yXNI66a~CDfa%vO{ubVX zZwmn&EicY|M+aQWGUdL|G;ex$SzUKaGj}Ty3s);>1>oW07G&q3TU zsBP=vXf7fm<80yKXyxQCBBBn3x&gQ=-@7^gFUXhTr|Zhmea z0WNMHL4KZBQ#B|A>wn47vh%e9a7js}m57}~o4)?9rZ1X`0Bbv-6?FQXj!y1CXB$py zGfz7UXD2t#|94?Hg)Gf1gspkF1q6Amtj+m_c&z!Y1T3Jxt$EA^__+i*pglOC#ZOwWsY{vYW$FF+30m2J~s(mvss-o9s<2i6QQBXXFLwg6C@Bq!}m0N#0E z^#ycG+OlOA6yUjQ3?69==okQ9E9j1@=X;mH9ccp=ZR?LDL5-*ZgHGIN2kH=2ODtN}Fz+jtc14;cAW@%GdMJFKHrCRFX-w^W@~%#K_D zc64P>sYCOtVzF0EYFD8DkFvf=za!7seq~*<@RXf*T|q_8mXmUAU>B|@60G-%djfS* z@jD*ao@I~z-lzl>;@Pr9g%jG~s+lLSqe)NQ$1dC58;j>w6|a7JV9k~)#-=`wHB^Xw zoj`mXxERCQ%-BW6>lYvH*r|qJTmd$;Z9)*{u=sVug*Q$mKIrcLLak1A+-D>7UQ-|Z z@07JFroD=OhXA`H?F(AfZ_*s{tjD>Ej9c{@DOJTwgX}973es~RcW!psk~BuD;sxw% z5h+lp5g`WTC}|*)?#sC(L&15&QO$QVcz=w>f9YYaRli*fv__p(@fWgZqJ8lFh%DBt z$meMl22#UisyGJbvH$<{JXdKI+F^~9d&P@DADIarObVDU3#IZxFsF+*a9mKA&B;)D|-ujs9lG{+d z0^3Cu=NhS~$Cl&I44iB4jHO}1x}_7+Md(gHw~R3p^w|ltY@oT~ESRb)4tyzTis#aW zvHt|uNveOsB)*%3(-gplXv01gbIs7WRirjgkYpJ{dk#<;Z&$BahopLy8ZK_%v$SG? znfx$pu1pR{ldytqwKkMp^4@c;B=%)LgBv5Ii#B^dT(z<+TpQML52f(yEE zxRcdXJmS~K1I~59jWG$@71rh4xKr4mztNoXP!VH`0X^ebAj$C5z&t$OSRzr;WvvrTJU#U5Ot z_fZ4%oxk?S%$lcl4XE1RxC=rw%=#%}U{1z==Nz!W*1Ej#S(9-xH5x;V88w&_<{Qji zWo#W=b4AzGwgHjlou>i-VjG)+N1LhEG@(UoeHv&SEb%^tqiE6 z)0V(JrhK@gh^?&`6x}NKQ4&n1`p>$CSD^)L-M5S-9|QR^mlVKEbYHa46}CcO6v%B0 zcGCRtUME#+I%7Mt6#!ks29Y@{!))i##G7h{wz9P&pnDV4t*MMXv|+33fNBjac&kfU zwnD|CtPQmaP~923ZFqlQ5`!KBxyvuul>kQ@Z%nP@t>a@+wsv?R1ZC&O<~xmtrn0r= z10ga1Gz~15P(!xXsZ(0pQ;^RcBw1R39X$q)h;EEMHGo4C?7t*gO4+$GDY;-3u!M!{ z2EZt=ub!o1GSURprUErtagwDvGIp&H)V-?@D%6Uxkc{|H(A9S_mZpo4hByA%JOXm98&Pjt zf=a>k7hUPd*t+}md(YQw#vVMVmH`VD4zUN-B30b*NKp@}!HivdP%UF@i+r#TX$)cP z)`My%urexm+OOf`ipDzQJ-`^e1Hna2e4@Nc98AEeiCZa{Kulb9@QwsSKX<%^-$6^P zpEFh&C$6Cm-tVIVFd*SQ&|n`D(S@Soqb9!2R|WXIHY_I&UMKNzRuk7+TM%q*f&%N1 z-SJ=rS%eH03YP~fD$7C<5M_DzKCnClswf9hl!L-#AW#(uLItJ_-uw{|M=QxkXe@NiX;lk@iWmi30olHDETpvub1au9hrd3hOtLWbh&;(_*&aiQ$|%t04V z!MYP%JqTnM@ES)nhV1E~CJrE77XgR;!qwH&ow&{uhn2$<@g%&92SpAl3tf|HLtK*U z7h)I6rb+?j%K4yO0Yb>PgeE3GCMA)+P*Xh2@n2>8UB(nkUst@GIi5oHbjRWW@|~YC zQ9Sg#0C6@I^Cu?jc>!{LnGV>~66NsY`5tnv4&Q*)C6InhzX28?!@E!btpld`sy~At zPyM=%t0UQiOmQUtfyTc){*~T62=;%V$h9ZGBE|a<{(yAt$tEcdt71=fC!qla6G&(W zyqv3x!Qk8Hl0^1hPSDLdFs7eLs^zm1F>FD9jQnuL6Uq$RmD53d9`_ z?ScL?#3m*xx@4^9nr9<*KgTYPj3wYyz9>`$0>@z?Fbq@%f>p4Wfx+Qu86_NCSq6cY zSHL2a6rnJT!a7QT8`6d1fp)>-*SG;{ktG0}@X9y{46O*4!9n488F@4uCxb>{?79(NR*?)78?|h9aOaT|FpNSsn)0R+iUS)P*AC zwcxtz3;@qnIfw%6LQxZkei<=DQw|X*1Pl>x>5g`xxT4+hE?8eRaeXwAg8v;VQ!l)` zt2@C3F!CnJS6%3kiDY-c7=XoK;^432NF5!NJK3H<1RhY#4Ya{XJskv88G(?Imj#fl zd7BC#8=z{YMVE_Gfd};r~SN_4!XO1OT(VIC#xtRo0>_G-^WF@>S#a?`Eh3+p!RT#jDkH7waN<0 z5E+ELGG0*;Z?CL`Q2adK+Yt|V^ICRWPf1WqC|pGW$XmeIjqJ4{0)=ev;SB_ymIDw1 ze=0$4%)>eY-h~I+5V=2==fBa{x0>{F!EKiCFLC|Hi{dss_OlwkHPIJ5;B{ktHOZQR z{`P|Z(Q0TV1-KH>N6FYjfZCyq2QoAUuCSJ?VR)D_MoCE#w(ies9`*l$)&8SAe>U2G zN1opn#{b{E@OOOeYxu4;6@M7Lf8O!_gRA|?_5P!s{#<$AFu-?y_b=ONz2s~pTDk9Y zFz|h?TQEWUtn~{P1V22GC4u6n;tf)E`>!79SK|Qd%vOHMl&`&=ifPF{sos4TT z{R+Y+EDLY62iDQRo$TrQyTCR|#kX4{V4{JF!`g&3Y1G7ZH_AJBgA;h2)q3-^Nwu~i zQ4@!(bqwoM*V_*?uw(iiJ*;)i1}cyvi=oyzuC?SqhxMCrUp$dW1`PWhIcCio-;90}bH4$&Zn@31|E~c8 z?cirQe*{s-5$%p8qly0`l!^*}2Bd*I+Vy{EYs97|<-bj^zcIEJ#qocnL^xa)IKKdX zeu&S4M0WmPMGI_GgU}x$G)8;;op^?RG0#Sd_!7|aunp$|HaF|m`W(?P`3-$3ZI1ty zkk&!FdSbBz7xG`XHB@0^S)dL6b>e|3ehz|P<5W=m`#4R=Ko|Tsfx@7l{pmZPaHZc@ zC=kV)4!AL4Q=w4h&%-~;K*srQmF+V{de8-uS5ObTmDjQ*Fn1zFc>`A z1*}c<{2Q+N*WrHE;D*NkN~^q{Pj!GT_h0waKL+{-nd-aYzXH<`?Tsc7{ttEfUtqQL zCJ>1P2S<;8+yTD#%g@c|e*xCQ1MTka3qJU-;QcjgX=fm{11TD zcgIs4!N$O?j0-*{A*sQNFw5+svdJQdpo& zEk6(ZrSzn@c|iJ`b7*znlBp0{lkPUz|w+@%ty~f5HUc-H94( zyb85>7rFlMn~P51dUAc}>q|;sZ;aP&Q@^`8{iEr?d#P)jzPu0%eEIT9EzsAgiMs+iP1Oq8ZRt>oJU1E6 z$tH`1OC{H7^TrGu5zyoc7l7(tt{;}y-?4?BzK%Wyy!WBhSwTBHd%Il5)RcGjWlKwo z{{8+f+1F;9MLoxtFR4Mczz-vD{RL3d1z&z1vQ zKp}N>pww}*ux2rw4d;WTp=vZezMP!jC>waIy#Jhprpc*XZ?>#tg9106k|Q(?EYP(2 z4^LxIg&sz3G`Qt1SP z*~4sAX|^nJ2h2$&3LN%z`6!IMh-yc?5B3Qb0ENI$*6J9CIF=JqwxTe>0yTn~^c<4f zLtM39=hzSG7@vE4fMBb%=oQGO)G+{|MTVk8w59kp$5bZzke;jNJ$?)eZ*?FiSXEA3 zu!ZmADkMDJv8cTjta((_WJ2kvFF#1EY{$`iX9A|gYKcNw$q|Kgb$~FTGDc@*_t5Sr zegoncU5>A~HRZT%k0w2X{1&abKD}#%2f}m^blTXn^ZYGW7~&tFThUggg9sGB$8!59 zq9B(N5OHkjQmxKWva|<(7E#VjKC|cIDGc}`&A{wf>g?1ic~uUsN}rW^hoLH`Y59#) zM|3=0Mydp>lFqYF{)#FzPuU%bk`(F5w$%%@UL0|62i;)7`)1Xw80^Z=!%x%Jf(gy% z;2;~R!*MKz;wps!4eWkBalR}V?fmj z=D|@?$IA8Ky@uLHEVjn^#i?-7FD5rEM>zI6lY~J#C8w)O`4^U)g|aScMeE&9raQ4s z%0Uu7z7V1*#3(_-$g2cRi1nqkB%@+bW^s~NLAXQNX{VCeM4WrD1OdsNV4dh1nsqbxWuU4bgXF-)*N;aZF+4` zN&$69Hst;B%cCj>bTR&tkuC9Ij7Xsj`g)%m2E84GwtWhG^mtahzwXfq_cu2<<@rce z<|Pi+HOTW^yHCc&w3CH82&L!89;WAd zPn#w_7pZfKvNUVjzcR_SS{?BIHRW#iDLZP-A!$@X@$q6d5!%b|y)h26_gZJFOsHx| z>JBTXKn|%9Vp*q@TMUMx7`0kD8R{*d@hL5*lY`5W-t`6zmo{`&rqyIQxTjgBarW9+ z0mIC+RfxpN+FQ5hO;P(a>>f{5JwW^LOO*ubiO0b+txdx?2w|>XDHA(7+1E$GE2skT09_6uyaw9TdH)Zw(nF~vxy$#8E#j14A}GXsbS_Gdc)Hn z^fwnQgiVN4)`WdD=>i|_{F%pZwZW0wsq+pau8LC|Dv?*-z-(0rK@Zq2Fx8HFj-O*1 zFw*=)Ba8?J3HrAmU~7ZOH|@I5fsv0K3qk3axYT-_rQC=;J$CtG)p*P(;~dp#Ec?}B z&n^y03+$_+Q3)ZPYBS>%`ZsJ&9}Pg^t{j?n21A-cS($BeeXjRPS0qOxKs1%s!O|@m zu5aAmU*$WSBlWo~XQhL};|2E&-F#4am)nl-fQx929$)6J z_JZ){0{tiUBknI%q#PhKLd1J4np&^A4b?!jOWd`dP!*4M(Yclr^IJIH__}S^RN&rs zXuw+BgWo#^llbIeCo^5%r3=Jeq+=jx8sRuH5uR^;Lr$vSV1oA3!~E7>Oq0>+v%hb z86s&e66y=SJoooXU6BhSwX4p?!>_P7xyQ{9>t8uR4g1KB`52K%f;8EgQ3G_OI4XeZ zVpRkOK~q=iG`Lk*<%Vy(SUp3W59c)KrqiuH5k?>1fkc@X)fEUukKvHn(v1u6S9Ugx zcpw5^r$-?@v@!1$Gl{%CMGq`@Mnx7-*-9AsH7rZg8aZnCO;&p-hM&r%xzAP=A!x=FUVX_s(3Kry z%EN+Zv>->{Jk(GLlE`2n1gHLT@qVQ40OVxpO6$v4CKKr@bLV!OUFA*edp3bIH_$BE z?rPF}JtBIq@GEP@+#}?s?5;DAI_NeYV56r%aiq+_Fju#Z6u(vhZKM$wS<6$Ffai>> zc6@ogzdGxeM{r?)rda#Y$uu#kq??jz3t~i!ZPw(q2!gS9W`QFrm zxRMx|%bc7s3ZaG2az(A&x-aM&Jam;N+ARC=>j2JNH1;JIILvS(Zm zP?dV-sGo>Fh`aW+6heK8HGPIx4!H|^P9URq4t%PodA{uU-mdW=-nzGmC(YS(Xr=sI zZ){)LZ-=5|7*EKi z+)p$X=Q?#-aRvRv;nt9nQ{cHcP1*#ST9%~kT^b?U4EWHOFLzfN5QoHPv$wZkll``r z91XwOeb>L3Hn!OG4lF67tdx)|O9R5CWdx~d$;MDeHSiif5kOiG&+AT$y5a=tFf+q* zw1?{mFiu2*xMQ-Nc&g^36@`|-?BHMeMWRiFnVzX`+tQ$tYES7kOTUwY(J26#k8(IfN$RXqE%_+hXlMaW!?+^*<PR$P z$f}j`DZ2MaQ&M?tMMg&#w~U@)mVchxyT>WwY(n@$#Vw zziU7P6OTgDNnzBb!S%W*l=BOFi-?GbOVi^k_c%3Dv>8Z(8Cd3PpLBVz4B*)N4-?JL z?AxnogG$ip<1;QkMRZ+c=$wAjFM9gk^}Y|Itc9&9t1jpGZe%W_wrFKA5lhZNgAt;E zih;hubt-xa+gyGDKano6FuO6^$E2xucW0Hqi$zFYx0d-tB){ni22CdFjgvCw1Fc&M z)ULX5sm8>agj(=Xc_j!=@-jt|;sP3)3Y3M@N?p=*^-)2>BvA}YvLE}x06Hu{o!T`v zb@~1ERFQge-ef4BT7*P9ElXP@YTvceJ;uorDb_Vjpxd+ckX0#Mn zv;nba>BimQbhK7%dP_dZMl9MQ$(lw319b(5iCOT~3RFLNIyN1tz{Q^ROx4vOC`A|< z)+1svG0ecnAChAhf7__s@ua=*pi$(G0mD2^ECXcBAueZoQoJ{aV{5>W>!9lC!BW-^ zFOU=%>RujlxTY`}b6%pf7RoK+eCF*fUv^~R-hRJ%lLEbxz7NLQ4fR@Z%+_uTF*=@G z%qN;bOj38)#AzO4`UESiGzWR6rkp;UN zn`Q#e&`<59G18;Q)7g+DZZ>d;rL7o1)0R(7kHZfu+N1~RES@E_Rx#P!deD0?t)w*= ze&;QR)q~R zNwcHoI`Z_5kl}Mx8a}5%NnK)WjB^MVuMcA$x%=*!u7j%TX*8=yM^j5{29N(3{>fwat9sC*I^tL=n398)7OyAs; z*$FN$z8MQ+)=mONc2POf!-wv?MV7@HYroT8P;~kjC6_&_*(T9`D~2GI0yn*kV{u~J z#YXN%-iB1Swa$>)siWF$2W{sAcBp5B7Dh$g`S_OjAzak>M6Z{A*d$$t#f24=vUgJu zV7W*4=V{8W&)tvNp@r}fSm+u;f70anctt*H+6dHB^7g~HNi#?`mc=k_n)|YLrriVZ zE-v040j?>B8F1dGt&YgX`qvK;X-obUTcV4{PuCvYqIA^)^T|4N86=|bzsMz`uYK+E z;PBl8kIyhGrzw4!IU+1w06I68A270&I{d^xK5WYoWYW`1b;7F=6C!@8%sO0r^=D^| z*`gEYw%$9&*ez^0$#GD44{5I-{DWMj ztlM&ig2Vj17u}fgjeZ#a?u0F27>?|^G?Z)~NFjU(qAm6IYyv!}?eM)JJf_^xAN=#M zfQGIDrS9}&>h51^!gvm_+1#vI)QVP#V$=db4C~S$+8;yoGf^cWpVT7vBpl0DmAI+N zmAxzVj4JQLj}4XcT`Temn7GAh_s+e4>FdQnFKLB zErk`PNnqUXkcyJ{d(YO>X;WwSAckcEM{S7rK2_VMN?4*GK)viAFS?i3b2eT-?kSI# zO`}eB;T<6?kKDcBXk+^$*iV^yH(4UzYaLyUQWYd%nxlezmVA2y#oxW}L<9@jOx0+k z;{^|}nTNZp-`Z8~iXthP`7QxQfKQdgga5FI!j;Kd#uF@c41XFT1%3&T{+_9T+Wrz^OyI4 zWJtt4wpjKLIqCOhLk4vEWNz_+oz+2?GnA7t$D_Kgq2!m&!Dvg0oJDmka%y!3Z!20E zB$(b-CHAxU+=)y{O;m>-v=GbVj;`~Yax*pX9&1llpSpXOw8MX~Av>+?)C1R=xL0NN zK!TlkFZXp^<=c!ol4_Zjx`g+l5;~V!bwk_{+evb*L8G^d$+~Ue zXFCE`mCB^OtK`d8Ffh+|toJ&fpUBSOS4Efi{o|ZU}lkbep3(Xt^`~Sn$=NE_VZLu-A}q$Majk? z;*na&SQKKaeB>a{2QD24H#yv0Y;qVxP(zlcr>ZNjxyJK$Lz_{t$Qy`o`tyuu?WgDi zA~i%eeX7Q8t(^Y@<}UW}x&`902u46 zFz{r>jQGhku;$y1jy2I>^ zrKO_G#9fJ9)C(vMRKgWKi#i-HPbh}n=8}%oThyGKzPeIH=kb*uMbdWPk#tNsWe~(4 zAyzvZ%NE=B@nv37kblwj?n7zg=h7{F*hb>wc5&NiK_(r%+$wlNbXgTuy2I;lveu~^ zZmr?pCjZXdsYUBdHb|J4G!$HF;WTLdq|zVDj#o{>C@%3RUpTz19+4uUt!(g+Dc&SR zC%pNY!&94kOBtbKqXJxl&O%&hkKya9kyzg};fsq?N=x*kji=kwbGznw=?ajKuH)j{ z9x?SZjFzAtKil1p?W5^&nRLdLn)#l|ZNj>cG9g`$sL$IEo6ELUKBL7*r7-XyXWuu= z?y$S?G5kmZ&g$$A&~`duSUw?mWT#V~Qn-KrzB(MRDeztGGiW_r!I*P0uIWD9X7`ej zw|cq+eKAA5(79zUXj)}}>-^g}$vicYFiAVWIT$*rB-IlI)qF0{iRMUcYFRN!K?|3YZ6$~{CZM~}h*4T)bMtSLW`beb! zRNa1Rl{SVW@yK2jHY>mP!1!}pA`NZj?d}sKvqr@%gVEaF*4miFk}IB0K*z&{oUh5BcBf68Z-esONy|GDdDr%F z1xEobD#7;d<2Od{)Etz~j3W!;c@{qK6}A%M=xI}4J5siohfM4UnGiMg2)=yRW2l`} z;hWL3f~&B3cp)Mpy7W;{!4_arQdnNpwc@0Fzm}&RPvS)#X{su92AoPAr ziiCc$%aGy|%ek0T^JY=f)bZOtFM?^Fp30tU7lm-_Qz)g1G_aNU!|0c)qnMNGr_Do> zn`0Wg?2Hr7M_o=kP)tXF(LR-sv9Xs&Grbw*$A|KJsX2TafZd?cAF&J_%LSKkLZ5qG zqKz|C&=X2{{#vkgCN9Zg_1fK!k0wkR4hZf_m0)|R8c|uC>iemj`5K9xPTIy%+YRi( z@+w!%Md(1+c*)B>$bFN{zO?4?$D}lrVqMQ}GpA}ET@|)@2Yr{r;+ak=D)>1xSp<7K zm@f(~aUWrGZu!H`@{#+J+Qx1%g=*TZSP?7D(``}jf7Zm6n<*m(dVsANJs+mrv{%0% zzP}-B5o|Qp`SWOK^MYxXbvY;B^`k_ZScQ8Z_W{SDiYkoIbR;n%C(rM(Xn73g-rf?` z$xx;9TnP@Hqd$p)(ynOJCiX~{d7Aq*GN|0e>7Si;U~_$wjO>9(Fg44OFJIe#5k}e- zao=R_M9*}2Rn9fd{XSc{|!rbCLe=^6o(F?Pbz(Oou)S7+3tC}E-+z%YAiYQRot}_--f)w;prE~Pk+b$+N z@2}|{!!~Fc+1&h8o$s5Y195*d`d*36=18Yqo>+c)Is>Vkv=v9IB-O>$y^3&K-q~x1 z)RrU_PdD=g7^l!_2 z#r}O@Z@eHjO(2Uh9KI*orlj@Vjk=EZS)mKgrvlW)b~f!weKB~9Z;ILw!_8%r|4XsV zlan>z{{2zoZRx|Zfou!)bSd!!g_{bkd?bYHso}-JvPfJTRTkKfFJB253^{Hr>>hCz zZ1ODe6?Y*a-#%Yc%~NpXg^pwfYtcx8 z2AXz>vo1?iu~X>bSuoM!Swtg_ZtU>Ot|xp~p>dW^8LVU~Iy>IaH7dQ?lJ~aGo3jdn z=S;Ml;p#r*F>d%qfYGdBIB`P6H|yZuRlwhGziBimtlmjxG;ZWUFm!k&)bH}jJNoQ) zs*ChOIjULgb^XE-uHJ~7-Q#1IR%^Y_8eQ0}9z{QD=mp29a&;pQKiM{%ki-UJse#!G zlKW7fo+@3$+@#ShC_rfbq>!94CPv{en2hY|BP>4OE#BDKHt&%4uv>Hbz)$IVD$J5R zlPb`39M&a5A?Qi-iwmG+rewNLoS3*<)uC??``lc+Wb*E_i!ONfD}UM-my&EQ;ta27 zSkAoJT-6P1#V_@!&!RsV#!Zy&>+t5(xOb^?beohVS1)kRGhUcoMCMO8XoSpr9mTw- zD|5IBH}wXlU$}xx*rQq-z@J{+A|aj-UMj2NJXc|9QfX~^e0FCpHSk(=DqAiUXLA#j z`0_?>B4UE%hLr92oWVPu=GxfQHq@qM+%MZ^_UwY?n z)FO>At*pFMCb1Ct=uEXwddF+jR^Zw(3lK&*t7!g-n|hl27Dvs3$@^zbKP4a}H5h){ z%7QTui7$qxQE5^o6whDVdK-?Ck91+74)^(cyh+f29R1~8Q{N60G?yD07BAVa8ogYD z_U>h9q6ew94e>~^@oCV4F5XeTQFK-MZ08%3=_Q83zM33!zx&js$YJ%)**8L*h4p!k zIA@$lf*Gn!LZ*q+$w{R28U5KVNVBfm2NlFaeTNsq`UWdkFO|KfV%bE5w46}Q$5(e1 zs5xJM(@k-lx_GttT(Ls$z)RKBcNKtbCe%)o2_+TXlyJ+A0480weK^E5MRjXJ)ba@y zH?X;>$pfdGG}63Jb3ITWqDpZzgHLVmEgg>>JNiyFB18SfFYj#SlkKymx=f7&K!TSD zQSZ!})WqiMvXHNix!Vh4uP4n`2%t#Z<&onf6)oFKS9aIV@++M&m&_WoE1l1&8orU? zBNWj}ch>78YXlGYwA1WJRY~W^w7%idTUQ#(MW`R9MWe@n>rC&a$8CoXiEZ_4QhVv0 zIqA~ovpcGvu_!@5P9MHJsCb^zT_G5U0REeo+Vmv(7oW&`c zYUi)0r?{LA%~)Ct+p4SEtK%>RyXBq@o8a$F<5Ku(OfVAhnZm*WZ@=C_G-g`GLRetgvOg28S(7#tjdJdOU z;CmJlqAzI86JHk8+-WlmS?m@B)ml_T5A{OXGqA$5i*n*)6`)a$jc zTjGc#)~t|#U~J$K5)H}JMB*B_Bs5^EIs-m4!uUQ#x}V>+Um_^_sj=cDHGG}0Clw$Yn+TN&W`7MdZAf0Z*JaK~hPv`acdT7R=Vh!;p4TV~^ zInUV+mT#-r$4`;l){At<^_6#JZg2eBNA5aIn9g#EB2J(5Nq{G%{usNpr((2VRay z<}geUA}dbSl*S*78iMQzem2Q-QLL1JQ;p7!=cUpq+U)j!?5*Z}dp@x$H4~+qGHD~w zJGNp_=-x2!mHCF(pPtFF_Zs56_M(=sXr1TaiG%e<3cWVJ|<3dQ4zS? zwqSQafy?p^H`!OE{k-4;>fLotA4MF{A5x#tcQ~e+|89rqGX;HWt##?hCspLD04e@s zLPhU}PVeE6J`BW`HTc8{o8&|R*4~ImZa1uqDYJKh%d68OjUmajHy#}|dh?XwND!SS zaLH|GteylfP^FJDW-64HdUomO+&xADgV{kHxJ=aLyPqCS2#GwJh^0<%6>*MyL~0MZ zxQyAwZ@Zi@q0T-a5FF}G%lByborOFEd_RimlOAeODl_BI(|FMP7>rt^w(iShNN3Yi zbnvKGWstL)P}o0bd%4zzZGY;MtIB4o;YJatjp7ws>#O~(dq@9Clr zuyPiPu24_3LrGG+TLgBijuS^CfY)wBpK#%uHa(}0k~Xr-E3&k_4-huNEEsk6Xm#a2loS(2)wbYyZ-+&zk zuI>C5)>1vSX3U)t;1!P8rVODf&l>pPz|gEdZc@P6xQ$*rho_ge)g-7Q`IG2%nS86K zdYF%FxJaF?nSQZcQ>X+iZw98!X3=8RBqH?=>gH?Po&0~tGxK)< diff --git a/ui/src/assets/schema/filter/entity-attributes.schema.json b/ui/src/assets/schema/filter/entity-attributes.schema.json deleted file mode 100644 index 2350a345c..000000000 --- a/ui/src/assets/schema/filter/entity-attributes.schema.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "title": "EntityAttributes Filter", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "name": { - "title": "label.filter-name", - "description": "tooltip.filter-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "type": "string", - "widget": { - "id": "hidden" - }, - "default": "EntityAttributes" - }, - "resourceId": { - "type": "string", - "widget": { - "id": "hidden" - } - }, - "version": { - "type": "integer", - "widget": { - "id": "hidden" - } - }, - "filterEnabled": { - "title": "label.enable-filter", - "description": "tooltip.enable-filter", - "type": "boolean", - "default": false - }, - "entityAttributesFilterTarget": { - "title": "label.search-criteria", - "description": "tooltip.search-criteria", - "type": "object", - "widget": { - "id": "filter-target" - }, - "properties": { - "entityAttributesFilterTargetType": { - "title": "", - "type": "string", - "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } - ] - }, - "value": { - "type": "array", - "buttons": [ - { - "id": "preview", - "label": "action.preview", - "widget": "icon-button" - } - ], - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - } - }, - "required": ["value", "entityAttributesFilterTargetType"] - }, - "relyingPartyOverrides": { - "type": "object", - "properties": { - "signAssertion": { - "title": "label.sign-the-assertion", - "description": "tooltip.sign-assertion", - "type": "boolean", - "default": false - }, - "dontSignResponse": { - "title": "label.dont-sign-the-response", - "description": "tooltip.dont-sign-response", - "type": "boolean", - "default": false - }, - "turnOffEncryption": { - "title": "label.turn-off-encryption-of-response", - "description": "tooltip.turn-off-encryption", - "type": "boolean", - "default": false - }, - "useSha": { - "title": "label.use-sha1-signing-algorithm", - "description": "tooltip.usa-sha-algorithm", - "type": "boolean", - "default": false - }, - "ignoreAuthenticationMethod": { - "title": "label.ignore-any-sp-requested-authentication-method", - "description": "tooltip.ignore-auth-method", - "type": "boolean", - "default": false - }, - "forceAuthn": { - "title": "label.force-authn", - "description": "tooltip.force-authn", - "type": "boolean", - "default": false - }, - "omitNotBefore": { - "title": "label.omit-not-before-condition", - "type": "boolean", - "description": "tooltip.omit-not-before-condition", - "default": false - }, - "responderId": { - "title": "label.responder-id", - "description": "tooltip.responder-id", - "type": "string" - }, - "nameIdFormats": { - "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", - "description": "tooltip.nameid-format", - "type": "array", - "uniqueItems": true, - "items": { - "title": "label.nameid-format", - "type": "string", - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } - }, - "default": null - }, - "authenticationMethods": { - "title": "label.authentication-methods-to-use", - "description": "tooltip.authentication-methods-to-use", - "type": "array", - "placeholder": "label.authentication-method", - "uniqueItems": true, - "items": { - "type": "string", - "title": "label.authentication-method", - "widget": { - "id": "datalist", - "data": [ - "https://refeds.org/profile/mfa", - "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", - "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" - ] - } - }, - "default": null - } - } - }, - "attributeRelease": { - "type": "array", - "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, - "items": { - "type": "string" - } - } - }, - "required": [ - "name" - ], - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "@type", - "resourceId", - "version", - "entityAttributesFilterTarget" - ] - }, - { - "type": "group", - "fields": [ - "filterEnabled", - "relyingPartyOverrides" - ] - }, - { - "type": "group", - "fields": [ - "attributeRelease" - ] - } - ] -} \ No newline at end of file diff --git a/ui/src/assets/schema/filter/nameid.schema.json b/ui/src/assets/schema/filter/nameid.schema.json deleted file mode 100644 index 2ddb21915..000000000 --- a/ui/src/assets/schema/filter/nameid.schema.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "type": "object", - "fieldsets": [ - { - "type": "group-lg", - "fields": [ - "name", - "nameIdFormatFilterTarget", - "filterEnabled", - "@type", - "resourceId", - "version", - "removeExistingFormats" - ] - }, - { - "type": "group", - "fields": [ - "formats" - ] - } - ], - "required": [ - "name" - ], - "properties": { - "name": { - "title": "label.filter-name", - "description": "tooltip.filter-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "filterEnabled": { - "title": "label.enable-filter", - "description": "tooltip.enable-filter", - "type": "boolean", - "default": false - }, - "nameIdFormatFilterTarget": { - "title": "label.search-criteria", - "description": "tooltip.search-criteria", - "type": "object", - "widget": { - "id": "filter-target", - "target": "nameIdFormatFilterTargetType" - }, - "properties": { - "nameIdFormatFilterTargetType": { - "title": "", - "type": "string", - "default": "ENTITY", - "oneOf": [ - { - "enum": [ - "ENTITY" - ], - "description": "value.entity-id" - }, - { - "enum": [ - "REGEX" - ], - "description": "value.regex" - }, - { - "enum": [ - "CONDITION_SCRIPT" - ], - "description": "value.script" - } - ] - }, - "value": { - "type": "array", - "buttons": [ - { - "id": "preview", - "label": "action.preview", - "widget": "icon-button" - } - ], - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - } - }, - "required": [ - "value", - "nameIdFormatFilterTargetType" - ] - }, - "@type": { - "type": "string", - "widget": { - "id": "hidden" - }, - "default": "NameIDFormat" - }, - "version": { - "type": "integer", - "widget": { - "id": "hidden" - } - }, - "resourceId": { - "type": "string", - "widget": { - "id": "hidden" - } - }, - "removeExistingFormats": { - "type": "boolean", - "title": "label.remove-existing-formats", - "description": "tooltip.remove-existing-formats", - "default": false - }, - "formats": { - "$ref": "#/definitions/NameIdFormatList" - } - }, - "definitions": { - "NameIdFormatList": { - "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", - "description": "tooltip.nameid-format", - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/dynamic-http.schema.json b/ui/src/assets/schema/provider/dynamic-http.schema.json deleted file mode 100644 index 1969c9ab4..000000000 --- a/ui/src/assets/schema/provider/dynamic-http.schema.json +++ /dev/null @@ -1,678 +0,0 @@ -{ - "type": "object", - "required": [ - "xmlId", - "metadataURL", - "metadataRequestURLConstructionScheme" - ], - "properties": { - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "metadataRequestURLConstructionScheme": { - "type": "object", - "required": [ - "@type", - "content" - ], - "properties": { - "@type": { - "title": "label.md-request-type", - "description": "tooltip.md-request-type", - "type": "string", - "widget": { - "id": "select" - }, - "oneOf": [ - { - "enum": [ - "MetadataQueryProtocol" - ], - "description": "value.md-query-protocol" - }, - { - "enum": [ - "Regex" - ], - "description": "value.regex" - } - ] - }, - "content": { - "title": "label.md-request-value", - "description": "tooltip.md-request-value", - "type": "string" - }, - "match": { - "title": "label.match", - "description": "tooltip.match", - "type": "string", - "visibleIf": { - "@type": [ - "Regex" - ] - } - } - } - }, - "requireValidMetadata": { - "title": "label.require-valid-metadata", - "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "failFastInitialization": { - "title": "label.fail-fast-init", - "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "dynamicMetadataResolverAttributes": { - "type": "object", - "properties": { - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0.01, - "maximum": 0.99, - "default": null - }, - "minCacheDuration": { - "title": "label.min-cache-duration", - "description": "tooltip.min-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxCacheDuration": { - "title": "label.max-cache-duration", - "description": "tooltip.max-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxIdleEntityData": { - "title": "label.max-idle-entity-data", - "description": "tooltip.max-idle-entity-data", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "removeIdleEntityData": { - "title": "label.remove-idle-entity-data", - "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "cleanupTaskInterval": { - "title": "label.cleanup-task-interval", - "description": "tooltip.cleanup-task-interval", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "persistentCacheManagerDirectory": { - "title": "label.persistent-cache-manager-directory", - "description": "tooltip.persistent-cache-manager-directory", - "type": "string", - "default": "", - "minLength": 1 - }, - "initializeFromPersistentCacheInBackground": { - "title": "label.initialize-from-persistent-cache-in-background", - "description": "tooltip.initialize-from-persistent-cache-in-background", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "backgroundInitializationFromCacheDelay": { - "title": "label.background-init-from-cache-delay", - "description": "tooltip.background-init-from-cache-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "visibleIf": { - "initializeFromPersistentCacheInBackground": [ - true - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - } - } - }, - "httpMetadataResolverAttributes": { - "order": [], - "type": "object", - "fieldsets": [ - { - "title": "label.http-security-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "disregardTLSCertificate" - ] - }, - { - "title": "label.http-connection-attributes", - "type": "section", - "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" - ] - }, - { - "title": "label.http-proxy-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "proxyHost", - "proxyPort", - "proxyUser", - "proxyPassword" - ] - }, - { - "title": "label.http-caching-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "httpCaching", - "httpCacheDirectory", - "httpMaxCacheEntries", - "httpMaxCacheEntrySize" - ] - }, - { - "title": "", - "type": "hidden", - "class": "col-12", - "fields": [ - "tlsTrustEngineRef", - "httpClientSecurityParametersRef", - "httpClientRef" - ] - } - ], - "properties": { - "disregardTLSCertificate": { - "type": "boolean", - "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ], - "default": false - }, - "httpClientRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" - }, - "connectionRequestTimeout": { - "type": "string", - "title": "label.connection-request-timeout", - "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "connectionTimeout": { - "type": "string", - "title": "label.connection-timeout", - "description": "tooltip.connection-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "socketTimeout": { - "type": "string", - "title": "label.socket-timeout", - "description": "tooltip.socket-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "tlsTrustEngineRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" - }, - "httpClientSecurityParametersRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden", - "default": "" - }, - "proxyHost": { - "type": "string", - "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "", - "default": "" - }, - "proxyPort": { - "type": "string", - "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "", - "default": "" - }, - "proxyUser": { - "type": "string", - "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "", - "default": "" - }, - "proxyPassword": { - "type": "string", - "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "", - "default": "" - }, - "httpCaching": { - "type": "string", - "title": "label.http-caching", - "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", - "widget": { - "id": "select" - }, - "oneOf": [ - { - "enum": [ - "none" - ], - "description": "value.none" - }, - { - "enum": [ - "file" - ], - "description": "value.file" - }, - { - "enum": [ - "memory" - ], - "description": "value.memory" - } - ] - }, - "httpCacheDirectory": { - "type": "string", - "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" - }, - "httpMaxCacheEntries": { - "type": "integer", - "title": "label.http-max-cache-entries", - "description": "tooltip.http-max-cache-entries", - "placeholder": "", - "default": 0, - "minimum": 0 - }, - "httpMaxCacheEntrySize": { - "type": "integer", - "title": "label.max-cache-entry-size", - "description": "tooltip.max-cache-entry-size", - "placeholder": "", - "default": 0, - "minimum": 0 - } - } - }, - "metadataFilters": { - "title": "", - "description": "", - "type": "object", - "properties": { - "RequiredValidUntil": { - "title": "label.required-valid-until", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "maxValidityInterval": { - "title": "label.max-validity-interval", - "description": "tooltip.max-validity-interval", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - } - } - }, - "SignatureValidation": { - "title": "label.signature-validation-filter", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "requireSignedRoot": { - "title": "label.require-signed-root", - "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true - }, - "certificateFile": { - "title": "label.certificate-file", - "description": "tooltip.certificate-file", - "type": "string", - "default": "" - } - }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true - ] - } - }, - "required": [ - "certificateFile" - ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } - } - ] - }, - "EntityRoleWhiteList": { - "title": "label.entity-role-whitelist", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "retainedRoles": { - "title": "label.retained-roles", - "description": "tooltip.retained-roles", - "type": "array", - "items": { - "widget": { - "id": "select" - }, - "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } - ] - } - }, - "removeRolelessEntityDescriptors": { - "title": "label.remove-roleless-entity-descriptors", - "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true - }, - "removeEmptyEntitiesDescriptors": { - "title": "label.remove-empty-entities-descriptors", - "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true - } - } - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/file-system.schema.json b/ui/src/assets/schema/provider/file-system.schema.json deleted file mode 100644 index 122f46cc8..000000000 --- a/ui/src/assets/schema/provider/file-system.schema.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "type": "object", - "required": [ - "name", - "@type", - "xmlId", - "metadataFile" - ], - "properties": { - "name": { - "title": "label.service-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "metadataFile": { - "title": "label.metadata-file", - "description": "tooltip.metadata-file", - "type": "string", - "default": "", - "minLength": 1 - }, - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - }, - "doInitialization": { - "title": "label.do-resolver-initialization", - "description": "tooltip.do-resolver-initialization", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "reloadableMetadataResolverAttributes": { - "type": "object", - "properties": { - "minRefreshDelay": { - "title": "label.min-refresh-delay", - "description": "tooltip.min-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxRefreshDelay": { - "title": "label.max-refresh-delay", - "description": "tooltip.max-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "string", - "widget": { - "id": "string", - "help": "message.real-number" - }, - "placeholder": "label.real-number", - "default": "", - "pattern": "^(?:([0]*(\\.[0-9]+)?|[0]*\\.[0-9]*[1-9][0-9]*)|)$" - } - } - } - } -} diff --git a/ui/src/assets/schema/provider/filebacked-http.schema.json b/ui/src/assets/schema/provider/filebacked-http.schema.json deleted file mode 100644 index 505fe6ebd..000000000 --- a/ui/src/assets/schema/provider/filebacked-http.schema.json +++ /dev/null @@ -1,653 +0,0 @@ -{ - "type": "object", - "order": [ - "name", - "@type", - "enabled", - "xmlId", - "metadataURL", - "initializeFromBackupFile", - "backingFile", - "backupFileInitNextRefreshDelay", - "requireValidMetadata", - "failFastInitialization", - "useDefaultPredicateRegistry", - "satisfyAnyPredicates", - "httpMetadataResolverAttributes", - "reloadableMetadataResolverAttributes", - "metadataFilters" - ], - "required": [ - "name", - "@type", - "xmlId", - "metadataURL", - "backingFile", - "backupFileInitNextRefreshDelay" - ], - "properties": { - "name": { - "title": "label.metadata-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name-dashboard-display-only", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileBackedHttpMetadataResolver" - ], - "description": "value.file-backed-http-metadata-provider" - } - ] - }, - "enabled": { - "title": "label.enable-service", - "description": "tooltip.enable-service", - "type": "boolean", - "default": false - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "metadataURL": { - "title": "label.metadata-url", - "description": "tooltip.metadata-url", - "type": "string", - "default": "", - "minLength": 1 - }, - "initializeFromBackupFile": { - "title": "label.init-from-backup", - "description": "tooltip.init-from-backup", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "backingFile": { - "title": "label.backing-file", - "description": "tooltip.backing-file", - "type": "string", - "default": "" - }, - "backupFileInitNextRefreshDelay": { - "title": "label.backup-file-init-refresh-delay", - "description": "tooltip.backup-file-init-refresh-delay", - "type": "string", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "requireValidMetadata": { - "title": "label.require-valid-metadata", - "description": "tooltip.require-valid-metadata", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "failFastInitialization": { - "title": "label.fail-fast-init", - "description": "tooltip.fail-fast-init", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "useDefaultPredicateRegistry": { - "title": "label.use-default-predicate-reg", - "description": "tooltip.use-default-predicate-reg", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "satisfyAnyPredicates": { - "$id": "satisfyAnyPredicates", - "title": "label.satisfy-any-predicates", - "description": "tooltip.satisfy-any-predicates", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "httpMetadataResolverAttributes": { - "$id": "httpMetadataResolverAttributes", - "order": [], - "type": "object", - "fieldsets": [ - { - "title": "label.http-connection-attributes", - "type": "section", - "fields": [ - "connectionRequestTimeout", - "connectionTimeout", - "socketTimeout" - ] - }, - { - "title": "label.http-security-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "disregardTLSCertificate" - ] - }, - { - "title": "label.http-proxy-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "proxyHost", - "proxyPort", - "proxyUser", - "proxyPassword" - ] - }, - { - "title": "label.http-caching-attributes", - "type": "section", - "class": "col-12", - "fields": [ - "httpCaching", - "httpCacheDirectory", - "httpMaxCacheEntries", - "httpMaxCacheEntrySize" - ] - }, - { - "title": "", - "type": "hidden", - "class": "col-12", - "fields": [ - "tlsTrustEngineRef", - "httpClientSecurityParametersRef", - "httpClientRef" - ] - } - ], - "properties": { - "httpClientRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" - }, - "connectionRequestTimeout": { - "type": "string", - "title": "label.connection-request-timeout", - "description": "tooltip.connection-request-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "connectionTimeout": { - "type": "string", - "title": "label.connection-timeout", - "description": "tooltip.connection-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "socketTimeout": { - "type": "string", - "title": "label.socket-timeout", - "description": "tooltip.socket-timeout", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "disregardTLSCertificate": { - "type": "boolean", - "title": "label.disregard-tls-cert", - "description": "tooltip.disregard-tls-cert", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "True" - }, - { - "enum": [ - false - ], - "description": "False" - } - ] - }, - "tlsTrustEngineRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" - }, - "httpClientSecurityParametersRef": { - "type": "string", - "title": "", - "description": "", - "placeholder": "", - "widget": "hidden" - }, - "proxyHost": { - "type": "string", - "title": "label.proxy-host", - "description": "tooltip.proxy-host", - "placeholder": "" - }, - "proxyPort": { - "type": "string", - "title": "label.proxy-port", - "description": "tooltip.proxy-port", - "placeholder": "" - }, - "proxyUser": { - "type": "string", - "title": "label.proxy-user", - "description": "tooltip.proxy-user", - "placeholder": "" - }, - "proxyPassword": { - "type": "string", - "title": "label.proxy-password", - "description": "tooltip.proxy-password", - "placeholder": "" - }, - "httpCaching": { - "type": "string", - "title": "label.http-caching", - "description": "tooltip.http-caching", - "placeholder": "label.select-caching-type", - "widget": { - "id": "select" - }, - "oneOf": [ - { - "enum": [ - "none" - ], - "description": "value.none" - }, - { - "enum": [ - "file" - ], - "description": "value.file" - }, - { - "enum": [ - "memory" - ], - "description": "value.memory" - } - ] - }, - "httpCacheDirectory": { - "type": "string", - "title": "label.http-caching-directory", - "description": "tooltip.http-caching-directory", - "placeholder": "" - }, - "httpMaxCacheEntries": { - "type": "integer", - "title": "label.http-max-cache-entries", - "description": "tooltip.http-max-cache-entries", - "placeholder": "", - "minimum": 0 - }, - "httpMaxCacheEntrySize": { - "type": "integer", - "title": "label.max-cache-entry-size", - "description": "tooltip.max-cache-entry-size", - "placeholder": "", - "minimum": 0 - } - } - }, - "reloadableMetadataResolverAttributes": { - "$id": "reloadableMetadataResolverAttributes", - "type": "object", - "properties": { - "minRefreshDelay": { - "title": "label.min-refresh-delay", - "description": "tooltip.min-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxRefreshDelay": { - "title": "label.max-refresh-delay", - "description": "tooltip.max-refresh-delay", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "number", - "widget": { - "id": "float", - "help": "message.real-number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0.001, - "maximum": 0.999 - } - } - }, - "metadataFilters": { - "$id": "metadataFilters", - "title": "", - "description": "", - "type": "array", - "additionalItems": true, - "items": [ - { - "$id": "RequiredValidUntil", - "title": "label.required-valid-until", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "maxValidityInterval": { - "title": "label.max-validity-interval", - "description": "tooltip.max-validity-interval", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - } - } - }, - { - "$id": "SignatureValidation", - "title": "label.signature-validation-filter", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "requireSignedRoot": { - "title": "label.require-signed-root", - "description": "tooltip.require-signed-root", - "type": "boolean", - "default": true - }, - "certificateFile": { - "title": "label.certificate-file", - "description": "tooltip.certificate-file", - "type": "string" - } - }, - "anyOf": [ - { - "properties": { - "requireSignedRoot": { - "enum": [ - true - ] - } - }, - "required": [ - "certificateFile" - ] - }, - { - "properties": { - "requireSignedRoot": { - "enum": [ - false - ] - } - } - } - ] - }, - { - "$id": "EntityRoleWhiteList", - "title": "label.entity-role-whitelist", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "retainedRoles": { - "title": "label.retained-roles", - "description": "tooltip.retained-roles", - "type": "array", - "items": { - "widget": { - "id": "select" - }, - "type": "string", - "oneOf": [ - { - "enum": [ - "SPSSODescriptor" - ], - "description": "value.spdescriptor" - }, - { - "enum": [ - "AttributeAuthorityDescriptor" - ], - "description": "value.attr-auth-descriptor" - } - ] - } - }, - "removeRolelessEntityDescriptors": { - "title": "label.remove-roleless-entity-descriptors", - "description": "tooltip.remove-roleless-entity-descriptors", - "type": "boolean", - "default": true - }, - "removeEmptyEntitiesDescriptors": { - "title": "label.remove-empty-entities-descriptors", - "description": "tooltip.remove-empty-entities-descriptors", - "type": "boolean", - "default": true - } - } - } - ] - } - } -} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/local-dynamic.schema.json b/ui/src/assets/schema/provider/local-dynamic.schema.json deleted file mode 100644 index 7f465221c..000000000 --- a/ui/src/assets/schema/provider/local-dynamic.schema.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "type": "object", - "required": [ - "name", - "@type", - "xmlId", - "sourceDirectory" - ], - "properties": { - "name": { - "title": "label.metadata-provider-name", - "description": "tooltip.metadata-provider-name", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "readOnly": true, - "widget": { - "id": "select", - "disabled": true - }, - "oneOf": [ - { - "enum": [ - "FileSystemMetadataResolver" - ], - "description": "value.file-system-metadata-provider" - } - ] - }, - "xmlId": { - "title": "label.xml-id", - "description": "tooltip.xml-id", - "type": "string", - "default": "", - "minLength": 1 - }, - "sourceDirectory": { - "title": "label.source-directory", - "description": "tooltip.source-directory", - "type": "string", - "default": "", - "minLength": 1 - }, - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - }, - "reloadableMetadataResolverAttributes": { - "type": "object", - "properties": { - "refreshDelayFactor": { - "title": "label.refresh-delay-factor", - "description": "tooltip.refresh-delay-factor", - "type": "number", - "widget": { - "id": "number", - "step": 0.01 - }, - "placeholder": "label.real-number", - "minimum": 0, - "maximum": 1, - "default": null - }, - "minCacheDuration": { - "title": "label.min-cache-duration", - "description": "tooltip.min-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxCacheDuration": { - "title": "label.max-cache-duration", - "description": "tooltip.max-cache-duration", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "maxIdleEntityData": { - "title": "label.max-idle-entity-data", - "description": "tooltip.max-idle-entity-data", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - }, - "removeIdleEntityData": { - "title": "label.remove-idle-entity-data", - "description": "tooltip.remove-idle-entity-data", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": true - }, - "cleanupTaskInterval": { - "title": "label.cleanup-task-interval", - "description": "tooltip.cleanup-task-interval", - "type": "string", - "placeholder": "label.duration", - "widget": { - "id": "datalist", - "data": [ - "PT0S", - "PT30S", - "PT1M", - "PT10M", - "PT30M", - "PT1H", - "PT4H", - "PT12H", - "PT24H" - ] - }, - "default": null, - "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/assets/schema/provider/metadata-provider-summary.schema.json b/ui/src/assets/schema/provider/metadata-provider-summary.schema.json deleted file mode 100644 index 8090cbbfa..000000000 --- a/ui/src/assets/schema/provider/metadata-provider-summary.schema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "object", - "properties": { - "enabled": { - "title": "label.enable-provider-upon-saving", - "description": "tooltip.enable-provider-upon-saving", - "type": "boolean", - "default": false - } - } -} diff --git a/ui/src/assets/schema/provider/metadata-provider.schema.json b/ui/src/assets/schema/provider/metadata-provider.schema.json deleted file mode 100644 index 5849ec8d8..000000000 --- a/ui/src/assets/schema/provider/metadata-provider.schema.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "title": "label.metadata-provider", - "type": "object", - "widget": { - "id": "fieldset" - }, - "properties": { - "name": { - "title": "label.metadata-provider-name-dashboard-display-only", - "description": "tooltip.metadata-provider-name-dashboard-display-only", - "type": "string", - "widget": { - "id": "string", - "help": "message.must-be-unique" - } - }, - "@type": { - "title": "label.metadata-provider-type", - "description": "tooltip.metadata-provider-type", - "placeholder": "label.select-metadata-type", - "type": "string", - "widget": { - "id": "select", - "dataUrl": "api/ui/MetadataResolver/types" - } - } - }, - "required": [ - "name", - "@type" - ] -} diff --git a/ui/src/assets/schema/source/metadata-source.json b/ui/src/assets/schema/source/metadata-source.json deleted file mode 100644 index c06e299a6..000000000 --- a/ui/src/assets/schema/source/metadata-source.json +++ /dev/null @@ -1,619 +0,0 @@ -{ - "type": "object", - "required": [ - "serviceProviderName", - "entityId" - ], - "properties": { - "entityId": { - "title": "label.entity-id", - "description": "tooltip.entity-id", - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "serviceProviderName": { - "title": "label.service-provider-name", - "description": "tooltip.service-provider-name", - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "serviceEnabled": { - "title": "label.enable-this-service", - "description": "tooltip.enable-this-service-upon-saving", - "type": "boolean", - "default": false - }, - "organization": { - "type": "object", - "properties": { - "name": { - "title": "label.organization-name", - "description": "tooltip.organization-name", - "type": "string" - }, - "displayName": { - "title": "label.organization-display-name", - "description": "tooltip.organization-display-name", - "type": "string" - }, - "url": { - "title": "label.organization-url", - "description": "tooltip.organization-url", - "type": "string" - } - }, - "dependencies": { - "name": [ - "displayName", - "url" - ], - "displayName": [ - "name", - "url" - ], - "url": [ - "name", - "displayName" - ] - } - }, - "contacts": { - "title": "label.contact-information", - "description": "tooltip.contact-information", - "type": "array", - "items": { - "$ref": "#/definitions/Contact" - } - }, - "mdui": { - "type": "object", - "widget": { - "id": "fieldset" - }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "displayName", - "informationUrl", - "description" - ] - }, - { - "type": "group", - "fields": [ - "privacyStatementUrl", - "logoUrl", - "logoWidth", - "logoHeight" - ] - } - ], - "properties": { - "displayName": { - "title": "label.display-name", - "description": "tooltip.mdui-display-name", - "type": "string" - }, - "informationUrl": { - "title": "label.information-url", - "description": "tooltip.mdui-information-url", - "type": "string" - }, - "privacyStatementUrl": { - "title": "label.privacy-statement-url", - "description": "tooltip.mdui-privacy-statement-url", - "type": "string" - }, - "description": { - "title": "label.description", - "description": "tooltip.mdui-description", - "type": "string", - "widget": { - "id": "textarea" - } - }, - "logoUrl": { - "title": "label.logo-url", - "description": "tooltip.mdui-logo-url", - "type": "string" - }, - "logoHeight": { - "title": "label.logo-height", - "description": "tooltip.mdui-logo-height", - "min": 0, - "type": "integer", - "default": 0 - }, - "logoWidth": { - "title": "label.logo-width", - "description": "tooltip.mdui-logo-width", - "min": 0, - "type": "integer", - "default": 0 - } - } - }, - "securityInfo": { - "type": "object", - "widget": { - "id": "fieldset" - }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "x509CertificateAvailable", - "authenticationRequestsSigned", - "wantAssertionsSigned" - ] - }, - { - "type": "group", - "fields": [ - "x509Certificates" - ] - } - ], - "properties": { - "x509CertificateAvailable": { - "title": "label.is-there-a-x509-certificate", - "description": "tooltip.is-there-a-x509-certificate", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "authenticationRequestsSigned": { - "title": "label.authentication-requests-signed", - "description": "tooltip.authentication-requests-signed", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "wantAssertionsSigned": { - "title": "label.want-assertions-signed", - "description": "tooltip.want-assertions-signed", - "type": "boolean", - "widget": { - "id": "boolean-radio" - }, - "oneOf": [ - { - "enum": [ - true - ], - "description": "value.true" - }, - { - "enum": [ - false - ], - "description": "value.false" - } - ], - "default": false - }, - "x509Certificates": { - "title": "label.x509-certificates", - "type": "array", - "items": { - "$ref": "#/definitions/Certificate" - } - } - } - }, - "assertionConsumerServices": { - "title": "label.assertion-consumer-service-endpoints", - "description": "", - "type": "array", - "items": { - "$ref": "#/definitions/AssertionConsumerService" - } - }, - "serviceProviderSsoDescriptor": { - "type": "object", - "widget": { - "id": "fieldset" - }, - "fieldsets": [ - { - "type": "group", - "fields": [ - "protocolSupportEnum", - "nameIdFormats" - ] - } - ], - "required": [ - "nameIdFormats" - ], - "properties": { - "protocolSupportEnum": { - "title": "label.protocol-support-enumeration", - "description": "tooltip.protocol-support-enumeration", - "type": "string", - "placeholder": "label.select-protocol", - "widget": { - "id": "select" - }, - "oneOf": [ - { - "enum": [ - "SAML 2" - ], - "description": "SAML 2" - }, - { - "enum": [ - "SAML 1.1" - ], - "description": "SAML 1.1" - } - ] - }, - "nameIdFormats": { - "$ref": "#/definitions/NameIdFormatList" - } - } - }, - "logoutEndpoints": { - "title": "label.logout-endpoints", - "description": "tooltip.logout-endpoints", - "type": "array", - "items": { - "$ref": "#/definitions/LogoutEndpoint" - } - }, - "relyingPartyOverrides": { - "type": "object", - "properties": { - "signAssertion": { - "title": "label.sign-the-assertion", - "description": "tooltip.sign-assertion", - "type": "boolean", - "default": false - }, - "dontSignResponse": { - "title": "label.dont-sign-the-response", - "description": "tooltip.dont-sign-response", - "type": "boolean", - "default": false - }, - "turnOffEncryption": { - "title": "label.turn-off-encryption-of-response", - "description": "tooltip.turn-off-encryption", - "type": "boolean", - "default": false - }, - "useSha": { - "title": "label.use-sha1-signing-algorithm", - "description": "tooltip.usa-sha-algorithm", - "type": "boolean", - "default": false - }, - "ignoreAuthenticationMethod": { - "title": "label.ignore-any-sp-requested-authentication-method", - "description": "tooltip.ignore-auth-method", - "type": "boolean", - "default": false - }, - "forceAuthn": { - "title": "label.force-authn", - "description": "tooltip.force-authn", - "type": "boolean", - "default": false - }, - "omitNotBefore": { - "title": "label.omit-not-before-condition", - "type": "boolean", - "description": "tooltip.omit-not-before-condition", - "default": false - }, - "nameIdFormats": { - "$ref": "#/definitions/NameIdFormatList" - }, - "authenticationMethods": { - "$ref": "#/definitions/AuthenticationMethodList" - }, - "responderId": { - "title": "label.responder-id", - "description": "tooltip.responder-id", - "type": "string" - } - } - }, - "attributeRelease": { - "type": "array", - "description": "Attribute release table - select the attributes you want to release (default unchecked)", - "widget": { - "id": "checklist", - "dataUrl": "/customAttributes" - }, - "items": { - "type": "string" - } - } - }, - "definitions": { - "Contact": { - "type": "object", - "required": [ - "name", - "type", - "emailAddress" - ], - "properties": { - "name": { - "title": "label.contact-name", - "description": "tooltip.contact-name", - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "type": { - "title": "label.contact-type", - "description": "tooltip.contact-type", - "type": "string", - "widget": "select", - "minLength": 1, - "oneOf": [ - { - "enum": [ - "support" - ], - "description": "value.support" - }, - { - "enum": [ - "technical" - ], - "description": "value.technical" - }, - { - "enum": [ - "administrative" - ], - "description": "value.administrative" - }, - { - "enum": [ - "other" - ], - "description": "value.other" - } - ] - }, - "emailAddress": { - "title": "label.contact-email-address", - "description": "tooltip.contact-email", - "type": "string", - "pattern": "^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$", - "minLength": 1, - "maxLength": 255 - } - } - }, - "Certificate": { - "type": "object", - "title": "label.certificate", - "required": [ - "name", - "type", - "value" - ], - "properties": { - "name": { - "title": "label.certificate-name-display-only", - "description": "tooltip.certificate-name", - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "type": { - "title": "label.certificate-type", - "description": "tooltip.certificate-type", - "type": "string", - "widget": { - "id": "radio", - "class": "form-check-inline" - }, - "oneOf": [ - { - "enum": [ - "signing" - ], - "description": "value.signing" - }, - { - "enum": [ - "encryption" - ], - "description": "value.encryption" - }, - { - "enum": [ - "both" - ], - "description": "value.both" - } - ], - "default": "both" - }, - "value": { - "title": "label.certificate", - "description": "tooltip.certificate", - "type": "string", - "widget": "textarea", - "minLength": 1 - } - } - }, - "AssertionConsumerService": { - "type": "object", - "title": "label.assertion-consumer-service-endpoint", - "properties": { - "locationUrl": { - "title": "label.assertion-consumer-service-location", - "description": "tooltip.assertion-consumer-service-location", - "type": "string", - "widget": { - "id": "string", - "help": "message.valid-url" - }, - "minLength": 1, - "maxLength": 255 - }, - "binding": { - "title": "label.assertion-consumer-service-location-binding", - "description": "tooltip.assertion-consumer-service-location-binding", - "type": "string", - "widget": "select", - "oneOf": [ - { - "enum": [ - "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" - ], - "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" - }, - { - "enum": [ - "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" - ], - "description": "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" - } - ] - }, - "makeDefault": { - "title": "label.mark-as-default", - "description": "tooltip.mark-as-default", - "type": "boolean", - "default": false - } - } - }, - "NameIdFormatList": { - "title": "label.nameid-format-to-send", - "placeholder": "label.nameid-format", - "description": "tooltip.nameid-format", - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "minLength": 1, - "maxLength": 255, - "widget": { - "id": "datalist", - "data": [ - "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", - "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" - ] - } - }, - "default": null - }, - "AuthenticationMethodList": { - "title": "label.authentication-methods-to-use", - "description": "tooltip.authentication-methods-to-use", - "type": "array", - "placeholder": "label.authentication-method", - "uniqueItems": true, - "items": { - "type": "string", - "title": "label.authentication-method", - "minLength": 1, - "maxLength": 255, - "widget": { - "id": "datalist", - "data": [ - "https://refeds.org/profile/mfa", - "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken", - "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" - ] - } - }, - "default": null - }, - "LogoutEndpoint": { - "title": "label.new-endpoint", - "description": "tooltip.new-endpoint", - "type": "object", - "fieldsets": [ - { - "fields": [ - "url", - "bindingType" - ] - } - ], - "required": [ - "url", - "bindingType" - ], - "properties": { - "url": { - "title": "label.url", - "description": "tooltip.url", - "type": "string", - "minLength": 1, - "maxLength": 255 - }, - "bindingType": { - "title": "label.binding-type", - "description": "tooltip.binding-type", - "type": "string", - "widget": "select", - "oneOf": [ - { - "enum": [ - "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" - ], - "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" - }, - { - "enum": [ - "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" - ], - "description": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/ui/src/assets/shibboleth_icon_color_130x130.png b/ui/src/assets/shibboleth_icon_color_130x130.png deleted file mode 100644 index 313df313ec23714f1b1724665d7b731864523f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11665 zcmV;CEpF0@P)OT)%pH8_a>QznMv3e zg#-~7lu2+wt1=1JrBz^pR$Hww8GlkYbTV37m&(l8#kN|RQT)4A$ROGl6*8#Qf|dl( z76eQNMNxr-bzrt+wruy_^Z(90$(_sw6ea3a#^j`(=eQP7~F0*98be=BAe6cgkxo8<>?T8 z!kW+L8#{I^J8y1o*6DPot>J{3!t@#ED(9zRI59A2wHdFzK8*#5RNv0y@qqoE8Zg*w zHiyHJ1`-Jpf#5u2+Sq~F(fo-+Kt`$N0v3y<-(f%`HLb9)kX;{6=Fgx1`RAV>+jZcB zYvi_T*REdwp{%S7?y}K!O{DRbf-8rn?uno+TC|8gR9|1_m|LnsG?+qhadGl*v|6o6 zZV*BZa$~xzXcj0kvmQ7J27|p`RKD3zj@9#D^>^C6Tzk6 zKl_n8!A+~HtJ#C}zm=y*aX??-;$!sMufKcXiFpP2#^L?=or{W!lGStB`~hO^VCeJi z&0=H;YzTy9G#dNmS>S?jDdp~9-~BGG6cScYe6QF0-%WQJO(PINet%%C%TJGPKm0Wq z3~RNS-BiMuKTNBGUlL4}F2k4)PKMA0EI)Xoe9WZ-3{-*=eg!~-7_Y|{!o&3!K`($(Mm!?WxG=oqEFf3VIYc!4kfdrbv zvx@R%u})!T$V4AM5|ofQ!m`{I0OX?t7$CyU`uVx~(F3l#;XM#ExFe8`!;VojaZ8b2 zrL?qEI{-lsw)cZ;1+W3pJ7!%t_rb}RU%C)}nTo1O3atV3Xwsxf;Fq?4Hy3_<zCejDm7hOEr`727IRF5KM8;$CmCI_kHo;$w zXCco^on){44N|d$6#f7?e#u!YBzNs`Spxu2RaFHi&;04i2ky_GbN9dBcyl}WL%`+~ z%c8+&fWp4|*J-jH01~U;SX>(nM&v-30eDQGK7Q8h3z^D;5v*A8-GUc32ZE7-Up6hv z%pTm{s?}-$fZsfRiB7Bb);7HVLF?FY*ZFt1L11SA(>xJ5N;tzXOqKUz2~I2%>AB@` z(f!3S!T=E%R33P+Hc$P|k}C_Y7!nMGhMoNZ<4BBLoEjmTHE`2#izx+TLb1m~(Z`@4 zI8^%TUvHdJFk1Nna9&q8HynC69C|1mDh+qo!yP3B`9sY-4}V?yx9h{Lch~JHntR_R z%a%JtsX^(DO*`h5J*?H{X|vIyxg2>%mE6r2;A0EXK#n22Q&XET;Ij`eitWBKw(HUd zi-#%H0OG&dZ0=t{r4|O@80?Wi^r7gZa{qNG0{vHCZ@*gsWBT-Q3IO5u2g2=h!)^Di zS~+9;7q^F7eo?n)_N-Z#H#DvlL{HBSzn@W9KqKcpJb6>4bp4QHp)@QDfi`<)PQzzo z#cgB6t;4r0)iIt5000scp?>0EN=t1q1EMH+Sn7@*{wNR#%g#L>c=h_+x0e>m{0F`F z-j22I-PG?BG0~-ht48R@3nfpUbSFH68VP`iqX3T+OW{}AtZA~uNZ!L56^_JgH=46tW`P{%ys5wCpG)s%qJ zfbKv%xc-{A0)Y?6t)e1E(GD4g5h4b zUpquMF&~4V4}Xi%dPo)XTwk}M>u7v-ZV@5h?kkpp1px7f2&|j~kI)ZC(*@e=CLRB$ro9_whfN8-VT~l7_%qlXK8gj z`_m2AZsqs1x_+Sn&o}U?2*hW=fN6k2Lm^Osa|f>c#60t_9$p0$%YFj~U6+Am(SsL^ zADy+5?M(rxRjZv>nkM8RDF(VS{__6>TLcKyaM@GO8Wb30zM*;hA2&j{Ub}YRoV!2P zubgh2IEVs(q(oGR_cz|!IpLy?weFo;y|JyeQADByMaJkcyV}-T^5`$A0!_@%xc7m) z+h=741K~k%nJ{+NiZr77-VX-F8FU!6V-%F7AB!K$ z*9sMG!FYbwyRVMdpAp2Z^+<}|V%rB809EaG4AKe%OFm~zJFDQTkzfHcZXENQ$0pU* zHsHAWi?UgWD1nDAm#_6U2Lkx20({#YNDJ~pamD{&h4j(_VjPAmuTeW{h5P2zKmA+0 zXE!Mv&w*32jN+P0Gj*A`+8bgbgJ@h@S_&s~ADsNmU#>$$SWvaWY~Tz6kLqOU$K;Ag z4EX}Y=8C%aONCQ43xA)h8?YA#qF@SDZwc;=qVg1{DhzCJ22LOn#3hb^DXGj?4MmcG zx|o6}#|H6%U+C=>J0JZ`cP{tXBjU>oNZ~ln@nelH16xM&_DPcM!zcuC%NaaK(~w0! z;@Ky$|A*L6Q&U5S=N8VGF=IRuBWqndfiJ8n%s_j25|uHCp+Edk)ClRa!Ao;)2ud_$gKl%g*P6>R`9Y2+fgRyIRCfLCdMrmA; z>h08x+%Y@SrO^=XZ63G z&rP|k4!qN2k5E73xH3bBlZx9t3v*FoTNka_Ey_idX|rZc0O?~9?4Ui^82II5n~f^Y zu~(=Ghx{S|wpubB+h<_I5E+1GMwTdTb$umSUlg@NwXZI|PN&Vd{+cEIKFpAA7-(?5 zaWs|$qRyp?9}R$rrL2*N&*VDxA^Ic3KvV!g6fpQvnD@Zo+1BhI-m$wSD3wiAn{xTX zVBl#Mt?r1w9r%96zdpL%c;P@CYeQl?jzMp|rtlNn4KZCVa=af!S!mHuI9mZ1r>YG| zVXJVgTql;U5cBhgu3B{~WNix;e9p!}PhqE|)9D~xdizcDj31vNCum3x%LH*6c8+5$ zfPs`V8b@2Xj{VFvQM;jdz)|$?36HyGk5-L#-7r9>>C+uKe6dnbBp5^a`NLMN{;4(x zF(W{+R=DzArQ2|*-cg2p`_Wh{S~Q!tP3AjAA4|mQc4Yf!wB}psfqTw<_UTKI7!3y6 z$6vJCI`j4v(WG=(1DFC}pv_ay`0*$tv~!_4T3rV_kRmvCNFMRw5XXa|aBY6sCStNv zqS9wDz@KVXw@}VALZw4}x+BM)*qvMGNX8wrE_n9O1-k4Qq889bd$i^M9{$!_+vIwg zszLc{NSlGIBUR`CW};^p0BfrLPOxu?qD=m;e>tb z3@nK)xM~;+!d%;4qRJ+jL+D^<2ZaRlnM9+7zw*IviFyE1WwZE9tt4&@G55w0EidPA zR9?N_rBP%U%(`R3YcEfw!5~TjK+%?##=t{Q?e=2euy zDGOn67gDZ)Spda=Q^S)p3qXmErC6Ya##>W1-zyA(7%BFKWkNjmwU@5K(Pl)A031;Z zq=$F@dcR30xE@sN_G1*m*7;HMAiiuw2J*+N;*R=Qb-mzj5ow9rj!JG5u~dgzDOqx? zB#$WH7F zOVuqg=zf6!0A)60{|VM*Bh*5W$U(Gld_;;XQHlni(+UIgNWe7mFUXa0XpxQ&e!X^m z{gi9-rOY85u%;j;89HI`#Sk`B2S4Frjh*g@N}pnYDTAU{^9ChrUJs-rq{2_ZdEoA| zb(yU=)CvILXb?vNH{IV{d7-9gxQcu$YrS7^ZWW8N)#W>)?wH^eB{q~@ehs!=gK3}! zuht$973DQjg_EQQgEYZlydV$MnG5Zg$G*kIOZOLCHG+$^GCLp;Fo3gy56BtAweL?h z0vQY%R4pdt{v0_Q1?o(?whBLWNBT3f9xNWph3XjqaIAKQbS+$wMvZn-u@?Kn)eSUF zd#a6MrXPw*F5&DqV#6R=?gy00686;-+dDD$4pLH5lC}jCsfB@6RgD)6ptLF%oQv5TP-}0Bn0`e5avj{ zB27nLq%Z<^5g!4Hm%vR1q#sWF2T|$1$QlE$S4$_Sj9q*&6zoXCZ%FrF6iVy!uBJ>EkLe)31%I&dWf&x@m zS3|nd2_&g-B=5LFWw{ceYymJR z{vBF$xyIP8B8`Yff(QntTU{5cu9M43W@I`?M)$S&oaOI>HFQ?NsFR68x&ZkUXnc`1 z`-jV0N}olGo>Eg6M44-h5?NqUF-giA&b1!u1VD`2gw2ASpOBgj$QzNy?rK{!B&()_ zs;+({vR&7X+l7R0p)fcCE3wOXjZJwC7Qf~DFZhzR|gxK2&WdtTrXvx zfx``I-#@wb`slbB(!lZjzD??#YrFX+=#KlbwUxNHp`e6rIuwd0&yPbID1croE}rW6 zmr_|yhJltnD95rd6ROrrv$NEJ24ve8aYqHeM1OA_kIHXDRx`Lw`BGpmPtlV#Yn-VV zVmmP~D1*Spb2-^52?TTEpnSw&pK1cPTM@i(Hv5%keqhs5HKBmOq}|BFMh#UW&# zfURc%^}?1(m`NWDF0hY|{#XB#+5wwKg3{a4VGY{BgM@(>s2a8`{`>A(w{3+eO*jq7 z9P-;gfAwIosMD&!ENGdJ({RnZS%yZ`*|;N=jDZ447H!?6*+{X1NEIU8FYDt5AJX^lBsJTVmB;iptoO z-EIeKNNM@#gu%eI@1wGewOJ+!j%Bf_6WS4n3C5OuWGO+mDa0^JM7$v9u_D)e2xS5L zjP`{AHHg(jn~lnE;!sE20umj2_8@;V(qA znYixb5$Nd|63Yf`FG!U?=5?1#;>hzz_8_nye%BYcHP{maUp=Y(m>5SR`&15vP$xS| z1P13fWcm3TvW-V7;%X6#KbJ@1FuL<#h!v6a!;$qmWSfpG7gN-sSN;u^&XUz>qULpjShu6zt{8cUM{ z`q0pK5MK+iy)3%D@$YH1S|K*rY_{}+k-|YxU>#GZPNg)w3R#SFz+D)1iKNxnZu0Z{ zzL<1oL>f3MX8bYXGO#GAzHoC5JIJ`fK%y9x;tsZO+x8}#f^CW9tR*fxXBvj%6TA`t zu%R2%+k&?#!DTN(wrMmESZK$FQ0pkqeBvXhJB-b7ZFwkZp>tt-3fpkNO~z}GyYhYvQc z{kXYVn^|~u2IH@&A#&&Ajg~8j?K(^~7h-HJ51$IOqe`~~eBX94?&gIU0L&V!u9(H3 z0)m8ciKkVx{6z@1BO}MLI-o}sgIyoA2;7vBH)Lbx?f{9(?V`KB%Rdzs76Kk=FpJdA z%z!kRYMd1kD2{6Mo5XM~S2RtIj8TOBl6AgVe!pB$0}9*0`8N>LQC&+h)O;aw{hq?$t0SgIi0fHwI!k6Lb)0J(vAr&Np5=5}5@yTj(uAIr4M#|dCCb0Bo1guwnCCzBhs6j$iL)0H8g=4YZ$R~@~GJ@+V z^j?0H7r40UCEMpQf2i|8Qn4gGeX#+Q2w?E+iWf@3vDklvEDsS!G3RR{mh%Xt!KP8j zaJOWiiaq;?a}Kgy${~^1mr0)e#Gp-7Si^~`QLHBhI1nP`JA_g}&c)8aj!RXRQCu>= zqDQfZ=ux7AE6jfM-Q$k}BqoS=4rB!s8 zUXm5RQC^i6>zrXn_khq5q$3nCl1RL}X??e&PNuC<lEaC7-@>Egcvr~|n>iVF1@I>W2^t`uuw}aDDiyT^lE-;v%$EXs7Y521G%Llu$hpoB)t?ubY6BTu@5kw5}> z!Jrcfqed%_mjmhO_X=RjVNeoL=N4iahb(`T0{ajXv1KS%vjN$jBZ}?=qqU62zJtj2 zii8eg=*~}2r>1u~!F@`<2L^!%atb0{!N4bw=mevyS@25S?$)ts09QFq&7P&Is;YnY zR!lhzkUB8GRQ+FKIg1N~k#(U&149$mg|K-vu3k@UFG&m--!AOhN$iuk>dnORis;&c z9Gj#b4hP3EkPb_Sl76&%1nVU@VG5*AgWyTrFD1u@q%jZMP`+?bTw?t@t2G@PfGX6Y ze5F)b$hmhD>rx?bFtM}-5c-VR7K`Aoe7lk70I^@p>GP0#FPXYr@V6w1H8~6%@t7Dj zg2dR>E?LgQokCZ26@9PK0x1A=8TN3Di@PST*V~W$HLYvk;AGdMynTgKvyB*a*m@>c z@r77;F0R=wlMoFGMiJPD>!&KuL1L|uF#xdUs1tk?byB82)8H=oFwLLWM@<)_%3HWD z14Ml$gYu7p%*RCBt9No75{h@pb94G{DO{Si!&PD$VBol!H;zEw009i(H;(E2nxFI9 z42l5-ERU+QX)yNL)N5v{KEG9^Q}rN1eT9Lfc}?uZ6Oi1E#AN89@2X^*AiY>aGUQSh z%dibr>E#tipjiDCA<_f`_$AOCH~~8V=Hs%d%<_8wl1pic&2lE^yIWOq5mz`4+fBS8 zZp%o{G>Ge6`Vl#s+lR>>j;?L)#Gs2CsoWtij5rG?MjDjZK>7^SJn^(io)*#*0F+ob zSw1oztNUwqW%~BaP%>&ze9tdbhCB>mz%&$h_cMv@GY*%9fzxPZE26n4qx%D0LpiL(ym<(=m`JrYTBO#`=f1m$GEUp8k? z-yYqNKrqS_j3Dbjgg`qn4Z*!<14l!IJps$#BKxEt_CS6Bnp^3>0%J7 zK7zCCkvu`k137c=7-05$+rW6Ssb4l{PwQ6cKrNVS@*YB#w}e0k=`ABWQa+3l=`PED z<>R8fOxtIIZA&Z=A&Sws8WXiC1%qw`sSolR5Rju@O!h*ghifX*ow6{1@haq%A^|oL zBAu)951)}KCvj>|64pSwDTDuaPPS_wvHT|nVVNP}3z5!pKHtqCP}htaCEEw2_x>oU ztP^?#fOV6G*K%=Zdy2t;y6(W@tw*Le1>mNgH3{h`vSOw96ZcEhAOc9bsXgQ;#IENJ znQ@VI!oVx@0mxwuBHry2XlhWtKNg7fHC>AOC9AyPB^V4I|2Fw)g@NtbKu4#~)Ue<9 zTam>nRC>gt#K6~v0?BrOv^sekIO_@Qn?CeZt)Q~Qe{ztUDA9L-Kj$j88F5f25J-oT( z5S@q+4CzBsJm*3bo4A;2k7N+tBL{G0`q|3*Skgo(+%0IEH1WG0e-g)~(-hopw|NL( zcD@E_kadV^&G>9%X8a4d>&Vm(1=~8o197z%45)YZwGp30lH#+Bge*#DNQkHFnVpg{ z&z3gHt0 z=~B$#P;w1CAP~nl^ok{eRJ}@HF%g4`V^xh)00yvwnwpxTiM;h(o{oU3k>fz@q75Oo zBOw4VfBt+hmo;nFD6gVnt>%DKx>cO|NesUiF|CbiGm-Ut+{Gzz$hJM^?TE)>tqR$` zis{xxuq!flLu6`g=bi%Y&ynqqJ*r6w@8mf|l1-s}lL!$DOu?3??q1sKHr@YJDRcuv zt*WXrkHwCeYS|Z&>fNzBH^+TQSy>raG^^c1nho(|*REagOP1v&H^_(WS8}>+oa~e; z{X+EtDfxfg0TR!gd$j5g>D(M&14$$h^hozOd`qIE8i~XLm_pU(^qTXBYI-pO(#e#l z-&1k@5*|`pQ(~_`FrJBB_o(R}JRR7vNi1GPtHfrr`S9y%03JXExF9?s-8Fa+@|5s8 zi9_v(cDU46V(~`th~EJa1yf6YS&;E8MEAy!r)7Hm$b1fR-o@+q_zHE?i-JFhN_49E zLo&LRxO-YgMQgO8o!T6j^6{*gJ6;$-M#LU^Sqf?)d(@K6gP{aq9S0%$>la>6V{#= zFPn+WZ|oe3usg-7Pl;ZIKOdb%x034%020sO%G)AOb@T%a$3ANhRE)hgX8MhzjThu% zF^Z%}Q**TP{Z`LcVgG(Al(O4#`As}si_k%Qhmie4ioyRh)rak&U3d|)UW`#2#8T>% zJWa&%Pl~~8m3mQTR&^|@V8Gt_)9oUl7Jvksq^*FVABLR2!lqF&2C|3o>>+>wRVGe$ z{amNGdtyMkW{AhxjvWU1Ep%V6`fz5!6@#$QA#df?D)$x~2?iU3?*E2qEm}>GhK^^I zucnI$zz&Wc1NK%CBm^Dz%SCKCB+wlVKN28>Dj3`u3A0cSc5@h&w8>2w2Xs7yO=p86 zN|aJ~Wcz#E#d)LB%!83N!?U^v=WYN19}}e$2?Mwk`WCB=#m0#`B!&qu)YjGq8`}*d zh+#w~Qbo18XyMf{+#%5oO$Ex1XdaN5PI>g91@5xuX?X#28^Zuu-W0s`XkkWXky=v~ zjXV^k(cWk@0tQE1JqXsoFetndSuR2p1CdSFz>f8jcOS))MG<#ctZ0swPPsh#QgB zn0!DlzUW@e$Q%2t^1-4kl{73@9GWW*$rT6Zii2{+fw`hCSJdW;dAVXvt{&rK6Jxig zItFS4)&OGi(+%8$fk0^8+C8tmat)GK`V&5erA)dh6(98-3_b6_&Nak;Ag(j;DZ_<2 zCH03B2%GGJYzOb;HrqO2VYwQGgUk*bpGZ~zCPt3)NK$EgYf!!#e7vVOP&P&{xN78# z8_q8HfzEWE1_|vDz_8GUqwQ=bJ`@$=1uHOxcZf1?0jvrPk?kt&3=0bfpx#0>lJj`v zmw9ILI}+1p4bVVk6yt?9ckZOReRqXh?u<13EP8O-XaBl*_RWJ7+TQD{S(TSjXtfz& zSa;0Me_~z%oYSY8kn`><XWy-Aa`cXKnlS%8?6$NJ{1 z0qlQ{|Mir|WlcbqyOo2w)VI-OQ}R>qH8jQnx`(2#;XP;8?&F zDD#}bQ9wLA%rZ(g2DfzCtp#So3soDIEcQP0jOEE+PeiicpqpFKjmJ2M|8!L-A2W@k zyW=s3bC_Vr;y)Oc(KI5^-2T&_IG_2`4+z#^P9(erOM-htgZa`7c`v^V@SH>?R4$YJ z2dTz%qtWo?S%%?`i87t+Wh-R2DE13YLdUu23U1Fvax8K?`YIDdf-!n6V6dX*>jlqm z*s$p?T`mX2H`pSqb?q;_Rx886kl^DSX&NqFt|!=+IPAUfd;@ReU1d%sINPQ1v~*lSn7V5S8Aon8jh`j zC?ULqLEL)tQok>N%z8F}uy);komOqo=Mi8svNb&QV(U{2+Tl6ZtU0Q!rkFS$dFWq$ ze*j>X;p8zOK}7ebO~IC!`Kl2F{2nI&64mcESFebmK4#t>@pi6+DfG({_Ef=;JW8&- zD_zNr*|tUO9l*7ogR=VK#Y?ss#^lM4h<5kJj;9thfvUo#jxsp{rDj#5-#@h$eq8Xv zCav}g#Yj}BDG({ zNmTMM1Ka2nd=wj0pzjyZYM%Y$WF$s^_ouD?J)z~xmmjmq!(}1x!j+RVxOzUVj-dFuLY zQ)0U=5w@QrZXGUd%97S&@-L1omR#vmj(mhk4Nu-uk=N9uQez(5S9r|}!Yk$pbi%;^@Wc2*&Ly@pj$L+_PrX-7I zNvVIoAAr1Pp>1K~M%Dh)E0fwGzfRPM(lZU0rSDxMi8y-N$`Ju{3E8PAcxsrBu179(^ae zc1j5&pa75-gj!IQyc#|ITlDvZL1}3zeiM}HM+GF3=WujFl6dk5WqJ;1EnmJo zofyFFn2Hqgs-75tWuy&*biknKol>@ABNNF;yqlS&P0Tb&Ls1WI!Pc|DO`q#+H~}!w z9%&}dDG5Vgb7T}Gc4X%$6Y=25Q{FP z@Ns2^U|#?vJH``28BQ<^$#kV#s06tbCXGIVXnLK5*_ZCKfpLYWfeY#j0L34o#Cpi| z3n6{`DILC*mzUGhaWGh>$tX$k&OS-15n^sptPwj`7Bbj+rhYwVC4+nc%R-gf!1a=- z!o@415mu!@y{*O+x}1q#QW1<~G-mTjv#X}#hJ2jC=y zL78#Grn)jJ1z?zY)ltg27ieWON?t7rF~DlI0strEEpMj`42rJ@XYF)4m0<~RHAap% zVCr_@M+4@%*$SJ}$R?PA?t3Ls5xo-X0f2PAlKYg0L1|98DRaO6*Jd;tEs1ub-t6{$ zfFU`IdlC&uk&iC?^7j-v$eK-@1-Y9{rjt|jr!WlP*LE6)(=eQFr(rk^!|8S!hLf`W be*p#nPjC|=r4$7j00000NkvXXu0mjfIC%Fk diff --git a/ui/src/assets/shibboleth_logowordmark_color.png b/ui/src/assets/shibboleth_logowordmark_color.png deleted file mode 100644 index bf1ff3b92640e1c697f807ba632bbf04e4ade5a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20845 zcmbrl`#;nF|3AL-hS`R&Ic!7Wi86^5U;-`seeyjqJEc*0w8#=HDi9gRzC>bu71SVw)p=(BnHR?7~LlS z`9S)TVkiKVPzS>O-@^v~{~v~EJxY>+utonfP@w($KL|l66E^_{gCQAV{us)H10a$F zC>y%3o6nNT#JNZ<13RpC;U7x{KmaIj%o|e(1A{UZau$U~!*slR|DIslZuHw&&?pb6 zURee)G@U?78tYrjg`@F>u=ZaYMPEV(0)WmtSkfwTRNo}Y=FI;s9|6FSujnIm0ooCN z_dGgD35Y1Hy#5Ym2RlzAZ2Vz-Tk?BjI8e1|%s?XV`ByfZO>u1m*j|jj(uG@cwG5}2 z{Qx^|O!+|~k+7Fe|K2#Hk@{1?TUplD)})OW-A)Q65=;jy$dXfe4ZZV_zM)NrK+(U9 z(}40$UHOh))oo&8BG?ZMGXJv=BrJdo(C)Ue^Y!(u?&FmN@O*RwYnhsx!T^s&!29hK z@oFOA{A5eWFsB3leJmj%L69Kh*wj73=x`rD+e3F4lG`G4H)lqrs+67_CKC{f4E(UE zjKtb6gB*yDj<&eSP$`clb^p&}02~+-5T)=Y3wnDAfys-V&ze%oHKyAGT0n0hI z3n8S(+iJ%V+$Xam$Gfzo%bxJc5mi>;k^6RGkBZGcA7fGSRoY;&VO1nU=hD6GYzW^7 z!<;&t044tbKGq)a&B{8=Eg~@3&FhY|{&qQ-p4x?h#v+jZse*z6`t*eBG9+lhL@vSu zi3`UJ!yPjhcFA~Z!xTwnc6(V+slVa|MgJSNM0|Jr6)XF?crxa9$ zDX&c0(M!ZvatSz>zn^GVCuBJef6WI>-Mtb>JpAAkZQ2`l)Re;Qu`}hKojxd?MHU

b8f?ZCTNC4?dZ>6_1`Xoj-_-+yH9?AiU-PVB(IEDLJo&AIfXeDHQgogai^fo8oA;O zr38-1R3Jz7J%PdIQB|hI3{w~vx^^Q{ll)zK!|rWqOl}kT^aS7R?!}GT-15Utuoe{o zch;@}gueB^sNJZBFxaG>-9TjZrHm+nJ`}+m^f9o10%EwqS2p{;52Al(n2S>4FNI?UeF3*f)DZ$BHVGzc6m1A}c$N$ZJWHE_)rCa@GUC zJ?TXr3-*fj`|Al1?*qO8evCU@*FNlD{oCl@QD!6;FQMdEB{+V1xA{cm`|^Y}ZwdaK zLGSAuy}*h29P++u7xC!!A65E@GoRk1vt<(5KgjeaB0+hs0|!7b7F*JbqF+1HE2-#`ScA*+#EV2hDl zt-W%^qReye30LaAiz~nn(om8DJJ*LLa{cx9;vYLSwInzQ23L|25}H9qcRtp0&PD!M z*m1eXX?NcNZr|k_$gu~7NUb+zTLw&as2n{ME7pwxkMYcGY0bc!ZWKZ9$>WjXw}^bv z9Qck0R;i3jxCj+7Wb?t~5_r{R;FNE|GtGT}Kqc?SZ<9JjAZ=)KYb)o&wdM@$3ijC_ zmnUtMtlV3ZQ)`5$+ev`(Fj&YEM(tZ91Gi#V`b+-q))4N82|b+B!NW{*Xy89b#hkH| zoyS6jOc2XkY{beGBC%>IdKb$DWKQq~jT~ZfE9fQb7-nGc+$(RS&qjM(S;Mnf`hxPD ztgnP1Z3jch)SbNW+?qxYkNW@RP7*+!NtfjQ#oqD0_}X1>T+gnvLR*~{6+iYdPg6$V zR21o^9@0gGJ(+~Xe-R?8J+Q3NQ|;T3pN@u;uap;O@7?pAn6rpm13e)7!QdA4=Jy^0 zj$C7EX3%8l3r_)GwUJ23%+gV99QH>|B;6VjN2f0U>xSTx@}GrBLb!t?Xv*xz6FDM~MPiPzzNzw82q^J;ScBFm zyhol0KIJ~p%8>B|LwDnx2#3ZyDzQw6i6)rz=yGGACJ_ZCy>iyGtouP&J(pB{!d zcJI`5taG7s80~6b{kxj6`&G%nj#0@_yDDDJCY#c;KjORVzq(NORU1(E6knZ8_gkW)odxr&h!Ylh>ks(C z2F&d8dM?Kv!72IA;_^=DQ5}Z*a~qMR_KSe&uq;Q9bcNpTvb-WnND+q>0dUy8!uBv% zNFKHqvjScG$U%#cfCLWrGFjhb&fi+%0k1j&aBtfZ5OLAWa&tvxb*dq!9s#CO5&S-W zJUiGx;NOo1FQM9CB=|Gg`V6c~xUy9`WcG>_e+tL}RGpss>B{d@i0FM;CuIHqcuW5c zy)sYvQ_(=20T9d!`azx1%_zw(6ZM&}ib$(c6dK~bWv+sfHJh&KY;7Jxe+Epb zum^lR_o^*PD)i>pi;7+#3CzQc?CCOTWnN0uieXEt<>h8z6b*TA1hG z?|KF{ZtpSQTFjqy6*rfvaDD6??BH}8iKNVUC6Lb=N_IA4w~kkEY|*qYD|e**@$z3; zo)W?m{1^aCxlJC*5tKj^4AVB{=!pBSxneQmAcmPIYBEiio(OU7IHZth(U&zLs+VAK z=Fv=j-6~8x-FM{pLVTP5e5+g|)Og?m$qAe1@p$Fi(W9K7PMklAe&nq_i_qs zzcNlSe>(E{aSowFvjy-2nQ4yKfTaa`c^sr;~Z zu#e0cc+Vbq?f2!g*gF+EaiI?sgm>-YR?{76kN6HttL~9AU>Fl(XGan-?-C^J!&-Npy1?{cnCv#+~XiHKYpbz|B>EQN5 zDU_xlwx)Gi0d23&B9SO}6%NZFF-ylBGoxc3CFP&21bmbMZf^u@mu`8Imi#B%RQ+Nq zl8u)wDvsUXbIw=|;3iRzG+%hYFTZE~ZQm9lzfr%U(hw`sYjBDgbQI>^-uKe1WL=}a zEtQ40UBBN$K5EbDw`>}iuYTNstgUsIKGtmU78pr?9^syS@D{oJQYr4$*CYol--%^= z3Hnn>+L$?UOxB0?%YnJiJ~S)W$s}8(Ze1jtfw`O3^)^*b6U41GRfo}c@1y=O1&O*^ z#hNB5;3QTd3eO-K4zdb0}Dx2I*o3x6k<-LpN{-CScClj zX(RH**#&S2UU{Gc2{o!N_QW?m`T3f_&8A|sdE3|_w>2Uq@Acy73h?M5fGx_Gcyvs3 zko){?BB|-%T}O}9v5LsPhZRWU22~tj(>dnZv3GD_hJmsW3A!lx@|3`HPB0pYnES8mn(0Z$z@ z9pqs}KKKUrL*2QQh!8+%WD7-oC2UE7C1>1WtYCVoQC7GT!oIPCoBVm7XLZ;Sm&Wc~sOPY+UCwVA?H< zoqJ0SE?n;jf&O}br9QW)CcOq<1Ju+O|q6}T(1dW-cF3;GBPg~7s&q8%7z7p%lQW4nj+-J2)xrm zd=z!mPc;J%7cw)<1ZNjoK2-=mj^>=hLC8n2x@GeU`H(lKzw#%N_bi*YXv*8hT&#~_ zI^CQ2fY=~zHgsPTTju3HjNcB~n3&kq$C9!NZFcn{4=y4hK zyeqF%W@jfwwx@dOwZ~kEE4dtEid#Ma0htb_m%tNT>l;vf!^wFI+RqUAMWi|hDSlW` zlUk@;w0)zKNdhQ%VsILhMKwqr)$(8G0{vkYs_8R*keQBOXqT2l z_n|nf{1Vn!>uRnlQ&Zv(wMLy$wc5f7ccT_^Ju-8;jmKqrF|Mwu&2JMyKhhR+WzyAo z>5|&N=5~wY^@ErKD~aMA0MRQJaYu@>yf^ zT8d(Qi+v)Kv~4n#w;Ydr^l;*v_h;EHG(+XI1Mt7whh}L)0UqpL+)Oz41%G3 zV|Ps50xkEy4*2G_)LsxsOXqao2@F&n>_w}1$^8t3qnFv*Mx8gfmEV6IJtx$5i z6Kl{PR5F133cT|TB@5{FI7@~HQ$+)fNc3l_P0?%Hy}u8FWBLo9Zji~Rhosk@R@Y14 zdSDs#k)d^c4%B^YGchB0KUW1BLD~t*1q^zud|fxTdWcZmIlh2NH8;ICuF#HE#gk}} zbhlJg!u$EgR4a*<*KD&~ZWXg-$KUxj;Qr2sQkjj!pOge0pRk~A`7fReiw)*xt_tR= zX0XK4O-B_kq^Wao4iM}lZhGH{)l@0zsfb-YEuAj`4fuy<=TA~7*e5^xwMVYbaVJz* z-9hlOZeQC!pd|U#tK;b-64Gpj6$g``mz%Z2KQzgw{#v8kJ>Ok7v633rv^NQ;tjO1| z|ERh2)#Tz|JxIxTcuOb2tfX1hEAbz2jj>0hfS*9COZNR42idBt z8By_nwb2tr$Wa-26c%Kn&M}TA9<#?}((N$rRGgr^mD(1wz<$WUYE~@LX*AHZdATZ9 zp@2q}H)>c=nGO~M*dyJmLhX5ziFu#VfG%CdpvJ)c&zJBzYz)j)dCD>379Mc z!>c7Kw99&R(tLYo23ZmQEJiv6HW)0lldeA~!56C9Z10lwMy1Q@i_76L_-vpCSnI$o z6*8ap<#<4rV@K(irqQGI3(ayJ_aMiIJ5izQpRs4$u~|ol$o#;=TZAg(1a}iNuQfT zdfY(47>(dDbVBnO;mSDRH7~k*kyX;x5{*P^^{OKChE!sypqc$~K2`hc(I)7aleH$; z_C%r}yfr`~`InF?WJnhnTr@-Jfc2bhPtxfYzb=i5ajOuD==2H0(6oj4q&C3$DO9&@ zepK!ZjjT`wBou+Wh38Yhxr!k~WuD79^pgNcUCfcm7UA!VM*HPF3F$=5t#-vFfehm6 zdQ~#Qp>2bMlk=uU0Vd%&q?``_=?nj^0W=M3Lw?$X8a+u;E^_Yokz2I46sjv&M|&N` z@M>}TUz=g@&3Q9c4bW*X9(?BAKedh|R=Qhb7BjqIg|C#g64xS23N zpG6t8AMh1s6*I8d>8A%sa_`7E1^T83Ss%{NO$H{oC1k~lFL+D82zeGgdZR2){gu3@ zap0FnQFRX+vQj$#oPyu)Q|RxB)JJ&RC+r7z&jY5(%6lvq4fYW>sR^Fs;E_3(YgP+< zvl{T6!{rN}3K%}Gnm|*!7`U#Z`3dCgu|gaUIe^2BSP=DwdF`UF&yR3hT)lDl1w|`K z25wqNCB(tjQh1MhnI+w>FuA%NMx0w+H3LkZa8E;V=O6SS$83t*;a#_qtQR_yqzL}F zWH5@9`a&dESz3rWw~$D^SBr5ZkGbQ*;SN`Bj=hqE9d;mf)PUzQEcktX&}qRd9~-n} z*AQ=~_WyFjZ|7RF`n7hQ8&h9wKODP7g;U=|Ka;oZt%ssWh=e0_%B|PJRJ{!g&=Ecu+|S%T%X=fIN;&BxWGBvXqhCihftI zm>~%Y^*|zLbp-fa^wn12ofM|0fh6gD^M6R`^MeD=NPo(0QsA$~e1f_^BZ4Bpbp!f4 zSj^yUtiu;nCl5p_I@`s(Wm6TDh`r!cr(S|(oVpy)6Eorta~nlFkcAPwKHT$JK7*T- z1-nV4qi*bjSgmZs7?P7ULKU45b}XG6a})#~_%Z&|PanSTepjmsY0UC0z7NWqr&@;3 ziX};34KsB;zJ5YKy7+7bUnGf-Ng{!Qm$dku1-$f1(g^(;=*SG&%Ti|nZO(6dD>c>h zg=~xIp1RLFW!m*k(P`E$SeSDbi;nl=`YtE>9KH;;J;v~OgWP868J(xq_*~H03H!`K zonNEse5E~_?*X4SBECq+QLZf#t`_urgWrAjqXP7(Od*4tyV1Crz%-PeC!tcG(Me}KiCdk?QfXtD9z&bLPhFLo?upDwP^1ldf%T#fJ zmh(R7NLpbq{{OQ#sRur;B8a_Ltf%J?n*>dNwaABso45f1KS&7qJ@yQPX`==HqC#%c zD|eVQ*U}T zr;4?ft6F(PsNKJmw<;oXG?~m(s_WWR@%u~@ab>hnkWh`qS!zeedy zz5p;R_rrW{WT+A}O@8$bklTNe!|QO-}5HwXn&Ct4#G^r<231TORx_#1|D znEqndIhI+aMyTRFa4$-d0z;+sNAzE>2dSPC>PEZaX{xN=|5sUYTrMuO<5(?yiyP|KRB6YO& zs^YrkN_1+OR+_G9AWnahV%a${F|n@n`|k>v>-=k94_y21Er z&gcz-wZe|jf#{FpW(yUSM5#A5%AS^~LF?ga*tHNrA3WL=KfI^ITNxdiF`~~5q+tb# z)bt<8(al8P*m_;l}`OwPXssxy)idljpYx0=jM1ZNGv6%ahy7Qu( zdyym^BFGnq)B+n}x11GdLIT`e5@}oG`+rut|FY64yIC=0uMkJcjCxjDITe)YSI(tq*hyT3EP8Kw(g9q;*q;pw48uDlhqrQ6u9_Y9V<^=)n441Sd|6e zg@xYqBYU2F-M`^C)23q7ZAu9^ZeXoAl-vtb?Edb`POQ43Zs8?%0JooPhHSszj93!=WEOS>v_5p9C{nCO z5v`~)ET|5f9Be{FevG`s?{gKe8}_2Ag^3-9pdbGOKAF4`e(`uE`J8t67IMOxWq0Mz z30&^MMjSrN+@zj2i=nM`d~)>t-&o-)X zE7&WlK|3IV}t8p;ywaW%O5K=T*t})bdc?L#lmLX@%3sXNK$iaHij<^Y3lvP48jwu`Ckpi zumBYA0y8t5hf7p4iZxQhiYl6kEnvqC*f=`c0 zh*&`Hcimy5?iG_`&=9qJSO)@X|HnMx0B0?l7OES9#hO>?YB3c|_2s4}`nEkT;9Yxi zggNpauxwW457mWr1FGHtXHOc?iK3j(be`xikLd*8|M;0VHw+3=GZFV}=y@6q!WdJuRs#(ReMyFbrQ7T{Q}(Zl?JM~T?Xdo>hQFx_jRZbBm`tz zdYpknUS*c}>soLC)_0WTfT3omu$%%``cGwiRdjr;wTHTGEPUE4J$8M8^{f>UVf>u7*HI4oSz~cj=1sKmXz=0OX&dX5im-yln@B>uSMTp-}o>FQGwb z<(Y-}?qVTiR2yKcU8^qmU}_XLR|oh%3(;;#1uXTFL@vd^V54%i8hN=43+ZM(%b^PV zzqB%7K$oj&7zr!a8#kuLu_$=BDmqj#XD{~Q))bp9+wIGRZHt4!|FY~T=p$@hJBD7D z1H847zCSYi^Yar+dwDIQV&cmVOwyoQu;|P~MMjwq;MYD;&kLB{d_o&fH|-X@ep&o( zvU(dQ-VJ4_m^;ami7I8UpAghDJT1S(?0U5~zGv>}G5jIc+&;|8WeLKc|EoftI9hDl zKb2Kn?#smUA4Uq>_;Scq-XU5X``ZOfOB2b=;GuQv$|%oJ`)+3xr}5q$J=~daM=eZ<1H_PDs9d9#VWWRd z&B*$|^rAk!1U<8>7y~+d8rIIrQCwt5m)+M8_=7!Gt(dHcq^wFfW!z2kK#$%i^RYkq zMxpiL918rC6=itNOdQPfxpV=zHGe^{B@OUWNd%6LWs^8Vj>Hn++0#eI)QI7O*rT$q z!gbJA^5!Y@)>{H@SGOeHhU@|CHg*7ftVo^e6a<=UX>=T6TDEfzvfSV^#Y?JmK~wJJ zxMyqje6P6xdTndw&Cf>#ew9u1Cj5+EQV6=NuIC-J>%hgGoR3K(-u0w-jH;E$n<BL2z-tduMp-5c%M04-h8~| zQ=c@_Hl|~Wa9^s@`hHMogQ6$G!YY#-1vL%LRc?9J9{40Brwm-JPoG zCdL}N0{=C7Tk@IQS@P=l>Zu9x(>B1S!~Nh*x7L62WZIk>|4@~)a@pzeE(q~R>>(;w zM(+M-c=zt^6x>gB)UE;lX$#f`28H9dTL0~)^_SdmAN^M-LYz~oB4y~dDF}6aiq^bm4=HQD0No$#qUi5f<#3voPwKlv zmX_qfF6#nK=RqU+k~^Reg*#D!8pW$8&wSF}{zePbb-wH$7(n}-_>qL!=y3 zm62mU+=od)Mr|clwgLhVWh-c;c%@pG+o;#^Us0BF`A?e^wEc3E<{ ziz=+ib!Ds@MhFTNBV29?**dM7HoiTl`xU{VmHKjMh>~PdMQ2ybK`+I8^2@d59<6Rs zcpI+AnVi>Pirvg5UR!&TRP4^Ts_iw_;F_x1Mo`+ih0-Fwk|o|T)|xS` z7sc&yG^@3Ojzz&mC&c7}>YX&B@~kh*JGMJ9_wd8-}C4<}9QwcQVxcGFkJ z#`yIp3^QNaC9GPG5L|wmw4DDhdf%*TH>C+31`jr23q(C<@+)<^ISyfpTw(aBlQQW+ zI%_ZY-33KwUgI0$gK@z5w`x%2u+71J#I>P0!j8PAR#v1w(ibYqJLI;PsJ#sQ=`!T@$jAFw6{e?dYa1#q^Hvji`I{)$(F43f4Wl>aR`)nAo3a-3 z8gtWP9Q0HvaD}qaG+-PMiQd=S~jj*+-3>cI*Y&*igesTi_c>rDe4~C|h zcgPsQ?1P>0C1W3)$MkMKlKJ9re$a+jKHGtu zyNpRo`XXdHk7j#xvJSdw&Cv8mRz5D2zAVuDp^Qb4qM9!LBsv>{@a=O&*f&uzf}>FT zx&scxPRs`6@kX9 zhB$TU#+j+Zmv6lfoqdnPw%2YA(n}0hYV8jFLOHH~ zlt;SyVBY$M$KjJ(aLhNofR#VgHH&&V(sKBl;*BC3`nPaSzS(DtqhXRxdWc=Z9SaIP zG(Xje^V235C_fh{V23lIp_20sP9AyDv5zn<{$XE$|6MzAZ%CN8HI2Es3mQb6KA)fu z(lWXLy=};@&o*2?DtxG_qQ<(7>eFLltTE9-qwqlB+~FpDFCH7}JgDq5`>qE~=Yk&V zIP0K|#4v3tGNnf2F$NwaAU<4qhfT*^pj|_bP>TC~V=^d_AfpH1<+xTCIlh7IU<6y3GA*~scEPK-|D#WT8|ZkSJ(s$q!L?>5*b@x9PRS|#;eoT?0;mm zU>tGM_9Rd}1nr#q1I(KCA?KJU6spWfD~zWXqC=&vA`DNBUUVzI&z9&Y5{9*;N@K@H zB(R_mX}n(*Pm|`D?8_^&i(k4w3tT6})I|(vS%_6N8;dKKerS~H4ag>RLertfCcbW``{6VR8*%qGNRoinqgpO${wOf%#BJ?mhNryL{`4<_r^@nmR8@^tqgfb6*` ztOV||I&vQ^wBM$UUV`wmU&fTI*XZs84tixy1QMMnaTbL8Z;!bca`%2lUf6K}Xq`#< z0e{&k0OXN&$XU;v2z*V<4e?&eCvDL& z6B3SthAkH^@ttVrfGjq(L7nVsll5ViMhRAysaA?~TtLx8g73IooA2>Qq|s z^`PurE&@pNf!&|H++}v#-QPx+#>!q!H3Mg6Z1B6Z+AO}isI0`7=MRf`bZWtk9YZg^cckvZqw?53y^tTk*Q@OdE8j zY%e{R;kFmRmHtA7AR<3_e?KjcMh{tqZz+GSUP*Rg~s956}4H9C$S4pyaG>x8Vw~4YTY79-s7Zw+QgY&}_ z^QC6P-;N})dU+k7hFf5-%&8xQo=rT95K?etFic!iy0FJv3?KdAuS{rgM=KNNAK<0MSS_nn2zCodlG7}cExq8u9n)%Y13r-ym8;M?byLv2T2{<2AGLFFe~SwTJ@`5e94y%M)YOiC6P7Y z8l_VveWA!PCa26#RaCW+?pYb4qG=vTN`$-{Z_K+ALP@cQm|qukw(;x{4iCp>6MHf! z#Wobl9=oG1c~r^-F=dspRv?DeBBUH#dLi5=-HLw{-ZV`kzu3O}wa9pM$Y@J+8TYIh zpS|Nt`&`$((ccYM6Fh&cSDj5xQjMn@_hA_fdblXylSCT z7&)KF1$U}+syr|`N#ZGQB*>(&>>2uMcpE#haf@lr70@cgJ_SR8x&)4-Tu#;wskEP6 z`y|PqsU0;4?!M}o`KSQcYDwko48`on6^r#LIgo@fLe~|*_h`WKD@(7N9)XF2PK))tkZfZhO9_UriIP_k;L;-~6Gi#1QqrhHq+)N!8q$fN=8K2a%m@A~) z^4A@hu~!t@bQpM~43A8Cb2*7BC$~0-zKeb;fZYwP2o?K6qJXm_&p65Ha<_M+Hh8)m z+MbDMScS>!0S~W#DwWv|d%*8x_(=ChQr8e(o=CO21_yk*gt@t9MPV@Um#zT+r7P?~ zK~i|;RWn->o7$z;;wCwv>k0htN$|9fW}=E-rdV+O;rl&TtzrM89tZ+G#Vfa}6Z@%+ zNR&uD=YKH|^iVcPfE{&!by=*HSiUj+xe%ksE3=A6U?`W0F!Z=62|U=Gf8}4RYS?tK zhf1xHIYr?=ooLvwXkTYIZW#2EWu+2$+Q|8)-daEADU!i81Lxo}#L|Q^t-5#k-gH$d zdfh?%JO46yUUjP$~4^BKsOEo6sZaJ3D@+FT0Vbv6cF?Pg@RT~Go;aMB^H z(#9)+_=SZ9G*y^aWVfd7i75w*al2mA_XsQ>9G9)Vu>&F4CA_1F_vduizTI)YnfnC+J zQ|Lx4iCe3Ag5tvIJ_xk++#FXe4(jIiFDb*kUN^SJJ)!X24)`)yQMgf#>&0YXtdS{| z(lNfVDCGsSY2BIO|`>aTx@BnX$ycz_Cq>1RHDYm>^3&~wK72;!!BhH#zG3hPj*4$}#Ir*_RHzAZ|6=~AE`f*L)2EC)F!uvFb^N+p!~14$loNDNv`V)T+asF!Xqj{!E1|> zI;Ahxjm)0Dc&&<>_OpcqQ&)>peMHr`-^PvVF$u_n>Hh6zLmOD>c$L!0ZFEkUGzPvZ zc<}IHyqo&oQK)Ca6*EV`-|mp_#%b!?PE-cN`&Ii@0XLt*JO+#&H>s<39cw2PEC6q= zLB3%g?wC`n**2I6c%QKf=Mn~(PB&0S)2im-4|Y-@?kse57(R2hQ<8-2Ys>^1z`!nX z)$c#{^%##=_@4x{OZdwkce(w0T2g>p)OoVz6fJ-m>{)yaGEEcMWM*y%S-(rc?5r8E zJGm^y{5#-tJ|*xx;rg%cUJ44*bu3}uK1c{2uDP9PHKP0_=h^btHY%;e%@0*VaS-uP zo8e{|h*to;in?y#T#GdN2%OoU&74kiWGA|7td0e8$9*Tyf6R1Z_?Ne=X+o4NF*n+%s|tz;J9_v}Tb;B{+T zgX!SxbcZIB08bNOgAeNPC!6Jf2GhZ|l2v)fH+)|^4D*OeFXdIzGBdK#o% ziH&sd_+_HX!2#Abe*4?5W zjSL!A=5A1NYST?#D(l+z%vKe;95_~R|;&OE@lZGy@`pL-q%%DYJo&gDa(?C~yt9)CW*mfZ;ZDqwTt{$wW*aAf%=qDZMwyeC zRjHnVN=>v}D9V(Y-v`X)Kjc+b=fqsR`0-qU_h}vX?MJGBv=^mi>-W$?`}UTc-m$&L zqOU8Ib}c8-PuDp!C+r+Yb4h0D7M+9n-8oc6?o+mP9>b@^u)Oq^k>W%W{0AYv} z|H)bL#!>-j-&9<=rI_$f3Hgm#Rq1_xj!m$-+WFT8Lo?Gn{~|B{-#E84^HXM4JBx&` zHWvtA1+&#NtcAkQ{$;}6U3ryW>+&Ld!@RgN^JO@fIusf4sIdGVRo`u>8soHwY^;> z=yQc-#&F8e-tP;o@-g_EVL=T8nO~FD=LObE5A^IyJz}lw^n2FC{oWN!+W>WbytzZ+ zIBM{87lgZ;`=93WZd`=IMu#RmRui=O)!HzgS^j2^hr`1CKP;wFKBanGpir`)pQhL^ zHq)@ofw3tsYuq4kDy%QBY7KcmG4M6Z-olo0+k-sDOiYFM4tTHp*;x5e^2KsZs!)Vl zl1ud7y8ACrGGNQ!2(7@>_U98$DKk$TZ?h zaBzQPFL^cs2{Y=&V#zNeA`MqB&UO+3cBzDhXkOJg;I<#=G2GcTnXYLO6Q#5TXMVPb zoFH&HMJgwS(>+p0zceNlQ0=U~hE;tOvBP}ht3$PI6V6aGWO4bw_QSKGcEyj;l7Tsq zUNPRFt%&c`XpprimUfQinlU-hEAPh$LndvE5lgpU2UHT;1~?-jpF^JcAehk^rs`T) zI|+junYuO(yD}s>ZsOz|1M6+qFHljJQgT0^Q`1_yAyMZ%v*n0}UZqGk=CH?Pd$7iE zC7b9#)6$DD0~(zWzWc_ybd>uujzYTvinD5~Au`x+01f`Sfq#{3ks+OnpBZXQ9w3+4 zBEC`W{lK&OXMd3AeuOt&{ASj2ls6f0%*^?`_5~kXt?mVQLaMGy%=&9ooH}N0)ahpi zXoI-5_d7Gk+=@@17blIiuYpmZqt&HI({{|WV=Ck$+aeXOWDml1%T}34-Ao3b$>;0i`7d(Yp4kIqek6JDP-#(y zfy_SJHOVtk2ns+Lp%NyRlQi{&CFm zh))(DT-?~UD+s0;e?ScF+G`fS&b69k6&T9i@n&GUP?F)Ez5kvt!7E$On=iv7 zz8o)=ob?(`q0=I@ZwC6^*mpyNtZ!JY19;jA&8AQ*0-t!3CXDfIjcQsbE63HC4_E~MIJW@Tj;LjBzNqF+$(`}soNug>W=hwt zWS+<*kY+)^Aoj>OqoDgrN*@tvtfauxYU`1UYXwIALsm_u1VO=H$wG#Fk8O9%tgx|o z_Uyt!ru?E-LxD!1l*4Tr_>zi^y5fvm@K}aLI#Y%YEk@E8CbUC&4Dd9+LF6D#q(2;T z9a+xN-b>7a1a0Nx!EIp!*93Zvi&1&;(aZQLhK@61z}*IyY&1=e&$%FOaX{ zb<~QUQWfxF2c9NG+0++nZO7&ve;rlk`Bo$JQC9Afy9{#9s3Euc#ZM>aDet&c#gYRa z8dV^W{!Lzf!oKCZQ|`^qe!xv4mlB_qqrI^!c4ca;NAKuC9!iTsDp3OS>7jK*r9hz2 z5ADl}jG_6>b;{){Z$9P)1rzVpe*Z~+U|i=0fb6-s9J|NnI5S5P0Q2QlkS9C}84c8h zDfqxT^=!$lH4T8VBW3p2`5^_6^>dg|hlDY0?WMK_&S4BIyF_IJmw z^f7@0{+K#VWQBJdj90r&vXqoMs?e2nfc!7=zMSP1ZrUdVp3iK)|91P@BDaHn4q#_* z*0;&+lKn}OpfAw!ORxCBrid`N>_$E`wvRsSp|NriViXM2M?KQqLJMOCdvDnq$y$Kz z)b&p&g131^E&A>2*8SFS403ikrw?$r$a9$t=uhRvzI-Gyb!pAUqZHGAI{o;qZ&&fs%46IB@fa8Y0YC5T>^Z>TT^hm}R3;zIc*IY}8oRw~(zRg|c=E*(po&igP z0_llEVCsgq6z&GYa)+k1Z4QdZ8V=Te3s8fP6<93eXm&91Cl1@V80nV8)(K1ff32MP zU(-h#$G=HPLURiO36PM~)>1$YK>;}u2ne-MqvZ&w5Dwu>r3)w`Ad&+JiU_Ev^}q&E zH!5PZoQe<#Dr;3zi;9XEM1`s=_a#Vn0(4*d2W)=-&TD4!%ro=Md_M0SD+0fTcu~Rm z$E_#ZvB5>maaqBoOLva5obN#Vl-aoSbS)A1qv2MqMYX}SRL<09h=bp%xL! zBxPu6qzFmS(SdLJC7DU>J6PKqTxm!?NS!8_50@_IHf2fH&sK!4b3)bQRz>4K9fSnO z&C{}%CiWsOlWlTu5#^M;K=VJpj8GUwkJ&ZqhgyyWRM^j8Ho2(lks#?^O!`W1oXJ7k z$={GJnsdg^{Z8IsMJzGp^#%s)2Zxl>!|}J(FZxMUxf>6!Mp~Cl5^93u2x&jAV6D)y zBSq-(ctP0jgj)fW6MvD@EiiD{3i&mNn6t#K8?_OC(S2;}7H#|JJ+X(FP1t`dBFZIo z2%-A$SFPr5POmm{i1I=x^C17aXDhEX7DfJ39D3q&4E9ws0c-1JMNZxu6ZQg)BdZ(r zEAw{_cSK5|wZ^B6fI2LssHGsKB;tAyLlfW%?fm-a&7X~($j zc1>o@^cupCp2VLm$oXQ!L6PmYSLlh@6Eqs5yGh>`{$p^{oiKlHzaZ=LBXOL=N^?Ma zC_g&}ad$Z@{Pb)zT1WBQT_Pt(Yt@-mNmS#@d+-r9O65IFgyoP$VHgc3+uf8*&qrSJ z(P-GqdVm?5H0NvH?0vX=5fH$H04pTH-i@@ihbzj78gAXMSrsq!-yPbUDB)z@mN7{3Z0thBa6%*$bV4VV^YioR|`P9s=MT82$Qg_?1Ma+De zvLU?MurYw@q(vm1LhVNXcs?R-X!K|dMH8PN%Fv3ZTJJX#3Ople2AilU)v@RKBQ=$4jDJ*Ioc zJ2b}4En%wUkx=mU$k5YB%s=Z*IG-%09)7E~r@H3Z$gd&p+lfLl6667K>3WquAUC3` zxAQ zK#c;Xk4mCvAdbcus@!?R+Mr)b_n6`er~28(b6(vK{2%<|^Sph)QicKe9Ch33`$|wY zX(uNqwb)waaL>mBMZn*#og94W=Ya2eD2+)Se?dR06=v_9){gGfXuIsct)~I?!(``^ zCowe^W*ESKKrF?yiNFS1-}Bq4Zmo7?sJCsTurRqs*DxD5uiQXE@4$)k-3+G$0oNG9 zUz$J8yi)ZWs-$KpZuiBylHd2;=+Kt+j+pFVR7JwFc|rX5N7fwnKM~peb98<&@{hL=CM@Bx=|P9R!5u5ic3!& zq;ogC$4d{)uvAX6X);etd_G)6pk5`6i#mVITsq5veu)(Hr}iTEv6~!iB&4W=yMG#5 z@Wk*cV1R_V9>fId+8L_KQMV_N;(kKL=#K zl?l+|M>^VP>rJfdaa{S;FDo7It&hW8!j>84 z{XA;%t%)Zw4szScXLR9Pf`PHI@5-;19+&^P3-m(3s8^zk+Q%qyXqdk$ENT5+2Yp3O zCPT?+pJWpVkzSK$mc=ZWN>&M}%NaBH=2vO;Mkm_)e|~iJs$(b0!Qm$Pdf6VJKG9iV zT?%%HpffX`l-FBpPS$$F2tLgsy85PmR}PT|N+$y-rnfN@KBj~)+SF635^d8|*3C6i z7H!7{p6>tc+LA{z5b>`Ai^6#^xHR*bWa#TFZTF1SMGLxkErsX$5v`oOm#h!DsAej- z@kf2k6NP_JU7d6&F3Vvt{Lqrdk)P@(+UEPhy@J(g1g{y=Yuk4AIS5#va+f@N&KX;y zoI(K$15>L7XpwY>_C`o9^Y!eBZO_lXJD)~vM%NodRuS}t4H$KLySiG(=kSYG`s9|f(zK`TfQam)DC6irYlNNTp;p#U2vx=`5Nm#6}Z%{@*<|X<3Wo+ zd9U#1q3O|+Q4a?r1*_qKf=;(ri^=Awu2Yq<(z4#_;m2$#wwMN7!2}EH1}hR}MjO9Y ziXWu-9V3tTn(@fEAV8q0;+({!5Vwd)0Rf+e=@0VD@T(WPwLpRjX0~%3(0~ham34iyDy^3A9lKeTWUlw`Y1wOD`{Ig2 zgUtak|Ej6p9+YhN`e~%J&5=#@Y{UjrOMu}*@k#(a#ItAP;7=IZZA96HRYCbF0=MCP z7u-)Z34M=GQt8(hm=tTlEimd@p~Y*%I(LlJm+Q zxXHQHg#JAYYqRu+S%2e#@^LyTZ6i{QP}>vb-kgZ@cyRvVvSoMC85MLm!5ZFa0B<#b zZMWK=_Q!8ZKyP=GV^@(oSoj+*R=2;&CDGQX0cDbhX>>!2zjK1hDFns%W3-Tac3j@x45pE+-jI-h&7I_qV4^$=c zw#_k|?b6fnP7S0rBzllo`NJ$-UV!S{=AB51#df^VTy$SP_vv4PLhz4=Y!YYM{@tXd zPJlHADj1}x(-PwK8gfvANSdoBI|hWZ1ylbVPK-h|LteY$EBiFwPjB5E znzWPV39}u|XJ{V6e>Jv3A>D=$lxMoT^ z7JWeH99|otOL^QXBm%)}AwIuPyv{`h!OQ9J9RZnK3V^rVF}AC5qST62^r%fOGlQOX+hOXxC|mD(I%;3+uQO9r<` zT#&%8dRN^m$o|Z^;37DQ@+)4xKuLR}iymnrTGDNXAZ`=mGO~=msI+gM8njd83AIY6 zfuqg&dX408->;R*b{YAsS0ZY8T%!jOJWf}4QX5`D!F*XmQHvsckq%^ed47gNnTj5L zxj-5in`335Rv62ViIO~#G?CR|td@0nh@?D?c7QoJQWTX>XSyydZ&f)s z&Vh&8~506E>$d*@oR@puW6v%^fmTG?e~PZiN6F3P>?T@Ms8FCJ z=k0eKBV5yHt;Ptdj`lizLy6^lpXcR4;N>CC_ZLP-npCl?zi?A+q`Zek?*j Y6)NHNcmK*#L*VzF?+-pz-U7*g0KyEP>;M1& diff --git a/ui/src/brand.scss b/ui/src/brand.scss deleted file mode 100644 index 71b60f991..000000000 --- a/ui/src/brand.scss +++ /dev/null @@ -1,44 +0,0 @@ -// -// Color system -// Override these colors by uncommenting them and changing the value. -// - -// $white: #FFF; -// $gray-100: #f8f9fa; -// $gray-200: #e9ecef; -// $gray-300: #dee2e6; -// $gray-400: #ced4da; -// $gray-500: #adb5bd; -// $gray-600: #868e96; -// $gray-700: #495057; -// $gray-800: #343a40; -// $gray-900: #212529; -// $black: #000; - -// $blue: #00355f; -// $light-blue: #007db1; -// $indigo: #6610f2; -// $purple: #6f42c1; -// $pink: #e83e8c; -// $red: #d3190f; -// $orange: #fd7e14; -// $yellow: #ffc107; -// $green: #498500; -// $teal: #20c997; -// $cyan: #17a2b8; - -// $dark-grey: #666666; -// $light-grey: #EEEEEE; - -/* -*** Brand definitions -*/ - -// $brand-primary: $blue; -// $brand-secondary: $gray-700; -// $brand-success: $green; -// $brand-info: $light-blue; -// $brand-warning: $yellow; -// $brand-danger: $red; -// $brand-light: $light-grey; -// $brand-dark: $dark-grey; diff --git a/ui/src/brand.ts b/ui/src/brand.ts deleted file mode 100644 index 2ceffe5af..000000000 --- a/ui/src/brand.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* -export const brand = { - logo: { - default: '', - small: '', - large: '' - }, - footer: { - links: [ - { - label: '', - url: '' - } - ], - text: '', - copyright: '' - } -}; -*/ - -export const brand = {}; diff --git a/ui/src/data/descriptors.mock.ts b/ui/src/data/descriptors.mock.ts deleted file mode 100644 index acf15fc88..000000000 --- a/ui/src/data/descriptors.mock.ts +++ /dev/null @@ -1,52 +0,0 @@ -export const MOCK_DESCRIPTORS = [ - { - entityId: 'https://carmenwiki.osu.edu/enc/shibboleth', - serviceProviderName: 'Box.net Encrypted Metadata', - serviceEnabled: true - }, - { - entityId: 'https://carmenwiki.osu.edu/shibboleth', - serviceProviderName: 'Box.net Metadata', - serviceEnabled: true - }, - { - entityId: 'http://login.campustelevideo.com', - serviceProviderName: 'Campus Televideo Login SP Metadata', - serviceEnabled: false - }, - { - entityId: 'http://login.campustelevideo.com/test', - serviceProviderName: 'Campus Televideo Login TEST SP Metadata', - serviceEnabled: true - }, - { - entityId: 'http://corp.collegenet.com/shibboleth-sp', - serviceProviderName: 'Collegenet Corp Shibboleth SP', - serviceEnabled: true - }, - { - entityId: 'http://app.cvent.com', - serviceProviderName: 'Cvent App', - serviceEnabled: true - }, - { - entityId: 'http://casper.lmu.edu/shib-prot', - serviceProviderName: 'Casper IMU Shibboleth', - serviceEnabled: true - }, - { - entityId: 'http://confluence.unicon.net/shib', - serviceProviderName: 'Unicon Confluence', - serviceEnabled: true - }, - { - entityId: 'http://jira.unicon.net/shib', - serviceProviderName: 'Unicon Jira', - serviceEnabled: true - }, - { - entityId: 'http://web.unicon.net/shib', - serviceProviderName: 'Unicon Web', - serviceEnabled: true - } -]; diff --git a/ui/src/data/entities.json b/ui/src/data/entities.json deleted file mode 100644 index ad972d8b0..000000000 --- a/ui/src/data/entities.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "entityId": "string", - "serviceProviderName": "string", - "organization": { - "name": "string", - "displayName": "string", - "url": "string" - }, - "contacts": [ - { - "name": "string", - "displayName": "string", - "url": "string" - } - ], - "mdui": { - "displayName": "string", - "informationUrl": "string", - "privacyStatementUrl": "string", - "logoUrl": "string", - "logoHeight": 100, - "logoWidth": 100, - "description": "string" - }, - "securityInfo": { - "x509CertificateAvailable": true, - "authenticationRequestsSigned": true, - "wantAssertionsSigned": true, - "x509Certificates": [ - { - "name": "string", - "type": "string", - "value": "string" - } - ] - }, - "assertionConsumerServices": [ - { - "binding": "string", - "locationUrl": "string", - "makeDefault": true - } - ], - "serviceProviderSsoDescriptor": { - "protocolSupportEnum": "string", - "nameIdFormats": [ - "string" - ] - }, - - "logoutEndpoints": [ - { - "url": "string", - "bindingType": "string" - } - ], - - "serviceEnabled": true, - - "createdDate": "string (date)", - "modifiedDate": "string (date)", - - "relyingPartyOverrides": { - "signAssertion": true, - "dontSignResponse": true, - "turnOffEncryption": true, - "useSha": true, - "ignoreAuthenticationMethod": true, - "omitNotBefore": true, - "responderId": "string", - "nameIdFormats": [ - "string" - ], - "authenticationMethods": [ - "string" - ] - }, - - "attributeRelease": { - "eduPersonPrincipalName": true, - "uid": true, - "mail": true, - "surname": true, - "givenName": true, - "displayName": true, - "eduPersonAffiliation": true, - "eduPersonScopedAffiliation": true, - "eduPersonPrimaryAffiliation": true, - "eduPersonEntitlement": true, - "eduPersonAssurance": true, - "eduPersonUniqueId": true, - "employeeNumber": true - } -} \ No newline at end of file diff --git a/ui/src/data/ids.mock.ts b/ui/src/data/ids.mock.ts deleted file mode 100644 index 08b2ed4ab..000000000 --- a/ui/src/data/ids.mock.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const IDS = [ - 'https://account.example.com/sso', - 'https://www.example.com/', - 'https://www.example.com/somewhere', - 'https://www.example.org/shib/login', - 'https://sso.example.net/baz', - 'https://www.example.com/foo-bar', - 'https://www.example.com/sp/login', - 'https://example.com/activity', - 'https://www.example.com/', - 'https://example.com/sso', - 'https://www.example.com/sso', - 'https://example.com/', - 'https://bee.example.com/bone', - 'https://example.com/random', - 'https://www.example.com/', - 'https://sso.example.net/foo/bar' -]; diff --git a/ui/src/environments/environment.prod.ts b/ui/src/environments/environment.prod.ts deleted file mode 100644 index 3612073bc..000000000 --- a/ui/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/ui/src/environments/environment.ts b/ui/src/environments/environment.ts deleted file mode 100644 index b7f639aec..000000000 --- a/ui/src/environments/environment.ts +++ /dev/null @@ -1,8 +0,0 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. - -export const environment = { - production: false -}; diff --git a/ui/src/error.html b/ui/src/error.html deleted file mode 100644 index 5535dc452..000000000 --- a/ui/src/error.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Shibboleth Metadata Management - - - - - - - -

-
-
-
-
- -
-
User request received
-

Your request has been received and is being reviewed. You will be notified with access status.

-
-
-
-
-
- - diff --git a/ui/src/favicon.ico b/ui/src/favicon.ico deleted file mode 100644 index 9c1f419d34d95f27e59ef194fe596f8a32934999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmbW1T}V_x6vs#1-OR#5$O<1cBI%_UBasrLdI-VlNs}mgu&78YvJ@#O?b8yAbOp7x zZ?sQWvr@OUR!GZK%(6()Qrc)qNJ~xHU4PBa?!|?A>Rjf`oO9-X?m7QEbAL{^OCq%dqVzC_3B|TohoP?0Euo>Q=Y^m^*$;nCFa(Lw1w-La&m5~ zkf$DBIppTOK(9Apd)D$-4lUh*t9J?5Wx>|i$k_OZ+V}J4IA8h)5_C zT}8}wD;tj8X4u|MYDp!An8TDCi%BmjN58+6g-eYR@1VHYtnf~!%lCGeR86=@*?XBK zYjat&@hM_;H^HH4%-oz$VBs*q%Nr4)y_B13|H3<6-tV#_GZzti3H=ra(>KAim4gIi zbznFSA!|knimaonvsK|W-aR~f#Qv#|&~0Ui!*%E~TQO{RV@S4R*fK=$RuIu|NY65= zz5d6*tj`|l@;R*tj#y<}e6YQ(FMT%pTxUSdCD`;eX%01GI7nqfN1(9)wqN@7}qSfp% zv^FuUc7d&J$N5~o$?IctgoY? zrJ2gwhg3XzLdN+roD;tk=Ev}NY&M%(PqC-Wf2!ZIpRb<>Rm>?l)9#7?X6--lzw;j? CAw)L- diff --git a/ui/src/index.html b/ui/src/index.html deleted file mode 100644 index 705257e2b..000000000 --- a/ui/src/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Shibboleth IDP UI - - - - - - - - - - diff --git a/ui/src/main.ts b/ui/src/main.ts deleted file mode 100644 index 401abe512..000000000 --- a/ui/src/main.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts deleted file mode 100644 index dd276b59c..000000000 --- a/ui/src/polyfills.ts +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************************************** - * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates. - */ -import '@angular/localize/init'; -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** -* BROWSER POLYFILLS -*/ - - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; -import 'core-js/es7/array'; -import 'core-js/es7/object'; - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; diff --git a/ui/src/static.scss b/ui/src/static.scss deleted file mode 100644 index 67ebeacae..000000000 --- a/ui/src/static.scss +++ /dev/null @@ -1,28 +0,0 @@ -@import '../node_modules/bootstrap/scss/bootstrap'; - -@import './theme/palette'; - -$font-size-xs: .75rem !default; -$fa-font-path: "."; - -@import '../node_modules/font-awesome/scss/font-awesome'; - -body { - background-color: map-get($theme-colors, light); - padding-top: 56px; -} - -.section { - .section-body { - background: $white; - } -} - -nav.fixed-top { - border-bottom: 3px solid map-get($theme-colors, primary); -} - -.card { - margin: 100px; - max-width: 500px; -} diff --git a/ui/src/styles.scss b/ui/src/styles.scss deleted file mode 100644 index 30946aaf4..000000000 --- a/ui/src/styles.scss +++ /dev/null @@ -1,58 +0,0 @@ -@import './theme/bootstrap'; -@import './theme/breadcrumb'; -@import './theme/buttons'; -@import './theme/forms'; -@import './theme/modal'; -@import './theme/tags'; -@import './theme/alert'; -@import './theme/typography'; -@import './theme/list'; -@import './theme/utility'; - -body { - background-color: theme-color("light"); - padding-top: 56px; -} - -app-root { - min-height: calc(100vh - 56px); -} - -.pad-content { - height: 100%; -} - -.section { - .section-body { - background: $white; - } -} - -nav.fixed-top { - border-bottom: 3px solid map-get($theme-colors, primary); -} - -footer { - background-color: $white; - padding: 0 20px; - font-size: $font-size-xs; - border-top: 3px solid map-get($theme-colors, primary); - - .copyright { - padding-top: 10px; - - a { - color: map-get($theme-colors, primary); - text-decoration: underline; - } - } - - img { - max-height: 88px; - } -} - -label { - display: flex; - justify-content: space-between; -} diff --git a/ui/src/test.ts b/ui/src/test.ts deleted file mode 100644 index d762d1284..000000000 --- a/ui/src/test.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/long-stack-trace-zone'; -import 'zone.js/dist/proxy.js'; -import 'zone.js/dist/sync-test'; -import 'zone.js/dist/jasmine-patch'; -import 'zone.js/dist/async-test'; -import 'zone.js/dist/fake-async-test'; -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -import 'rxjs'; - -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. -declare const __karma__: any; -declare const require: any; - -// Prevent Karma from running prematurely. -__karma__.loaded = function () { }; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() -); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); -// Finally, start Karma to run the tests. -__karma__.start(); diff --git a/ui/src/testing/activated-route.stub.ts b/ui/src/testing/activated-route.stub.ts deleted file mode 100644 index 4f7a58f5b..000000000 --- a/ui/src/testing/activated-route.stub.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* istanbul ignore */ - -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { convertToParamMap, ParamMap } from '@angular/router'; -import { Observable, of } from 'rxjs'; - -@Injectable() -export class ActivatedRouteStub { - - // ActivatedRoute.paramMap is Observable - private subject = new BehaviorSubject(convertToParamMap(this.testParamMap)); - paramMap = this.subject.asObservable(); - - // Test parameters - private _testParamMap: ParamMap; - private _params: any; - - private _firstChild: ActivatedRouteStub; - - private _data: Observable; - - get testParamMap() { return this._testParamMap; } - set testParamMap(params: {}) { - this._testParamMap = convertToParamMap(params); - this._params = params; - this.subject.next(this._testParamMap); - } - - // ActivatedRoute.snapshot.paramMap - get snapshot() { - return { - params: this._params, - paramMap: this.testParamMap, - }; - } - - get params() { - return this.paramMap; - } - - get queryParams() { - return this.paramMap; - } - - get firstChild(): ActivatedRouteStub { - return this._firstChild; - } - - set firstChild(stub: ActivatedRouteStub) { - this._firstChild = stub; - } - - get data(): Observable { - return this._data; - } - - set data(d: Observable) { - this._data = d; - } -} diff --git a/ui/src/testing/attributes.stub.ts b/ui/src/testing/attributes.stub.ts deleted file mode 100644 index d2d6f9575..000000000 --- a/ui/src/testing/attributes.stub.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { Injectable } from '@angular/core'; -import { ReleaseAttribute } from '../app/metadata/domain/model/properties/release-attribute'; - -@Injectable() -export class MockAttributeService { - - readonly path = '/customAttributes'; - readonly base = 'api'; - - constructor() { } - - query(path: string = this.path): Observable { - return of([]); - } -} diff --git a/ui/src/testing/descriptor.service.stub.ts b/ui/src/testing/descriptor.service.stub.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/src/testing/effect.util.ts b/ui/src/testing/effect.util.ts deleted file mode 100644 index ffe98f4a7..000000000 --- a/ui/src/testing/effect.util.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Actions } from '@ngrx/effects'; -import { empty, Observable } from 'rxjs'; - -export class TestActions extends Actions { - constructor() { - super(empty()); - } - - set stream(source: Observable) { - this.source = source; - } -} - -export function getActions() { - return new TestActions(); -} diff --git a/ui/src/testing/file.service.stub.ts b/ui/src/testing/file.service.stub.ts deleted file mode 100644 index 4263836e5..000000000 --- a/ui/src/testing/file.service.stub.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Subject } from 'rxjs'; -import { Observable } from 'rxjs'; - -export class FileServiceStub { - readAsText(): Observable { - let subj = new Subject(); - subj.next('foo'); - subj.complete(); - return subj.asObservable(); - } -} diff --git a/ui/src/testing/filter-list.stub.ts b/ui/src/testing/filter-list.stub.ts deleted file mode 100644 index 37944825b..000000000 --- a/ui/src/testing/filter-list.stub.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { MetadataFilter } from '../app/metadata/domain/model'; -import { NAV_FORMATS } from '../app/metadata/domain/component/editor-nav.component'; - -/* tslint:disable */ -@Component({ - selector: 'filter-list', - template: `
` -}) -export class FilterListComponentStub { - @Input() filters: MetadataFilter[]; - @Input() disabled: boolean; - - @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); - @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); - @Output() onRemove: EventEmitter = new EventEmitter(); - @Output() onToggleEnabled: EventEmitter = new EventEmitter(); - - formats = NAV_FORMATS; -} - -/* tslint:disable */ -@Component({ - selector: 'filter-configuration-list', - template: `
` -}) -export class FilterConfigurationListComponentStub extends FilterListComponentStub {} diff --git a/ui/src/testing/form-schema.stub.ts b/ui/src/testing/form-schema.stub.ts deleted file mode 100644 index 01654b15a..000000000 --- a/ui/src/testing/form-schema.stub.ts +++ /dev/null @@ -1,129 +0,0 @@ -export const SCHEMA = { - 'title': 'MetadataResolver', - 'type': 'object', - 'widget': { - 'id': 'fieldset' - }, - 'properties': { - 'name': { - 'title': 'Metadata Provider Name (Dashboard Display Only)', - 'description': 'Metadata Provider Name (Dashboard Display Only)', - 'type': 'string', - 'widget': { - 'id': 'string', - 'help': 'Must be unique.' - } - }, - '@type': { - 'title': 'Metadata Provider Type', - 'description': 'Metadata Provider Type', - 'ui:placeholder': 'Select a metadata provider type', - 'type': 'string', - 'widget': { - 'id': 'select' - }, - 'oneOf': [ - { - 'enum': [ - 'FileBackedHttpMetadataResolver' - ], - 'description': 'FileBackedHttpMetadataProvider' - } - ] - }, - 'list': { - 'title': 'label.retained-roles', - 'description': 'tooltip.retained-roles', - 'type': 'array', - 'items': { - 'widget': { - 'id': 'select' - }, - 'type': 'string', - 'oneOf': [ - { - 'enum': [ - 'SPSSODescriptor' - ], - 'description': 'value.spdescriptor' - }, - { - 'enum': [ - 'AttributeAuthorityDescriptor' - ], - 'description': 'value.attr-auth-descriptor' - } - ] - } - }, - 'formatFilterTarget': { - 'title': 'label.search-criteria', - 'description': 'tooltip.search-criteria', - 'type': 'object', - 'widget': { - 'id': 'filter-target', - 'target': 'formatFilterTargetType' - }, - 'properties': { - 'formatFilterTargetType': { - 'title': '', - 'type': 'string', - 'default': 'ENTITY', - 'oneOf': [ - { - 'enum': [ - 'ENTITY' - ], - 'description': 'value.entity-id' - }, - { - 'enum': [ - 'REGEX' - ], - 'description': 'value.regex' - }, - { - 'enum': [ - 'CONDITION_SCRIPT' - ], - 'description': 'value.script' - } - ] - }, - 'value': { - 'type': 'array', - 'minItems': 1, - 'uniqueItems': true, - 'items': { - 'type': 'string' - } - } - }, - 'required': [ - 'value', - 'nameIdFormatFilterTargetType' - ] - } - }, - 'required': [ - 'name', - '@type' - ], - 'fieldsets': [ - { - 'type': 'section', - 'fields': [ - 'name', - '@type' - ] - } - ], - 'definitions': { - 'description': { - 'title': 'Description', - 'description': 'A description of the object', - 'type': 'string', - 'widget': 'string' - } - } -}; diff --git a/ui/src/testing/i18n.stub.ts b/ui/src/testing/i18n.stub.ts deleted file mode 100644 index 4f0f012b3..000000000 --- a/ui/src/testing/i18n.stub.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* istanbul ignore */ - -import { PipeTransform, Pipe, NgModule, Directive, Component, Input } from '@angular/core'; - -import { Injectable } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { CommonModule } from '@angular/common'; - -/*tslint:disable:component-selector */ - -@Pipe({ - name: 'translate' -}) -export class MockTranslatePipe implements PipeTransform { - - constructor() {} - - transform(value: string, interpolated: { [prop: string]: string } = {}): any { - return value; - } -} - -@Directive({ - selector: '[translate]' -}) -export class MockTranslateDirective { - @Input() translate: any | null; - @Input() translateParams: any | null; -} - -@Component({ - selector: 'i18n-text', - template: '' -}) -export class MockI18nTextComponent { - @Input() key: any | null; -} - -@Component({ - selector: 'translate-i18n', - template: '' -}) -export class MockTranslateComponent { - @Input() key: any | null; - @Input() params: any | null; -} - -@Injectable() -export class MockI18nService { - - readonly path = '/messages'; - readonly base = 'api'; - - constructor() { } - - get(locale: string): Observable { - return of({}); - } - - getCurrentLanguage(): string { - return 'en'; - } - - getCurrentCountry(): string { - return 'US'; - } - - getCurrentLocale(): string { - return 'en-US'; - } - - translate (value: string, interpolated: any, messages): string { - return messages.hasOwnProperty(value) ? messages[value] : ''; - } - - interpolate(value: string, interpolated: { [prop: string]: string } = {}): string { - return value; - } -} - - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockTranslatePipe, - MockTranslateDirective, - MockTranslateComponent, - MockI18nTextComponent - ], - exports: [ - MockTranslateComponent, - MockTranslateDirective, - MockI18nTextComponent, - MockTranslatePipe - ], - providers: [ - MockI18nService - ] -}) -export class MockI18nModule {} diff --git a/ui/src/testing/list-values.stub.ts b/ui/src/testing/list-values.stub.ts deleted file mode 100644 index 3e9ecf152..000000000 --- a/ui/src/testing/list-values.stub.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Observable, of } from 'rxjs'; -import { Injectable } from '@angular/core'; -import { ReleaseAttribute } from '../app/metadata/domain/model/properties/release-attribute'; -import { debounceTime, distinctUntilChanged, combineLatest } from 'rxjs/operators'; - -@Injectable() -export class MockListValueService { - - constructor() { } - - readonly nameIdFormats: Observable = of([ - 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', - 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', - 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' - ]); - - readonly authenticationMethods: Observable = of([ - 'https://refeds.org/profile/mfa', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken', - 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' - ]); - - get attributesToRelease(): Observable { - return of([]); - } - - searchStringList = (list: Observable): Function => - (text$: Observable) => - text$.pipe( - debounceTime(100), - distinctUntilChanged(), - combineLatest( - list, - (term, formats) => formats.filter( - v => v.toLowerCase().match(term.toLowerCase()) - ) - .slice(0, 4)) - ) - - get searchFormats(): Function { - return this.searchStringList(this.nameIdFormats); - } - get searchAuthenticationMethods(): Function { - return this.searchStringList(this.authenticationMethods); - } -} diff --git a/ui/src/testing/metadata-configuration.stub.ts b/ui/src/testing/metadata-configuration.stub.ts deleted file mode 100644 index c29e29d1b..000000000 --- a/ui/src/testing/metadata-configuration.stub.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { MetadataConfiguration } from '../app/metadata/configuration/model/metadata-configuration'; -import { MetadataVersion } from '../app/metadata/configuration/model/version'; - -/* tslint:disable */ -@Component({ - selector: 'metadata-configuration', - template: `` -}) -export class MetadataConfigurationComponentStub { - @Input() configuration: MetadataConfiguration; -} - -@Component({ - selector: 'metadata-header', - template: `` -}) -export class MetadataHeaderComponentStub { - @Input() isEnabled: boolean; - @Input() version: MetadataVersion; - @Input() versionNumber: number; - @Input() isCurrent: boolean; -} diff --git a/ui/src/testing/mock-module.stub.ts b/ui/src/testing/mock-module.stub.ts deleted file mode 100644 index d311e90b6..000000000 --- a/ui/src/testing/mock-module.stub.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; -import { MockResolversListComponent } from './resolvers-list.component.stub'; - -export const DECLARATIONS = [ - MockResolversListComponent -]; - -@NgModule({ - declarations: DECLARATIONS, - entryComponents: DECLARATIONS, - imports: [], - exports: DECLARATIONS, - providers: [] -}) -export class MockModule {} diff --git a/ui/src/testing/mockMetadataWizard.ts b/ui/src/testing/mockMetadataWizard.ts deleted file mode 100644 index 95844f8a0..000000000 --- a/ui/src/testing/mockMetadataWizard.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Wizard } from '../app/wizard/model/wizard'; - -export interface MockMetadata { - name: string; - serviceEnabled: boolean; - foo: { - bar: string; - baz: string; - }; -} - -export const MockMetadataWizard: Wizard = { - label: 'Metadata Source', - type: '@MetadataProvider', - validatorParams: [], - bindings: {}, - parser(changes: Partial, schema?: any): any { - return changes; - }, - formatter(changes: Partial, schema?: any): any { - return changes; - }, - getValidators(): { [key: string]: any } { - return {}; - }, - schema: 'api/ui/MetadataSources', - steps: [ - { - index: 1, - id: 'common', - label: 'label.sp-org-info', - fields: [ - 'name', - 'serviceEnabled' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'serviceProviderName', - 'entityId', - 'serviceEnabled', - 'organization' - ] - }, - { - type: 'group', - fields: [ - 'contacts' - ] - } - ] - }, - { - index: 2, - id: 'next', - label: 'something', - fields: [ - 'foo', - 'list' - ], - fieldsets: [ - { - type: 'group', - fields: [ - 'foo' - ] - }, - { - type: 'group', - fields: [ - 'list' - ] - } - ] - } - ] -}; diff --git a/ui/src/testing/modal.stub.ts b/ui/src/testing/modal.stub.ts deleted file mode 100644 index 91926192b..000000000 --- a/ui/src/testing/modal.stub.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; - -@Injectable() -export class NgbModalStub { - open(content: any, options: NgbModalOptions): {result: Promise, componentInstance: any} { - return { - componentInstance: {}, - result: Promise.resolve(true) - }; - } -} - -@Injectable() -export class NgbActiveModalStub { - close = (result: any): void => {}; - dismiss = (reason: any): void => {}; -} diff --git a/ui/src/testing/navigation-service.stub.ts b/ui/src/testing/navigation-service.stub.ts deleted file mode 100644 index a0e745068..000000000 --- a/ui/src/testing/navigation-service.stub.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { of } from 'rxjs'; -import { NavigationService } from '../app/core/service/navigation.service'; - -export const definition: unknown = { - emitter: of([]), - actionList: [], - addAction: jasmine.createSpy('navService') -}; - -export const NavigationServiceStub = definition as NavigationService; diff --git a/ui/src/testing/page-title-component.stub.ts b/ui/src/testing/page-title-component.stub.ts deleted file mode 100644 index d3a1a748a..000000000 --- a/ui/src/testing/page-title-component.stub.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'page-title', - template: '', - styleUrls: [] -}) -export class MockPageTitleComponent {} diff --git a/ui/src/testing/property-component.stub.ts b/ui/src/testing/property-component.stub.ts deleted file mode 100644 index c09b7c579..000000000 --- a/ui/src/testing/property-component.stub.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../app/metadata/domain/model/property'; -import { Observable, of } from 'rxjs'; - -@Component({ - selector: 'configuration-property', - template: `` -}) -export class ConfigurationPropertyComponentStub { - - @Input() property: Property; - @Input() columns = 1; - - constructor() { } - - getKeys(schema): string[] { - return Object.keys(schema.properties); - } - - getItemType(property: Property): string { - return 'default'; - } - - get width(): string { - return `100%`; - } -} - -@Component({ - selector: 'array-property', - template: '' -}) -export class ArrayPropertyComponentStub extends ConfigurationPropertyComponentStub { - - @Output() preview: EventEmitter = new EventEmitter(); - - range = []; - - constructor() { - super(); - } - - isUrl(str: string): boolean { - return true; - } - - get attributeList$(): Observable<{ key: string, label: string }[]> { - return of([]); - } -} - -@Component({ - selector: 'primitive-property', - template: '', - styleUrls: [] -}) -export class PrimitivePropertyComponentStub extends ConfigurationPropertyComponentStub {} diff --git a/ui/src/testing/provider.stub.ts b/ui/src/testing/provider.stub.ts deleted file mode 100644 index 59fa89ea6..000000000 --- a/ui/src/testing/provider.stub.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - MetadataProvider, - Contact, - SsoService, - Certificate, - SecurityInfo, - LogoutEndpoint -} from '../app/metadata/domain/model'; - -const d: unknown = { - serviceProviderName: 'bar' -}; - -export const draft = d as MetadataProvider; - -export const provider = { - ...draft, - id: '1' -} as MetadataProvider; - -export const contact = { - type: 'support', - name: 'hithere yo', - emailAddress: 'somewhere@something.com' -} as Contact; - -export const endpoint = { - binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - locationUrl: 'http://unicon.net/location', - makeDefault: false -} as SsoService; - -export const certificate = { - name: 'foo', - type: 'signing', - value: 'xyz' -} as Certificate; - -export const secInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: true, - wantAssertionsSigned: true, - x509Certificates: [] -} as SecurityInfo; - -export const logoutEndpoint = { - url: 'foo', - bindingType: 'bar' -} as LogoutEndpoint; diff --git a/ui/src/testing/resolver.stub.ts b/ui/src/testing/resolver.stub.ts deleted file mode 100644 index 7520e2606..000000000 --- a/ui/src/testing/resolver.stub.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - MetadataProvider, - Contact, - SsoService, - Certificate, - SecurityInfo, - LogoutEndpoint, - MetadataResolver -} from '../app/metadata/domain/model'; - -export const draft = { - entityId: 'foo', - serviceProviderName: 'bar' -} as MetadataResolver; - -export const resolver = { - ...draft, - id: '1' -} as MetadataResolver; - -export const contact = { - type: 'support', - name: 'hithere yo', - emailAddress: 'somewhere@something.com' -} as Contact; - -export const endpoint = { - binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - locationUrl: 'http://unicon.net/location', - makeDefault: false -} as SsoService; - -export const certificate = { - name: 'foo', - type: 'signing', - value: 'xyz' -} as Certificate; - -export const secInfo = { - x509CertificateAvailable: false, - authenticationRequestsSigned: true, - wantAssertionsSigned: true, - x509Certificates: [] -} as SecurityInfo; - -export const logoutEndpoint = { - url: 'foo', - bindingType: 'bar' -} as LogoutEndpoint; diff --git a/ui/src/testing/resolvers-list.component.stub.ts b/ui/src/testing/resolvers-list.component.stub.ts deleted file mode 100644 index 9912b0c2b..000000000 --- a/ui/src/testing/resolvers-list.component.stub.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core'; - -import { MetadataEntity } from '../app/metadata/domain/model'; - -@Component({ - selector: 'resolvers-list', - changeDetection: ChangeDetectionStrategy.OnPush, - template: `
`, - styleUrls: [] -}) -export class MockResolversListComponent { - @Input() entities: MetadataEntity[]; - - @Output() scroll: EventEmitter = new EventEmitter(); - @Output() delete: EventEmitter = new EventEmitter(); - - @Output() toggleEnabled: EventEmitter = new EventEmitter(); -} diff --git a/ui/src/testing/router.stub.ts b/ui/src/testing/router.stub.ts deleted file mode 100644 index 74fcdf718..000000000 --- a/ui/src/testing/router.stub.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, Directive, Input, Injectable } from '@angular/core'; -import { NavigationExtras } from '@angular/router'; - -/*tslint:disable*/ -@Directive({ - selector: '[routerLink]', - host: { - '(click)': 'onClick()' - } -}) -export class RouterLinkStubDirective { - @Input('routerLink') linkParams: any; - navigatedTo: any = null; - onClick() { - this.navigatedTo = this.linkParams; - } -} -@Component({ - selector: 'router-outlet', - template: '' -}) -export class RouterOutletStubComponent {} - -@Injectable() -export class RouterStub { - navigate(commands: any[], extras?: NavigationExtras) { } -} diff --git a/ui/src/testing/sample-fbhttp-provider.json b/ui/src/testing/sample-fbhttp-provider.json deleted file mode 100644 index c5d344120..000000000 --- a/ui/src/testing/sample-fbhttp-provider.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "createdDate": "2019-09-12T10:40:41.941", - "modifiedDate": "2019-09-12T10:41:31.787", - "createdBy": "root", - "modifiedBy": "root", - "current": true, - "name": "Update Provider Name", - "resourceId": "e34f39a7-9934-43bf-80c1-3a4e76e6dee8", - "xmlId": "updateid", - "enabled": true, - "requireValidMetadata": true, - "failFastInitialization": true, - "useDefaultPredicateRegistry": true, - "satisfyAnyPredicates": false, - "doInitialization": true, - "metadataFilters": [ - { - "createdDate": "2019-09-12T10:40:41.945", - "modifiedDate": "2019-09-12T10:40:41.945", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "315bca8c-cc61-4425-af1a-72e0b913102f", - "filterEnabled": false, - "requireSignedRoot": false, - "audId": 10, - "@type": "SignatureValidation", - "version": -230919157 - }, - { - "createdDate": "2019-09-12T10:40:41.946", - "modifiedDate": "2019-09-12T10:40:41.946", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "0d46d4a9-b65e-440e-99c4-07203fe50921", - "filterEnabled": false, - "removeRolelessEntityDescriptors": true, - "removeEmptyEntitiesDescriptors": true, - "retainedRoles": [], - "audId": 11, - "@type": "EntityRoleWhiteList", - "version": 198629661 - }, - { - "createdDate": "2019-09-12T10:42:38.904", - "modifiedDate": "2019-09-12T10:42:38.904", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "860bf7f3-3b3c-4dc7-b19b-111c9043d446", - "filterEnabled": false, - "requireSignedRoot": false, - "audId": 15, - "@type": "SignatureValidation", - "version": -747367480 - }, - { - "createdDate": "2019-09-12T10:42:38.905", - "modifiedDate": "2019-09-12T10:42:38.905", - "createdBy": "root", - "modifiedBy": "root", - "current": false, - "resourceId": "7f24ff1d-cb52-422f-8594-682dec40b3b7", - "filterEnabled": false, - "removeRolelessEntityDescriptors": true, - "removeEmptyEntitiesDescriptors": true, - "retainedRoles": [ - "md:SPSSODescriptor" - ], - "audId": 16, - "@type": "EntityRoleWhiteList", - "version": -280104078 - } - ], - "metadataURL": "https://idp.unicon.net/idp/shibboleth", - "backingFile": "test", - "initializeFromBackupFile": false, - "backupFileInitNextRefreshDelay": "PT1H", - "reloadableMetadataResolverAttributes": { - "minRefreshDelay": "PT30S", - "maxRefreshDelay": "PT10M", - "refreshDelayFactor": 0.5 - }, - "httpMetadataResolverAttributes": { - "connectionRequestTimeout": "PT10M", - "connectionTimeout": "PT30M", - "socketTimeout": "PT12H", - "disregardTLSCertificate": false - }, - "audId": 9, - "@type": "FileBackedHttpMetadataResolver", - "version": -1622542052 -} \ No newline at end of file diff --git a/ui/src/testing/shared.stub.ts b/ui/src/testing/shared.stub.ts deleted file mode 100644 index 64d2ebd65..000000000 --- a/ui/src/testing/shared.stub.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, Input, NgModule, Output, EventEmitter, forwardRef } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; - -@Component({ - selector: 'info-icon', - template: '{{ description }}' -}) -export class MockIconComponent { - @Input() description: string; -} - -@Component({ - selector: 'auto-complete', - template: '
', - styleUrls: [], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MockAutoCompleteComponent), - multi: true - } - ] -}) -export class MockAutoCompleteComponent implements ControlValueAccessor { - @Input() defaultValue = ''; - @Input() matches: string[] = []; - @Input() id: string; - @Input() fieldId: string; - @Input() autoSelect = false; - @Input() noneFoundText = 'No Options Found'; - @Input() limit = 0; - @Input() processing = false; - @Input() dropdown = false; - @Input() placeholder = ''; - - @Output() more: EventEmitter = new EventEmitter(); - @Output() onChange: EventEmitter = new EventEmitter(); - - propagateChange = (_: any | null) => { }; - propagateTouched = (_: any | null) => { }; - - constructor() { } - - writeValue(value: any): void {} - - registerOnChange(fn: any): void {} - - registerOnTouched(fn: any): void {} - - setDisabledState(isDisabled: boolean = false): void {} -} - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockIconComponent, - MockAutoCompleteComponent - ], - exports: [ - MockIconComponent, - MockAutoCompleteComponent - ], - providers: [] -}) -export class MockSharedModule {} diff --git a/ui/src/testing/utility.ts b/ui/src/testing/utility.ts deleted file mode 100644 index 4ac00e572..000000000 --- a/ui/src/testing/utility.ts +++ /dev/null @@ -1,15 +0,0 @@ -export function dispatchKeyboardEvent(elm: HTMLElement, eventName: string, keyName: string) { - let event; - try { - // PhantomJS - event = document.createEvent('KeyboardEvent'); - event.initEvent(eventName, true, false); - event.key = keyName; - } catch (e) { - // Chrome - event = new KeyboardEvent(eventName, { 'key': keyName }); - } - elm.dispatchEvent(event); -} - -export default dispatchKeyboardEvent; diff --git a/ui/src/testing/wizard.stub.ts b/ui/src/testing/wizard.stub.ts deleted file mode 100644 index f8c5637c9..000000000 --- a/ui/src/testing/wizard.stub.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Output, Input, NgModule } from '@angular/core'; -import { EventEmitter } from '@angular/core'; -import { Wizard } from '../app/wizard/model'; -import { MetadataProvider, MetadataResolver } from '../app/metadata/domain/model'; - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard', - template: '' -}) -export class MockWizardComponent { - @Output() onNext = new EventEmitter(); - @Output() onPrevious = new EventEmitter(); - @Output() onLast = new EventEmitter(); - @Output() onSave = new EventEmitter(); -} - -/*tslint:disable:component-selector */ -@Component({ - selector: 'wizard-summary', - template: '' -}) -export class MockWizardSummaryComponent { - @Input() summary: { definition: Wizard, schema: { [id: string]: any }, model: any }; - @Output() onPageSelect: EventEmitter = new EventEmitter(); -} - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - MockWizardComponent, - MockWizardSummaryComponent - ], - exports: [ - MockWizardComponent, - MockWizardSummaryComponent - ], - providers: [] -}) -export class MockWizardModule { } diff --git a/ui/src/theme/_mixins.scss b/ui/src/theme/_mixins.scss deleted file mode 100644 index f2e3f112b..000000000 --- a/ui/src/theme/_mixins.scss +++ /dev/null @@ -1,17 +0,0 @@ -@mixin component-validation-state($state, $color) { - &.is-#{$state} { - input { - border-color: $color; - - &:focus { - border-color: $color; - box-shadow: 0 0 0 $input-focus-width rgba($color, .25); - } - - ~ .#{$state}-feedback, - ~ .#{$state}-tooltip { - display: block; - } - } - } -} \ No newline at end of file diff --git a/ui/src/theme/_palette.scss b/ui/src/theme/_palette.scss deleted file mode 100644 index 0b91b3fee..000000000 --- a/ui/src/theme/_palette.scss +++ /dev/null @@ -1,84 +0,0 @@ -// -// Color system -// - -$white: #fff; -$gray-100: #f8f9fa; -$gray-200: #e9ecef; -$gray-300: #dee2e6; -$gray-400: #ced4da; -$gray-500: #adb5bd; -$gray-600: #868e96; -$gray-700: #495057; -$gray-800: #343a40; -$gray-900: #212529; -$black: #000; - -$blue: #00355f; -$light-blue: #007db1; -$indigo: #6610f2; -$purple: #6f42c1; -$pink: #e83e8c; -$red: #d3190f; -$orange: #fd7e14; -$yellow: #ffc107; -$green: #498500; -$teal: #20c997; -$cyan: #17a2b8; - -$dark-grey: #666666; -$light-grey: #EEEEEE; - - -$brand-primary: $blue; -$brand-secondary: $gray-700; -$brand-success: $green; -$brand-info: $light-blue; -$brand-warning: $yellow; -$brand-danger: $red; -$brand-light: $light-grey; -$brand-dark: $dark-grey; - -@import "../brand"; - -$grays: ( - 100: $gray-100, - 200: $gray-200, - 300: $gray-300, - 400: $gray-400, - 500: $gray-500, - 600: $gray-600, - 700: $gray-700, - 800: $gray-800, - 900: $gray-900 -); - -$colors: ( - 'blue': $blue, - 'indigo': $indigo, - 'purple': $purple, - 'pink': $pink, - 'red': $red, - 'orange': $orange, - 'yellow': $yellow, - 'green': $green, - 'teal': $teal, - 'cyan': $cyan, - 'white': $white, - 'gray': $gray-600, - 'gray-dark': $gray-800 -); - -$theme-colors: ( - primary: $brand-primary, - secondary: $brand-secondary, - success: $brand-success, - info: $brand-info, - warning: $brand-warning, - danger: $brand-danger, - light: $brand-light, - dark: $brand-dark -); - -// Set a specific jump point for requesting color jumps -$theme-color-interval: 8%; diff --git a/ui/src/theme/_variables.scss b/ui/src/theme/_variables.scss deleted file mode 100644 index 8df205529..000000000 --- a/ui/src/theme/_variables.scss +++ /dev/null @@ -1,2 +0,0 @@ -$font-size-xs: .75rem !default; -$fa-font-path: "~font-awesome/fonts"; \ No newline at end of file diff --git a/ui/src/theme/alert.scss b/ui/src/theme/alert.scss deleted file mode 100644 index f4dccb3a6..000000000 --- a/ui/src/theme/alert.scss +++ /dev/null @@ -1,5 +0,0 @@ -.alert.alert-compact { - display: inline-block; - padding: 0.375rem 0.75rem; - margin-bottom: 0px; -} \ No newline at end of file diff --git a/ui/src/theme/bootstrap.scss b/ui/src/theme/bootstrap.scss deleted file mode 100644 index 7683e1dad..000000000 --- a/ui/src/theme/bootstrap.scss +++ /dev/null @@ -1,43 +0,0 @@ -@import "~bootstrap/scss/functions"; -@import "./palette"; -@import "./variables"; -@import "~bootstrap/scss/functions"; -@import "~bootstrap/scss/variables"; -@import "~bootstrap/scss/mixins"; - -@import "~bootstrap/scss/root"; -@import "~bootstrap/scss/reboot"; - -@import "~bootstrap/scss/type"; -@import "~bootstrap/scss/images"; -@import "~bootstrap/scss/code"; -@import "~bootstrap/scss/grid"; -@import "~bootstrap/scss/tables"; -@import "~bootstrap/scss/forms"; -@import "~bootstrap/scss/buttons"; -@import "~bootstrap/scss/transitions"; -@import "~bootstrap/scss/dropdown"; -// @import "~bootstrap/scss/button-group"; -@import "~bootstrap/scss/input-group"; -@import "~bootstrap/scss/custom-forms"; -@import "~bootstrap/scss/nav"; -@import "~bootstrap/scss/navbar"; -@import "~bootstrap/scss/card"; -@import "~bootstrap/scss/breadcrumb"; -@import "~bootstrap/scss/pagination"; -@import "~bootstrap/scss/badge"; -// @import "~bootstrap/scss/jumbotron"; -@import "~bootstrap/scss/alert"; -// @import "~bootstrap/scss/progress"; -// @import "~bootstrap/scss/media"; -@import "~bootstrap/scss/list-group"; -@import "~bootstrap/scss/close"; -@import "~bootstrap/scss/modal"; -// @import "~bootstrap/scss/tooltip"; -@import "~bootstrap/scss/popover"; -// @import "~bootstrap/scss/carousel"; -@import "~bootstrap/scss/utilities"; - -@import "~bootstrap/scss/print"; - -@import '~font-awesome/scss/font-awesome'; \ No newline at end of file diff --git a/ui/src/theme/breadcrumb.scss b/ui/src/theme/breadcrumb.scss deleted file mode 100644 index 9482c7233..000000000 --- a/ui/src/theme/breadcrumb.scss +++ /dev/null @@ -1,13 +0,0 @@ -.breadcrumb-bar { - $default-color: $gray-700; - - padding: 0; - margin: 1rem 0; - background: none; - border-radius: 0; - padding: 0.375rem 0; - border-bottom: 1px solid $gray-600; - & > .breadcrumb-item.active { - color: $default-color; - } -} \ No newline at end of file diff --git a/ui/src/theme/buttons.scss b/ui/src/theme/buttons.scss deleted file mode 100644 index 0897adbbe..000000000 --- a/ui/src/theme/buttons.scss +++ /dev/null @@ -1,112 +0,0 @@ -@import './_palette'; -@import './_variables'; -@import '~bootstrap/scss/_mixins'; - -.btn.btn-text { - display: inline; - padding: 0px; - margin: 0px; - background: none; -} - -.btn.btn-link { - &:focus { - outline: 5px auto -webkit-focus-ring-color; - } -} - -.nav.nav-wizard { - .nav-item { - margin-right: $custom-control-spacer-x * 3; - - &:first-child .current { - margin-left: 34px; - } - - &:last-child { - margin-right: 0px; - margin-left: $custom-control-spacer-x * 2; - } - - .nav-link.btn { - @include button-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-sm, $line-height-lg, $btn-border-radius-lg); - white-space: normal; - height: 60px; - - &.previous { - $color: theme-color('secondary'); - @include button-variant($color, $color); - } - &.current { - $color: theme-color('primary'); - @include button-variant($color, $color, $color); - } - &.next { - $color: theme-color('success'); - @include button-variant($color, $color); - } - &.save { - $color: theme-color('info'); - @include button-variant($color, $color); - } - - & > .direction { - font-size: $font-size-xs; - } - - & > .label { - display: inline-block; - max-width: 160px; - text-align: left; - } - - &.next, &.save { - & > .direction { - border-left: 1px solid $white; - padding-left: $custom-control-spacer-x; - margin-left: $custom-control-spacer-x; - } - } - - &.previous { - & > .direction { - border-right: 1px solid $white; - padding-right: $custom-control-spacer-x; - margin-right: $custom-control-spacer-x; - } - } - } - } -} - -@media only screen and (max-width: 1024px) { - .nav.nav-wizard .nav-item { - &:not(:last-child) { - margin-right: $custom-control-spacer-x * 2; - } - &:last-child { - margin-left: $custom-control-spacer-x; - } - .nav-link.btn { - @include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-xs, $line-height-sm, $btn-border-radius-sm); - - &.next, &.save { - & > .direction { - padding-left: $custom-control-spacer-x / 2; - margin-left: $custom-control-spacer-x / 2; - } - } - - &.previous { - & > .direction { - padding-right: $custom-control-spacer-x / 2; - margin-right: $custom-control-spacer-x / 2; - } - } - - .label { - max-width: 130px; - } - } - } -} \ No newline at end of file diff --git a/ui/src/theme/forms.scss b/ui/src/theme/forms.scss deleted file mode 100644 index c41c9172a..000000000 --- a/ui/src/theme/forms.scss +++ /dev/null @@ -1,95 +0,0 @@ -@import './_palette'; -@import './_variables'; -@import './_mixins'; - - -/* -Json schema form -*/ - -.formHelp { - display: none; -} - -.form-control { - &.ng-invalid.ng-touched { - @include component-validation-state("valid", $form-feedback-valid-color); - } - &.ng-valid.ng-touched { - @include component-validation-state("valid", $form-feedback-valid-color); - } -} - -select.form-control:disabled { - color: #54595E; -} - -/* end json schema form */ - -.form-section { - padding-left: $grid-gutter-width; - padding-right: $grid-gutter-width; - - &:not(:first-child) { - border-left: 1px solid $hr-border-color; - } - - .btn-link { - &:focus { - outline: -webkit-focus-ring-color auto 5px; - } - } - - .form-check-label { - &:focus { - outline: -webkit-focus-ring-color auto 5px; - } - } -} - -.custom-control { - &.custom-control-reverse { - padding-right: 1.5em; - padding-left: 0; - - & > .custom-control-label { - position: static; - &::after, &::before { - right: 0px; - left: auto; - } - } - } -} - -.custom-file { - & > .custom-file-control { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } -} - -.component-control { - @include component-validation-state("valid", $form-feedback-valid-color); - @include component-validation-state("invalid", $form-feedback-invalid-color); -} - -.codearea { - white-space: pre-wrap; - resize: vertical; - font-family: monospace; - min-height: 166px; - margin-bottom: 0px; - word-break: break-word; - &[contenteditable] { - overflow-x: hidden; - overflow-y: scroll; - } -} - -@media only screen and (max-width: 1200px) { - .form-section:not(:first-child) { - border-left: 0px; - } -} diff --git a/ui/src/theme/list.scss b/ui/src/theme/list.scss deleted file mode 100644 index 5acc06806..000000000 --- a/ui/src/theme/list.scss +++ /dev/null @@ -1,24 +0,0 @@ -.list-group { - &.list-group-sm { - & > .list-group-item { - padding: 0rem 0.75rem; - } - } - - &.list-group-scroll { - overflow: scroll; - max-height: 48px * 5; - - & > .list-group-item { - min-height: 30px; - } - } -} - -.no-style { - list-style: none; - padding: 0px; - & > li { - padding: 0px; - } -} diff --git a/ui/src/theme/modal.scss b/ui/src/theme/modal.scss deleted file mode 100644 index f944e1925..000000000 --- a/ui/src/theme/modal.scss +++ /dev/null @@ -1,42 +0,0 @@ -.modal-footer { - justify-content: space-between; -} - -.modal.modal-xl { - max-width: 100% !important; - .modal-dialog { - width: 1200px; - max-width: 98%; - } -} - -delete-dialog { - .modal-body:before { - position: absolute; - font-family: 'FontAwesome'; - top: 0; - left: 10px; - content: "\f071"; - color: $red; - font-size: 3.5rem; - } - - .modal-body { - padding-left: 80px; - color: $red; - font-weight: 700; - } -} - -.popover.popover-lg { - width: auto; - max-width: none; -} - -.popover.popover-info { - $color: lighten($brand-info, 60%); - background: $color; - .arrow::after { - border-top-color: $color; - } -} \ No newline at end of file diff --git a/ui/src/theme/tags.scss b/ui/src/theme/tags.scss deleted file mode 100644 index 817fb34f1..000000000 --- a/ui/src/theme/tags.scss +++ /dev/null @@ -1,97 +0,0 @@ -@import './_palette'; -@import './_variables'; -@import '~bootstrap/scss/_mixins'; -@import '~bootstrap/scss/_utilities'; - -@mixin tag-variant($color) { - background-color: $color !important; - color: $white; - .index { - border-color: $color; - color: $color; - } - &::after { - border-left-color: $color; - } -} - -.tag { - $text-space: 8px; - $left-offset: 32px; - - font-size: $font-size-sm; - line-height: $line-height-lg; - position: relative; - padding: 0.5rem 0 0.5rem 1rem; - padding-left: 60px; - min-height: 58px; - display: inline-block; - // border-radius: $btn-border-radius-lg; - max-width: 220px; - color: theme-color('white'); - - &.tag-success { @include tag-variant(theme-color('success')); } - &.tag-primary { @include tag-variant(theme-color('primary')); } - - &:hover { - text-decoration: none; - } - - .index { - border-radius: 50%; - position: absolute; - width: 68px; - height: 68px; - background: $white; - color: theme-color('primary'); - left: -15px; - top: -5px; - border: 8px solid theme-color('primary'); - font-size: 36px; - display: block; - font-weight: bold; - text-align: center; - } - - &::after { - content:""; - position: absolute; - left: 100%; - top: 0; - width: 0; - height: 0; - border-top: 29px solid transparent; - border-left: 30px solid $white; - border-bottom: 29px solid transparent; - } - - &.tag-sm { - font-size: $font-size-xs; - padding: 0.25rem 0.5rem 0.25rem 40px; - - min-height: 44px; - display: inline-block; - max-width: 180px; - - .index { - width: 52px; - height: 52px; - left: -15px; - top: -5px; - font-size: 28px; - border-width: 5px; - } - &::after { - border-top-width: 22px; - border-left-width: 23px; - border-bottom-width: 22px; - } - } -} - -@media only screen and (max-width: 1024px) { - .tag { - font-size: $font-size-xs; - max-width: 200px; - } -} \ No newline at end of file diff --git a/ui/src/theme/typography.scss b/ui/src/theme/typography.scss deleted file mode 100644 index 76c9bc107..000000000 --- a/ui/src/theme/typography.scss +++ /dev/null @@ -1,9 +0,0 @@ -.subheading-1 { - font-size: 2.5rem; - font-weight: normal; - line-height: 1.2; -} - -.br-word { - word-break: break-word; -} diff --git a/ui/src/theme/utility.scss b/ui/src/theme/utility.scss deleted file mode 100644 index f3ff5e38b..000000000 --- a/ui/src/theme/utility.scss +++ /dev/null @@ -1,41 +0,0 @@ -.border-2 { - border-width: 2px !important; -} - -.bg-lighter { - background: #FAFAFA !important; -} - -.bg-primary-light { - background: lighten($brand-primary, 75%); -} - -.w-15 { - width: 15%; -} - -.w-40 { - width: 40%; -} - -.break-all { - word-break: break-all; -} - - -.bg-diff { - background: #FEE8E9; - position: relative; - border-color: #CCC !important; - &::before { - $size: 24px; - content: "\f06a"; - font-family: 'FontAwesome'; - text-align: center; - width: $size; - height: $size; - position: absolute; - left: -$size; - top: 0.5rem; - } -} \ No newline at end of file diff --git a/ui/src/tsconfig.app.json b/ui/src/tsconfig.app.json deleted file mode 100644 index 901ac783c..000000000 --- a/ui/src/tsconfig.app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "types": [] - }, - "files": [ - "main.ts", - "polyfills.ts" - ], - "include": [ - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/ui/src/tsconfig.spec.json b/ui/src/tsconfig.spec.json deleted file mode 100644 index fe8bdf70b..000000000 --- a/ui/src/tsconfig.spec.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "baseUrl": "./", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/ui/src/typings.d.ts b/ui/src/typings.d.ts deleted file mode 100644 index 5c408264a..000000000 --- a/ui/src/typings.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} - -declare module "*.json" { - const value: any; - export default value; -} \ No newline at end of file diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index 84c380f9f..000000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "module": "es2020", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "downlevelIteration": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] - } -} \ No newline at end of file diff --git a/ui/tslint.json b/ui/tslint.json deleted file mode 100644 index 09cb96eca..000000000 --- a/ui/tslint.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "eofline": true, - "forin": true, - "deprecation": { - "severity": "warning" - }, - "import-blacklist": [ - true - ], - "import-spacing": true, - "indent": [ - true, - "spaces", - 4 - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": false, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "typeof-compare": true, - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "", - "camelCase" - ], - "component-selector": [ - true, - "element", - "", - "kebab-case" - ], - "no-inputs-metadata-property": true, - "no-outputs-metadata-property": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-output-rename": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true, - "no-access-missing-member": true, - "templates-use-public": true, - "invoke-injectable": true - } -} \ No newline at end of file